簡體   English   中英

批量培訓但是在Tensorflow中測試單個數據項?

[英]Training in batches but testing individual data item in Tensorflow?

我已經訓練了一個批量大小為10的卷積神經網絡。但是在測試時,我想分別預測每個數據集的分類而不是分批預測,這給出了錯誤:

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)

絕對。 占位符是“桶”,可以從輸入中獲取數據。 他們唯一要做的就是將數據直接導入模型。 它們可以像使用None技巧一樣充當“無限桶” - 您可以根據需要將盡可能多(或少量)的數據放入其中(顯然取決於可用資源)。

在培訓中,嘗試使用None替換batch_size for Training占位符:

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

然后像以前一樣定義你擁有的其他一切。

然后做一些訓練操作,例如:

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

要進行測試,請重復使用這些相同的占位符( XY ),並且不要重新定義其他變量。

對於單個Tensorflow圖定義,所有Tensorflow變量都是靜態的。 如果要恢復模型,則占位符在訓練時仍然存在。 與其他變量一樣,例如wblogitsentropyoptimizer

然后做一些測試操作,例如:

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

定義占位符時,請使用:

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個或其他批次)。

暫無
暫無

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

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