更改tensorflow中的输出/类数

更改tensorflow中的输出/类数,tensorflow,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_en

这是我的简单逻辑回归,有两个特征和两个类别:

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\u w\u op,feed\u dict={n\u more:2})
再添加两个类,然后继续运行
train\u 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)
如果我在添加更多类之前运行
train\u op
,它会起作用。 如果我运行change-ops-
sess.run([change\u-w\u-op,change\u-b\u-op],feed\u-dict={n\u-more:2})
它们也工作得很好,分别检查w和b表明它们的大小增加了。更重要的是,运行sess.run([p,loss],feed_dict={x:…,y:…})也可以工作并返回更多类的预测

唯一不起作用的是
train\u op

它给出了此错误(形状中的3对应于传递的x和y值中的示例数):

从回溯来看,它似乎来自
p=tf.matmul(x,w)+b
addition op,但不知何故与梯度计算有关。好像b项仍然是形状(1,2)而不是(1,4)。虽然单独计算
b
会返回形状(1,4)数组


我做错了什么?为什么更改
w
不会导致问题,但更改
b
会导致问题。这是一个错误吗?

您不应该在培训时更改课程数量。如果发生这种情况,您必须为给定的类创建一个新模型并从中重新训练。

您能发布完整的堆栈跟踪和可复制的示例吗?从表面上看,这听起来像是在计算旧公式的梯度,而不是新公式one@YaroslavBulatov,我想你看到了github TF问题上的完整堆栈跟踪,如果不是这样,请告诉我。我同意形状的变化似乎不会传播到所有计算,尤其是渐变。我的困惑是,当我只使用tf.matmul时,它确实会为
w
传播,并且它确实会正确地更新权重并学习新类。但当我将偏差项作为tf.add op添加时,这不起作用。那么,为什么它对一个op有效,而对另一个op无效呢?创建新模型很慢。如果每个新批上都出现新类,该怎么办?我正在进行在线/增量学习。
....
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)]]