深度學習tensorflow實戰筆記(1)全連接神經網絡(FCN)訓練自己的數據(從txt文件中讀取)


1、准備數據

 把數據放進txt文件中(數據量大的話,就寫一段程序自己把數據自動的寫入txt文件中,任何語言都能實現),數據之間用逗號隔開,最后一列標注數據的標簽(用於分類),比如0,1。每一行表示一個訓練樣本。如下圖所示。

 

 其中前三列表示數據(特征),最后一列表示數據(特征)的標簽。注意:標簽需要從0開始編碼!

2、實現全連接網絡

 這個過程我就不多說了,如何非常簡單,就是普通的代碼實現,本篇博客的重點在於使用自己的數據,有些需要注意的地方我在后面會做注釋。直接上代碼

 1 #隱含層參數設置
 2 in_units=3  #輸入神經元個數
 3 h1_units=5  #隱含層輸出神經元個數
 4  
 5 #第二個隱含層神經元個數
 6 h2_units=6
 7  
 8  
 9 W1=tf.Variable(tf.truncated_normal([in_units,h1_units],stddev=0.1)) #隱含層權重,W初始化為截斷正態分布
10 b1=tf.Variable(tf.zeros([h1_units]))  #隱含層偏執設置為0
11 W2=tf.Variable(tf.truncated_normal([h1_units,h2_units],stddev=0.1)) #第二個隱含層權重,W初始化為截斷正態分布
12 b2=tf.Variable(tf.zeros([h2_units]))  #第二個隱含層偏執設置為0
13  
14 W3=tf.Variable(tf.zeros([h2_units,2])) #輸出層權重和偏執都設置為0
15 b3=tf.Variable(tf.zeros([2]))
16  
17 #定義輸入變量x和dropout比率
18 x=tf.placeholder(tf.float32,[None,3]) #列是
19 keep_prob=tf.placeholder(tf.float32)
20  
21 #定義一個隱含層
22 hidden1=tf.nn.relu(tf.matmul(x,W1)+b1)
23 hidden1_drop=tf.nn.dropout(hidden1,keep_prob)
24  
25 #定義第二個隱藏層
26 hidden2=tf.nn.relu(tf.matmul(hidden1_drop,W2)+b2)
27 hidden2_drop=tf.nn.dropout(hidden2,keep_prob)

需要注意的地方

in_units=3  #輸入神經元個數,和特征的維度對應起來

 

x=tf.placeholder(tf.float32,[None,3]) #和特征的維度對應起來

3、實現損失函數

      標准的softmax和交叉熵,不多說了。    

1 y=tf.nn.softmax(tf.matmul(hidden2_drop,W3)+b3)
2  
3 #定義損失函數和選擇優化器
4 y_=tf.placeholder(tf.float32,[None,2])  #列是2,表示兩類,行表示輸入的訓練樣本個數,None表示不定
5  
6 corss_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))
7 train_step=tf.train.AdagradOptimizer(0.3).minimize(corss_entropy)

 需要注意的地方:

y_=tf.placeholder(tf.float32,[None,2])  #有幾類就寫幾,我寫的是兩類,所以就是2

4、從txt中讀取數據,並做處理

    重點來了,首先從txt中把數據讀取出來,然后對標簽進行獨熱編碼,什么是獨熱編碼?索引表示類別,是哪個類別這一維就是非零(用1)。代碼實現:

 1 data=np.loadtxt('txt.txt',dtype='float',delimiter=',')
 2  
 3 #將樣本標簽轉換成獨熱編碼
 4 def label_change(before_label):
 5     label_num=len(before_label)
 6     change_arr=np.zeros((label_num,2))  #2表示有兩類
 7     for i in range(label_num):
 8         #該樣本標簽數據要求從0開始
 9             change_arr[i,int(before_label[i])]=1
10     return change_arr
11  
12 #用於提取數據
13 def train(data):
14     data_train_x=data[:7,:3]   #取前幾行作為訓練數據,7表示前7行,3表示取前三列,排除數據標簽
15     data_train_y=label_change(data[:7,-1])
16     return data_train_x,data_train_y
17  
18  
19 data_train_x,data_train_y=train(data)

需要注意的地方在代碼中我都做了注釋,不再贅述。

5、開始訓練和測試

訓練部分

 1 for i in range(5):  #迭代,取batch進行訓練
 2    img_batch, label_batch = tf.train.shuffle_batch([data_train_x, data_train_y],   #隨機取樣本
 3                                                     batch_size=2,
 4                                                     num_threads=2,
 5                                                     capacity=7,
 6                                                     min_after_dequeue=2,
 7                                                     enqueue_many=True)
 8    coord = tf.train.Coordinator()  
 9    threads = tf.train.start_queue_runners(coord=coord, sess=sess) 
10  
11  
12    img_batch,label_batch=sess.run([img_batch,label_batch])
13  
14    train_step.run({x:img_batch,y_:label_batch,keep_prob:0.75}    
1 #預測部分
2 correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
3 accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
4 print(accuracy.eval({x:data_train_x,y_:data_train_y,keep_prob:1.0}))   

這樣就全部流程完成。其中網絡結構可以做相應的修改,核心在於如何從txt中讀取自己的數據輸入到全連接神經網絡(多層感知機)中進行訓練和測試。

當然,也可以在定義變量的時候直接輸入,不用從txt中讀取。即:

1 image=[[1.0,2.0,3.0],[9,8,5],[9,5,6],[7,5,3],[6,12,7],[8,3,6],[2,8,71]]  
2 label=[[0,1],[1,0],[1,0],[1,0],[1,0],[0,1],[0,1]]        
3 image_test=[[9,9,9]]     
4 label_test=[[0,1]] 

直接定於數據的話,適合小數據量的情況,大數據量的情況並不適用。

  好了,本篇博客介紹到此結束。下一篇介紹如何處理圖像數據。

以上便是本章分享內容,有問題,可以進群871458817交流在群內下載資料學習。最后,感謝觀看!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM