1. 程式人生 > >新手入門tensorflow一個半月以來的學習歷程

新手入門tensorflow一個半月以來的學習歷程

時隔一個半月我的影象標註終於做完了

這裡我是使用的tensorflow來完成的,當然我所使用的只是最初級的技術。(我所寫的部落格主要是為了記錄自己成長的過程,並非教學意義)

這裡我使用的老師提供的資料集一共5000張照片,4500張訓練,500張測試。 5000張圖片共有260個物種,每張圖片有4個左右。

最後我所達到的效果

下面開始就是我完成這個專案所用到的專業內容,以及我所遇到的問題,如果有人看到這篇部落格發現我有錯誤,請向我指出,我一定會虛心接受並改正。

我所用到的神經網路是卷積神經網路,套用的是AlexNet模型,並且稍作修改。

首先,定義佔位符用來在後面傳引數(真實標籤)來計算loss

這裡寫圖片描述

然後是讀取圖片

我的圖片是按從0到4499的順序和0到499的順序將訓練集和測試集分開儲存的,這裡我使用glob.glob的方法從資料夾讀取所有的.jpeg的檔名,然後配合tf.read_file這個函式來將圖片讀入記憶體

讀入進來之後對圖片進行解碼,調整大小,reshape。

image_jpeg = tf.image.decode_jpeg(read_image, channels=3)     #進行JPEG解碼
image_cut = tf.image.resize_images(image_jpeg, (227, 227))    #將圖片扭曲至227*227
image_reshape = tf.reshape
(image_cut, [227, 227, 3]) #reshape

lables = list(map(lambda x: x.split(‘\’)[1].split(‘.’)[0], read_image_name))

使用這個方法來將圖片的名稱按照glob.glob的讀入順序裁剪下來,.順序大概是這樣.

這裡寫圖片描述

然後使用tf.train.slice_input_producer,配合 tf.train.batch,將讀入進來的圖片和標籤按照對應的順序生成佇列(這裡shuffle=False為了讓他不亂序,否則我沒辦法將他的標籤和圖片對應上…不過這樣做會發生過擬合…但是沒辦法…)

image_que = tf.train.slice_input_producer([read_image_name, lables], shuffle=False)

接下來是定義AlexNet網路所用到的卷積層,池華層,權重,偏置和全連線層的函式,這個函式的定義跟AlexNet原網路基本一致。

接著是定義loss和train

因為我的標籤是獨立但不互斥的,也就是多目標問題。
所以我使用的計算loss的方法是

tf.nn.sigmoid_cross_entropy_with_logits()


使用的優化器是 tf.train.AdagradOptimizer

tf.train.AdagradOptimizer(learning_rate).minimize(loss)


之後便是開始訓練的過程了。

我一個半月以來所遇到的兩個記憶猶新的問題以及解決辦法:

一.問題:

1.圖片和標籤對應不上。 2.loss不下降

二.解決辦法:

1.圖片和標籤對應不上。 我曾以為glob.glob讀入圖片的順序是按照從0到4499的順序讀入進來,直到有一天我print了一下讀入結果。 這裡我選擇的方法是將圖片讀入進來之後將圖片的名稱裁剪下來,然後自己定義函式從匯入的存放圖片標籤的矩陣按照檔名取出對應的圖片標籤。

def batch(X, lables, k):
    a = [None]*100
    c = k - 1
    c = c * 100
    d = 0
    for j in range(c, c + 100):
        b = lables[j]                 #從lables中取出第j個讀入的圖片的名字
        b = int(b)                   #將他轉化成int型別
        a[d] = X[b]                  #從x(x中存放的是真實標籤列表(4500*260))中取出第j行賦值給a
        d += 1
    yield a

2.loss不下降。

我曾試過改學習率,修改bitch_size,還有人說調整圖片大小我也試過了… 但是結果並沒有用。 最後的解決辦法是

在全連線的結果通過啟用函式之前,加上一個BN層。

layer = tf.layers.batch_normalization(fc1_out, training=True)

然後再將BN層的結果通過啟用函式,就可以使loss繼續下降了。(但是我之前沒加BN層時候我的loss會從0.698左右開始下降,下降到0.693左右不變,但是加入BN層之後,loss從0.76開始下降。)