2017-01-14 75 views
0

改變輸出/班的數量這是我簡單的迴歸有兩個特徵和兩個類:在tensorflow

tf.reset_default_graph() 
x = tf.placeholder(tf.float32, (None, 2)) 
y = tf.placeholder(tf.int32, (None,)) 
w = tf.Variable(tf.truncated_normal(shape=(2, 2))) 
p = tf.matmul(x, w) 
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(p, y)) 
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss) 

一切正常在這一點上的預期。

現在,我的目標是修改培訓步驟之間的輸出/類的數量。 似乎有修改權重的形狀的方式:

n_more = tf.placeholder(tf.int32,()) 
w_more = tf.truncated_normal((2, n_more)) 
new_w = tf.concat(concat_dim=1, values=[w, w_more]) 
change_w_op = tf.assign(w, new_w, validate_shape=False) 

這也適用。我可以運行sess.run(change_w_op, feed_dict={n_more: 2})添加兩個課程,然後繼續運行train_op

的問題開始,如果我想補充的偏項:如果我運行train_op增加更多的班前

b = tf.Variable(tf.zeros(shape=(1, 2))) 
p = tf.matmul(x, w) + b 

# also for adding more 
b_more = tf.zeros(shape=(1, n_more)) 
new_b = tf.concat(concat_dim=1, values=[b, b_more]) 
change_b_op = tf.assign(b, new_b, validate_shape=False) 

- 它的工作原理。 如果我運行更改操作 - sess.run([change_w_op, change_b_op], feed_dict={n_more: 2})他們也工作正常,檢查w和b單獨顯示他們增加了大小。更重要的是,運行sess.run([p, loss], feed_dict={x: ..., y: ...})也可以工作並返回更多類別的預測。

唯一不起作用的是train_op

它給出該錯誤(3中的形狀對應於在通過x和y值的示例的數量):

.... 
InvalidArgumentError: Incompatible shapes: [3,4] vs. [1,2] 
[[Node: gradients/add_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"](gradients/add_grad/Shape, gradients/add_grad/Shape_1)]] 

從似乎回溯從p = tf.matmul(x, w) + b此外運來,但不知何故與梯度計算有關。就好像b項仍然是形狀(1,2)而不是(1,4)。雖然分別評估b確實返回形狀(1,4)陣列。

我在這裏做錯了什麼?爲什麼更改w不會導致問題,但會更改b。這是一個錯誤?

+0

你可以發佈完整的堆棧跟蹤和可重現的例子嗎?從表面上看,這聽起來像是在計算舊公式的漸變而不是新公式。 –

+0

@YaroslavBulatov,我想你在github TF問題上看到了完整的堆棧跟蹤,讓我知道這是不是真的。 –

+0

我同意它看起來像形狀的變化不傳播到所有的計算,尤其是不適用於漸變。 我的疑惑是,當我僅使用tf.matmul時,它確實爲'w'傳播,並且它會正確更新權重並學習新的類。但是,當我將tf.add操作添加爲偏倚項時,這不起作用。 那麼爲什麼它適用於一個操作而不適用於另一個? –

回答

0

您不應在訓練時更改班級數量。如果發生這種情況,您必須爲給定的課程創建一個新模型並從中重新訓練。

+0

創建新模型很慢。如果每個新批次都出現新課程,該怎麼辦?我在線/增量學習。 –