改變輸出/班的數量這是我簡單的迴歸有兩個特徵和兩個類:在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
。這是一個錯誤?
你可以發佈完整的堆棧跟蹤和可重現的例子嗎?從表面上看,這聽起來像是在計算舊公式的漸變而不是新公式。 –
@YaroslavBulatov,我想你在github TF問題上看到了完整的堆棧跟蹤,讓我知道這是不是真的。 –
我同意它看起來像形狀的變化不傳播到所有的計算,尤其是不適用於漸變。 我的疑惑是,當我僅使用tf.matmul時,它確實爲'w'傳播,並且它會正確更新權重並學習新的類。但是,當我將tf.add操作添加爲偏倚項時,這不起作用。 那麼爲什麼它適用於一個操作而不適用於另一個? –