[英]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})
要進行測試,請重復使用這些相同的占位符( X
, Y
),並且不要重新定義其他變量。
對於單個Tensorflow圖定義,所有Tensorflow變量都是靜態的。 如果要恢復模型,則占位符在訓練時仍然存在。 與其他變量一樣,例如w
, b
, logits
, entropy
和optimizer
。
然后做一些測試操作,例如:
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.