Python 如何通过越来越多的课程逐步训练?

Python 如何通过越来越多的课程逐步训练?,python,tensorflow,Python,Tensorflow,我正在尝试创建一个增量分类器,该分类器将对数据进行训练,这些数据包含一些特定数量的纪元的n个类,然后是特定数量纪元的n+m个类,然后是n+m+k,等等,其中每个连续的类集都包含前一个集作为子集 为了做到这一点,无需训练模型、保存模型、手动编辑图表、重新训练、重复,我只需定义对整个类集进行分类所需的所有权重,但在将分类器引入这些类之前,将与未看到的类相对应的权重保持为0 我的策略是定义一个占位符,该占位符被输入一个布尔值数组,定义某个给定的权重集是否可训练 相关代码如下: output_train

我正在尝试创建一个增量分类器,该分类器将对数据进行训练,这些数据包含一些特定数量的纪元的n个类,然后是特定数量纪元的n+m个类,然后是n+m+k,等等,其中每个连续的类集都包含前一个集作为子集

为了做到这一点,无需训练模型、保存模型、手动编辑图表、重新训练、重复,我只需定义对整个类集进行分类所需的所有权重,但在将分类器引入这些类之前,将与未看到的类相对应的权重保持为0

我的策略是定义一个占位符,该占位符被输入一个布尔值数组,定义某个给定的权重集是否可训练

相关代码如下:

output_train = tf.placeholder(tf.int32, shape = (num_incremental_grps), name         = "output_train")
.
.
.
weights = []
biases = []
for i in range(num_incremental_grps):
    W = tf.Variable(tf.zeros([batch_size, classes_per_grp]),         
    trainable=tf.cond(tf.equal(output_train[i], tf.constant(1)),lambda: tf.constant(True), lambda: tf.constant(False)))
    weights.append(W)
    b = tf.Variable(tf.zeros([classes_per_grp]), trainable=tf.cond(tf.equal(output_train[i], 
    tf.constant(1)), lambda:tf.constant(True), lambda: tf.constant(False)))
    biases.append(b)

out_weights = tf.stack(weights, axis=1).reshape((batch_size, -1))
out_biases = tf.stack(biases, axis=1).reshape((batch_size, -1))
outputs = tf.identity(tf.matmul(inputs, out_weights) + out_biases, name='values')
.
.
.
# Will change this to an array that progressively updates as classes are added.
output_trainable = np.ones(num_incremental_grps, dtype=bool)
.
.
.
with tf.Session() as sess:
    init.run()
    for epoch in range(epochs):
        for iteration in range(iterations):
            X_batch, y_batch = batch.getBatch()
            fd={X: X_batch, y: y_batch, training: True, output_train: output_trainable}
            _, loss_val = sess.run([training_op, loss], feed_dict=fd)
这将返回错误消息

Using a 'tf.Tensor' as a Python `bool` is not allowed. Use `if t is not None:` instead of 
`if t:` to test if a tensor is defined,and use TensorFlow ops such as tf.cond to execute 
subgraphs conditioned on the value of a tensor.
我尝试过对此进行修补,比如将初始占位符数据类型改为tf.bool而不是tf.int32。我还试着在权重/偏差中,将张量的一部分输入到“可训练”参数中,如下所示

W = tf.Variable(tf.zeros([batch_size, classes_per_grp]), trainable=output_variable[i])

但是我收到了同样的错误信息。除了尝试一种完全不同的方法来更新可预测类的数量之外,我不知道如何从这里开始。任何帮助都将不胜感激。

发生错误的原因是
tf.cond
基于单个布尔值进行决策,就像
if
语句一样。这里要做的是选择张量的每个元素

您可以使用
tf.where
来修复该问题,但随后您将遇到另一个问题,即
trainable
不是您可以在运行时修复的属性,它是变量定义的一部分。如果某个变量将在某个时间点进行训练,可能不是在开始训练,而是在以后训练,那么它必须是可训练的

我建议采取更简单的方法:将
output\u train
定义为
tf.float32

output_train = tf.placeholder(tf.float32, shape=(num_incremental_grps), name="output_train")
然后用这个向量乘以你的权重和变量

W = tf.Variable(...)
W = W * output_train
...
1
的值提供给
output\u train
您希望进行培训的位置,否则为
0

还要小心掩盖您的损失,忽略不需要的通道的输出,因为尽管它们现在总是输出0,但这仍然可能影响您的损失。比如说,

logits = ...
logits = tf.matrix_transpose(tf.boolean_mask(
  tf.matrix_transpose(logits ),
  output_train == 1))
loss = tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=labels)

你能发布堆栈跟踪吗?