最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用TensorFlow實(shí)現(xiàn)二分類的方法示例

 更新時(shí)間:2019年02月05日 09:47:02   作者:修煉之路  
這篇文章主要介紹了使用TensorFlow實(shí)現(xiàn)二分類的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

使用TensorFlow構(gòu)建一個神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)二分類,主要包括輸入數(shù)據(jù)格式、隱藏層數(shù)的定義、損失函數(shù)的選擇、優(yōu)化函數(shù)的選擇、輸出層。下面通過numpy來隨機(jī)生成一組數(shù)據(jù),通過定義一種正負(fù)樣本的區(qū)別,通過TensorFlow來構(gòu)造一個神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)二分類。

一、神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)

輸入數(shù)據(jù):定義輸入一個二維數(shù)組(x1,x2),數(shù)據(jù)通過numpy來隨機(jī)產(chǎn)生,將輸出定義為0或1,如果x1+x2<1,則y為1,否則y為0。

隱藏層:定義兩層隱藏層,隱藏層的參數(shù)為(2,3),兩行三列的矩陣,輸入數(shù)據(jù)通過隱藏層之后,輸出的數(shù)據(jù)為(1,3),t通過矩陣之間的乘法運(yùn)算可以獲得輸出數(shù)據(jù)。

損失函數(shù):使用交叉熵作為神經(jīng)網(wǎng)絡(luò)的損失函數(shù),常用的損失函數(shù)還有平方差。

優(yōu)化函數(shù):通過優(yōu)化函數(shù)來使得損失函數(shù)最小化,這里采用的是Adadelta算法進(jìn)行優(yōu)化,常用的還有梯度下降算法。

輸出數(shù)據(jù):將隱藏層的輸出數(shù)據(jù)通過(3,1)的參數(shù),輸出一個一維向量,值的大小為0或1。

二、TensorFlow代碼的實(shí)現(xiàn)

import tensorflow as tf
from numpy.random import RandomState
 
if __name__ == "__main__":
  #定義每次訓(xùn)練數(shù)據(jù)batch的大小為8,防止內(nèi)存溢出
  batch_size = 8
  #定義神經(jīng)網(wǎng)絡(luò)的參數(shù)
  w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
  w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
  #定義輸入和輸出
  x = tf.placeholder(tf.float32,shape=(None,2),name="x-input")
  y_ = tf.placeholder(tf.float32,shape=(None,1),name="y-input")
  #定義神經(jīng)網(wǎng)絡(luò)的前向傳播過程
  a = tf.matmul(x,w1)
  y = tf.matmul(a,w2)
  #定義損失函數(shù)和反向傳播算法
  #使用交叉熵作為損失函數(shù)
  #tf.clip_by_value(t, clip_value_min, clip_value_max,name=None)
  #基于min和max對張量t進(jìn)行截?cái)嗖僮鳎瑸榱藨?yīng)對梯度爆發(fā)或者梯度消失的情況
  cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)))
  # 使用Adadelta算法作為優(yōu)化函數(shù),來保證預(yù)測值與實(shí)際值之間交叉熵最小
  train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
  #通過隨機(jī)函數(shù)生成一個模擬數(shù)據(jù)集
  rdm = RandomState(1)
  # 定義數(shù)據(jù)集的大小
  dataset_size = 128
  # 模擬輸入是一個二維數(shù)組
  X = rdm.rand(dataset_size,2)
  #定義輸出值,將x1+x2 < 1的輸入數(shù)據(jù)定義為正樣本
  Y = [[int(x1+x2 < 1)] for (x1,x2) in X]
  #創(chuàng)建會話運(yùn)行TensorFlow程序
  with tf.Session() as sess:
    #初始化變量 tf.initialize_all_variables()
    init = tf.initialize_all_variables()
    sess.run(init)
    #設(shè)置神經(jīng)網(wǎng)絡(luò)的迭代次數(shù)
    steps = 5000
    for i in range(steps):
      #每次選取batch_size個樣本進(jìn)行訓(xùn)練
      start = (i * batch_size) % dataset_size
      end = min(start + batch_size,dataset_size)
      #通過選取樣本訓(xùn)練神經(jīng)網(wǎng)絡(luò)并更新參數(shù)
      sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
      #每迭代1000次輸出一次日志信息
      if i % 1000 == 0 :
        # 計(jì)算所有數(shù)據(jù)的交叉熵
        total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
        # 輸出交叉熵之和
        print("After %d training step(s),cross entropy on all data is %g"%(i,total_cross_entropy))
    #輸出參數(shù)w1
    print(w1.eval(session=sess))
    #輸出參數(shù)w2
    print(w2.eval(session=sess))
    '''
    After 0 training step(s),cross entropy on all data is 0.0674925
    After 1000 training step(s),cross entropy on all data is 0.0163385
    After 2000 training step(s),cross entropy on all data is 0.00907547
    After 3000 training step(s),cross entropy on all data is 0.00714436
    After 4000 training step(s),cross entropy on all data is 0.00578471
    [[-1.96182752 2.58235407 1.68203771]
     [-3.46817183 1.06982315 2.11788988]]
    [[-1.82471502]
     [ 2.68546653]
     [ 1.41819501]]
    '''

