3

我已經訓練與10 批量大小的卷積神經網絡然而,當測試,我想單獨和無法預知每個數據集的分類分批,這給了錯誤:批量訓練但在Tensorflow中測試單個數據項目?

Assign requires shapes of both tensors to match. lhs shape= [1,3] rhs shape= [10,3] 

我理解是指10到batch_size,3是我分類的類的數量。

我們不能使用批次進行培訓並單獨進行測試嗎?

更新:

訓練階段:

batch_size=10 
classes=3 
#vlimit is some constant : same for training and testing phase 
X = tf.placeholder(tf.float32, [batch_size,vlimit ], name='X_placeholder') 
Y = tf.placeholder(tf.int32, [batch_size, classes], name='Y_placeholder') 
w = tf.Variable(tf.random_normal(shape=[vlimit, classes], stddev=0.01), name='weights') 
b = tf.Variable(tf.ones([batch_size,classes]), name="bias") 
logits = tf.matmul(X, w) + b 
entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y, name='loss') 
loss = tf.reduce_mean(entropy) 
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss) 

測試階段:

batch_size=1 
classes=3 
X = tf.placeholder(tf.float32, [batch_size,vlimit ], name='X_placeholder') 
Y = tf.placeholder(tf.int32, [batch_size, classes], name='Y_placeholder') 
w = tf.Variable(tf.random_normal(shape=[vlimit, classes], stddev=0.01), name='weights') 
b = tf.Variable(tf.ones([batch_size,classes]), name="bias") 
logits = tf.matmul(X, w) + b 
entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y, name='loss') 
loss = tf.reduce_mean(entropy) 
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss) 
+1

我相信這應該是可能的。您可以添加示例代碼來顯示您已定義的佔位符(lhs,rhs)或變量等嗎? – dijksterhuis

+1

更新了問題! – user5722540

+0

兩個階段是否是同一個Tensorflow圖的一部分? – dijksterhuis

回答

3

當你定義的佔位符,使用:

X = tf.placeholder(tf.float32, [None, vlimit ], name='X_placeholder') 
Y = tf.placeholder(tf.int32, [None, classes], name='Y_placeholder') 
... 

而不是你的訓練和測試階段(實際上,你不需要在測試階段重新定義這些)。還要定義您的偏見:

b = tf.Variable(tf.ones([classes]), name="bias") 

否則你在你的批次,這是不是你想要什麼樣的培訓對每個樣品獨立的偏置。

TensorFlow應該自動沿輸入的第一個維度展開,並認識到作爲批量大小,因此爲了訓練,您可以將其批量供給10個,並且對於測試,您可以爲其提供單個樣品(或批次爲100或任何其他樣品)。

3

絕對如此。佔位符是從輸入中獲取數據的「桶」。他們所做的唯一事情就是將數據直接導入你的模型。他們可以像使用None技巧的「無限桶」一樣行事 - 您可以根據需要(儘可能取決於可用資源)將盡可能多的(或儘可能少的)數據放入其中。

在訓練中,嘗試用None更換batch_size的培訓佔位符:

X = tf.placeholder(tf.float32, [None, vlimit ], name='X_placeholder') 
Y = tf.placeholder(tf.int32, [None, classes], name='Y_placeholder') 

然後定義一切有了與以前。

然後做一些培訓OPS,例如:

_, Tr_loss, Tr_acc = sess.run([optimizer, loss, accuracy], feed_dict{x: btc_x, y: btc_y}) 

爲了進行測試,再利用這些相同的佔位符(XY),不要打擾重新定義其他變量。

對於單個Tensorflow圖形定義,所有Tensorflow變量都是靜態的。如果你正在恢復模型,那麼佔位符在訓練時仍然存在。其他變量如w,b,logits,entropy & optimizer

然後做一些測試的運算,例如:

Ts_loss, Ts_acc = sess.run([loss, accuracy], feed_dict{ x: test_x , y: test_y }) 
相關問題