[英]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計算我的方程式的accuracy
和topX
錯誤率,同時我輸入測試數據輸入teX
和輸出的真實標簽teY
,保持概率keep_prob
為1.0用於丟失。
盡管如此,權重的初始化在深度神經網絡中非常重要。 即使您的設計足以解決您的問題(這也需要進行調查),如果您的權重未正確初始化,您的網絡可能會拒絕學習,分歧或收斂到0。 您沒有向初始化添加詳細信息,因此您可能希望查找Xavier初始化 。 這是Xavier初始化的一個簡單的開始。
最后,我可以鼓勵您繪制一些權重,功能圖,隨時間變化的輸出等,以了解您的網絡正在做什么。 通常這會有很大幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.