上面的TensorFlow二分類我是參考Google深度學(xué)習(xí)框架,al_kk評論說這個損失函數(shù)的定義存在問題,之前沒有仔細(xì)的去考慮這個問題,al_kk提醒之后,我發(fā)現(xiàn)這個損失函數(shù)的定義的確存在問題,經(jīng)過測試發(fā)現(xiàn)這個模型也存在一些問題。其實(shí),我們的主要目的是想去學(xué)習(xí)一個x1+x2=1的直線,來區(qū)分0和1兩類不同的類別,下面我對這個模型進(jìn)行了一些修改并說明一下為什么這個損失函數(shù)的定義存在問題。

一、為什么說這個損失函數(shù)的定義存在問題呢?

上面程序中定義的輸入的y的shape為[1],也就是y的類別為0或1,對于單分類問題交叉熵?fù)p失函數(shù)的定義應(yīng)該為

其中n為y的種類,在上面的例子中需要包含0和1的y_*log(y)(y_表示真實(shí)類別,y表示預(yù)測類別),而上面的例子中只包含了一個y_*log(y),在上例中正確的損失函數(shù)定義應(yīng)該為loss = y_*log(y) + (1-y_) * log(1-y)。為了便于大家理解,我引用al_kk:“如果只有一個類別的交叉熵即y_ * log(y),如果真實(shí)類別y_為0,那么無論預(yù)測值y為任何值的時(shí)候,損失函數(shù)始終為0”。除此之外,大家可以想一下,當(dāng)預(yù)測值始終為1的時(shí)候,那么損失函數(shù)是不是就會一直為0,這也是為什么輸出預(yù)測值y的時(shí)候,y的值都是大于1的。如果將y的shape改為[2]的話,就可以使用y_*log(y)。

二、修改之后的二分類程序

import tensorflow as tf
import numpy as np
from numpy.random import RandomState
import matplotlib.pyplot as plt
 
if __name__ == "__main__":
  #定義神經(jīng)網(wǎng)絡(luò)的參數(shù)
  w = tf.Variable(tf.random_normal([2,1],stddev=1,seed=1))
  b = tf.Variable(tf.random_normal([1],stddev=1,seed=1))
  #定義輸入和輸出
  x = tf.placeholder(tf.float32,shape=(None,2),name="x-input")
  y_ = tf.placeholder(tf.float32,shape=(None,1),name="y-input")
  #定義神經(jīng)網(wǎng)絡(luò)的前向傳播過程
  y = tf.nn.sigmoid(tf.matmul(x,w) + b)
  #基于min和max對張量t進(jìn)行截?cái)嗖僮?,為了?yīng)對梯度爆發(fā)或者梯度消失的情況
  cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0))+(1-y_) * tf.log(tf.clip_by_value(1-y,1e-10,1.0)))
  # 使用Adadelta算法作為優(yōu)化函數(shù),來保證預(yù)測值與實(shí)際值之間交叉熵最小
  train_step = tf.train.AdamOptimizer(0.01).minimize(cross_entropy)
  #通過隨機(jī)函數(shù)生成一個模擬數(shù)據(jù)集
  rdm = RandomState(1)
  # 定義數(shù)據(jù)集的大小
  dataset_size = 100
  # 模擬輸入是一個二維數(shù)組
  X = rdm.rand(dataset_size,2)
  #定義輸出值,將x1+x2 < 1的輸入數(shù)據(jù)定義為正樣本
  Y = [[int(x1+x2 < 1)] for (x1,x2) in X]
  #創(chuàng)建會話運(yùn)行TensorFlow程序
  with tf.Session() as sess:
    #初始化變量 tf.initialize_all_variables()
    init = tf.initialize_all_variables()
    sess.run(init)
    #設(shè)置神經(jīng)網(wǎng)絡(luò)的迭代次數(shù)
    steps = 500
    for i in range(steps):
      #通過選取樣本訓(xùn)練神經(jīng)網(wǎng)絡(luò)并更新參數(shù)
      for (input_x,input_y) in zip(X,Y):
        input_x = np.reshape(input_x,(1,2))
        input_y = np.reshape(input_y,(1,1))
        sess.run(train_step,feed_dict={x:input_x,y_:input_y})
      #每迭代1000次輸出一次日志信息
      if i % 100 == 0:
        # 計(jì)算所有數(shù)據(jù)的交叉熵
        total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
        # 輸出交叉熵之和
        print("After %d training step(s),cross entropy on all data is %g"%(i,total_cross_entropy))
    #預(yù)測輸入X的類別
    pred_Y = sess.run(y,feed_dict={x:X})
    index = 1
    for pred,real in zip(pred_Y,Y):
      print(pred,real)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù)

    Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù)

    本文分享的是Python技巧匿名函數(shù)、回調(diào)函數(shù)和高階函數(shù),我們在Python中使用lambda表達(dá)式來使用匿名函數(shù),回調(diào)函數(shù)即callback,先寫一個函數(shù),讓預(yù)先寫好的系統(tǒng)來調(diào)用,一個函數(shù)可以作為參數(shù)傳給另外一個函數(shù),或者一個函數(shù)的返回值為另外一個函數(shù),滿足其一則為高階函數(shù)
    2021-12-12
  • django基于cors解決跨域請求問題詳解

    django基于cors解決跨域請求問題詳解

    這篇文章主要介紹了django基于cors解決跨域請求問題詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 關(guān)于pyqtSignal的基本使用

    關(guān)于pyqtSignal的基本使用

    這篇文章主要介紹了關(guān)于pyqtSignal的基本使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • python3 requests 各種發(fā)送方式詳解

    python3 requests 各種發(fā)送方式詳解

    這篇文章主要介紹了python3 requests 各種發(fā)送方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • pyinstaller打包成無控制臺程序時(shí)運(yùn)行出錯(與popen沖突的解決方法)

    pyinstaller打包成無控制臺程序時(shí)運(yùn)行出錯(與popen沖突的解決方法)

    這篇文章主要介紹了pyinstaller打包成無控制臺程序時(shí)運(yùn)行出錯(與popen沖突的解決方法),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 在macOS上搭建python環(huán)境的實(shí)現(xiàn)方法

    在macOS上搭建python環(huán)境的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇在macOS上搭建python環(huán)境的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python中os模塊功能與用法詳解

    Python中os模塊功能與用法詳解

    這篇文章主要介紹了Python中os模塊功能與用法,總結(jié)分析了Python os模塊基本功能、內(nèi)置函數(shù)、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • Pytorch之Variable的用法

    Pytorch之Variable的用法

    今天小編就為大家分享一篇Pytorch之Variable的用法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中的__new__與__init__魔術(shù)方法理解筆記

    Python中的__new__與__init__魔術(shù)方法理解筆記

    這篇文章主要介紹了Python中的__new__與__init__魔術(shù)方法理解筆記,需要的朋友可以參考下
    2014-11-11
  • 通過C++學(xué)習(xí)Python

    通過C++學(xué)習(xí)Python

    這篇文章主要介紹了通過C++學(xué)習(xí)Python,通過對比分析,讓我們能夠更好的學(xué)習(xí)python.
    2015-01-01

最新評論

福州市| 马关县| 漯河市| 衡山县| 平定县| 南漳县| 会同县| 扶风县| 沧州市| 宝兴县| 贡觉县| 肥城市| 壶关县| 鹤庆县| 宁陕县| 峡江县| 东乌珠穆沁旗| 色达县| 福清市| 灵山县| 杭锦旗| 海伦市| 南乐县| 吴忠市| 新宁县| 晴隆县| 左权县| 芜湖市| 荆门市| 阿拉善盟| 沅陵县| 安庆市| 土默特左旗| 依兰县| 柳河县| 汉中市| 桐梓县| 周口市| 成武县| 太仆寺旗| 都匀市|