我想爲自定義數據集製作一個卷積神經網絡。分類器只有兩個類。我能夠正確讀取輸入圖像,併爲它們分配了兩個相應類的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)
謝謝!首先,是的,我想知道不使用softmax圖層的數學原理。第二,我沒有使用feed_dict,因爲我的輸入只有一個批次,它們是張量,而不是numpy數組。第三,是的,我嘗試了很多配置,但是很安心。無論如何,網絡都拒絕學習。我相信這是一個編碼缺陷。第四,我嘗試沒有任何輟學,但沒有什麼讓我的安慰。第五,我也已經初始化了重量,所以沒有死神經元。 – Tanvir
我編輯了這個問題,讓你更好地瞭解問題。再次感謝! – Tanvir
哪裏,甚至更重要你如何初始化你的體重? – daniel451