簡體   English   中英

Tensorflow - 具有自定義數據集的Convolutonal神經網絡不會學習

[英]Tensorflow - Convolutonal neural network with custom data set DOES NOT LEARN

我正在嘗試為自定義數據集創建卷積神經網絡。 分類器只有兩個類。 我能夠正確讀取輸入圖像,並為兩個相應的類分配了batch_labels。 代碼執行沒有錯誤,但輸出是異常的。 出於某種原因,准確度始終為50%。

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張量時, 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)

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

你有沒有嘗試過很多不同的配置? 根據圖像的復雜程度,更高或更低的內核大小和特征映射的數量可能是個好主意。 通常,如果您的圖像相對同質,則會添加許多相當類似的信息,因此如果您有許多要素圖,則網絡難以收斂。 既然你只有兩個輸出神經元我假設圖像不是很復雜?

接下來就是你的輟學生。 您總是使用0.5的丟失,但通常,對於測試/驗證(如您的准確度預測),您不使用dropout。 在大多數情況下,您只能將其用於培訓。 您可以創建一個占位符來指定您的輟學率並提供此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初始化的一個簡單的開始。

最后,我可以鼓勵您繪制一些權重,功能圖,隨時間變化的輸出等,以了解您的網絡正在做什么。 通常這會有很大幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM