1

我想爲自定義數據集製作一個卷積神經網絡。分類器只有兩個類。我能夠正確讀取輸入圖像,併爲它們分配了兩個相應類的batch_labels。該代碼無誤地執行,但輸出異常。 由於某些原因,精度始終爲50%。Tensorflow - 具有自定義數據集的卷積神經網絡不知道

image=inputs() 

image_batch=tf.train.batch([image],batch_size=150) 
label_batch_pos=tf.train.batch([tf.constant([0,1])],batch_size=75) # label_batch for first class 
label_batch_neg=tf.train.batch([tf.constant([1,0])],batch_size=75) # label_batch for second class 
label_batch=tf.concat(0,[label_batch_pos,label_batch_neg]) 

W_conv1 = weight_variable([5, 5, 3, 32]) 
b_conv1 = bias_variable([32]) 

image_4d = tf.reshape(image, [-1,32,32,3]) 

h_conv1 = tf.nn.relu(conv2d(image_4d, W_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 

W_conv2 = weight_variable([5, 5, 32, 64]) 
b_conv2 = bias_variable([64]) 

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 

W_fc1 = weight_variable([8 * 8 * 64, 1024]) 
b_fc1 = bias_variable([1024]) 

h_pool2_flat = tf.reshape(h_pool2, [-1, 8*8*64]) 
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 
h_fc1_drop = tf.nn.dropout(h_fc1, 0.5) 

W_fc2 = weight_variable([1024, 2]) 
b_fc2 = bias_variable([2]) 

y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) 
cross_entropy = -tf.reduce_sum(tf.cast(label_batch,tf.float32)*tf.log(y_conv+1e-9)) 
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 

init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 


tf.train.start_queue_runners(sess=sess) 
correct_prediction=tf.equal(tf.argmax(y_conv,1), tf.argmax(label_batch,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

for i in range(100): 
train_step.run(session=sess) 
print(sess.run(accuracy)) 

print(sess.run(correct_prediction)) 

當我打印correct_prediction張,我得到下面的輸出不管是什麼。

[ True True True True True True True True True True True True 
    True True True True True True True True True True True True 
    True True True True True True True True True True True True 
    True True True True True True True True True True True True 
    True True True True True True True True True True True True 
    True True True True True True True True True True True True 
    True True True False False False False False False False False False 
False False False False False False False False False False False False 
False False False False False False False False False False False False 
False False False False False False False False False False False False 
False False False False False False False False False False False False 
False False False False False False False False False False False False 
False False False False False False] 

準確度始終爲0.5,就好像權重沒有被更新一樣。當我在每個訓練步驟後打印權重時,它們保持不變。我想我有一些編碼錯誤。難道網絡一次又一次地在相同的圖像上進行訓練?但即便如此,權重必須更新。我有150個訓練樣例,每個類有75個訓練樣例。 有人能請我指出正確的方向嗎?

編輯: 這是我如何初始化權

def weight_variable(shape,name): 
    initial = tf.truncated_normal(shape, stddev=0.5) 
    return tf.Variable(initial,name=name) 

def bias_variable(shape,name): 
    initial = tf.constant(1.0, shape=shape) 
    return tf.Variable(initial,name=name) 

回答

3

你的網絡有一些設計上的缺陷。由於數學問題,自己計算交叉熵並在輸出層上應用softmax並不是一個好主意。如果你對數學感興趣,我可以補充一下,如果不是堅持Tensorflow的解釋和方法:tf.nn.softmax_cross_entropy_with_logits

你已經嘗試過很多不同的配置嗎?根據圖像的複雜程度,更高或更低的內核大小以及特徵圖的數量可能是一個好主意。一般來說,如果您的圖像相對均勻,則會添加許多相當類似的信息,因此如果您有許多功能圖,則網絡難以收斂。既然你只有兩個輸出神經元,我認爲圖像不是很複雜?

接下來就是你的輟學。您總是使用0.5的退出,但通常情況下,對於測試/驗證(如準確度預測),您不使用退出。在大多數情況下,您只能將其用於培訓。您可以創建一個指定您的退出率的佔位符,並提供此sess.run

下面是我自己的一些例子:

h_fc_drop = tf.nn.dropout(h_fc, keep_prob) 

(...) 

accu, top1, top3, top5 = sess.run([accuracy, te_top1, te_top3, te_top5], 
          feed_dict={ 
           x: teX[i: i + batch_size], 
           y: teY[i: i + batch_size] 
           keep_prob: 1.0 
          } 
         ) 

這讓Tensorflow計算我的方程accuracytopX錯誤率,而我在測試數據輸入teX飼料和真實的標籤teY的輸出,退出的保留概率爲keep_prob爲1.0。

儘管如此,權重的初始化在深度神經網絡中確實非常重要。即使您的設計足以解決您的問題(也需要調查),如果您的權重未正確初始化,您的網絡可能會拒絕學習,分歧或收斂到0。你沒有添加細節到你的初始化,所以你可能想查找Xavier初始化。對於Xavier初始化來說,This是一個簡單的開始。

最終我可以鼓勵你繪製一些權重,功能地圖,輸出隨着時間的推移等等,以瞭解你的網絡正在做什麼。通常這會有很大幫助。

+0

謝謝!首先,是的,我想知道不使用softmax圖層的數學原理。第二,我沒有使用feed_dict,因爲我的輸入只有一個批次,它們是張量,而不是numpy數組。第三,是的,我嘗試了很多配置,但是很安心。無論如何,網絡都拒絕學習。我相信這是一個編碼缺陷。第四,我嘗試沒有任何輟學,但沒有什麼讓我的安慰。第五,我也已經初始化了重量,所以沒有死神經元。 – Tanvir

+0

我編輯了這個問題,讓你更好地瞭解問題。再次感謝! – Tanvir

+0

哪裏,甚至更重要你如何初始化你的體重? – daniel451