【问题标题】:adding one hot encoding throws error in previously working code in Tensorflow添加一个热编码会在 Tensorflow 中以前工作的代码中引发错误
【发布时间】:2016-03-26 10:07:02
【问题描述】:
with tf.variable_scope("rnn_seq2seq"):

    w = tf.get_variable("proj_w", [num_units, seq_width])
    w_t = tf.transpose(w)
    b = tf.get_variable("proj_b", [seq_width])
    output_projection=(w,b)

    output,state = rnn_seq2seq(enc_inputs,dec_inputs,cell,output_projection=output_projection,feed_previous=False)

    weights=[tf.ones([batch_size * dec_steps])]
    loss=[]
    for i in xrange(dec_steps -1):
        logits = tf.nn.xw_plus_b(output[i],output_projection[0],output_projection[1])

如果我在这里在 logits 上引入一种热编码,程序稍后会出错,尽管两者都返回相同的维度。 如果我注释掉这一行,程序不会给出任何错误。

    prev = logits
        logits = tf.to_float(tf.equal(prev,tf.reduce_max(prev,reduction_indices=[1],keep_dims=True)))
        print prev
        print logits

Tensor("rnn_seq2seq/xw_plus_b:0", shape=TensorShape([Dimension(800), Dimension(14)]), dtype=float32)

Tensor("rnn_seq2seq/ToFloat:0", shape=TensorShape([Dimension(800), Dimension(14)]), dtype=float32)

其余代码:

    crossent =tf.nn.softmax_cross_entropy_with_logits(logits,dec_inputs[i+1],name="SequenceLoss/CrossEntropy{0}".format(i))
    loss.append(crossent)

cost = tf.reduce_sum(tf.add_n(loss))
final_state = state[-1]
tvars = tf.trainable_variables()

grads,norm = tf.clip_by_global_norm(tf.gradients(cost,tvars),5)
lr = tf.Variable(0.0,name="learningRate")
optimizer = tf.train.GradientDescentOptimizer(lr)
train_op = optimizer.apply_gradients(zip(grads,tvars))

---> 23 毕业生,norm = tf.clip_by_global_norm(tf.gradients(cost,tvars),5)

ValueError: 将参数 'values' 列出到 'Pack' Op 长度为 0 更短 小于最小长度 1。

【问题讨论】:

    标签: tensorflow one-hot-encoding


    【解决方案1】:

    只有在神经网络执行的所有操作都是可微分的情况下才能训练神经网络。您应用的“one-hot”步骤不可微分,因此无法使用任何基于梯度下降的优化器(=张量流实现的任何优化器)训练这样的神经网络。

    一般的方法是在训练期间使用softmax(可微分)来近似one-hot编码(并且您的模型已经有softmax跟随计算logits,所以注释掉“one-hot”实际上就是全部你需要这样做)。

    【讨论】:

    • 感谢您再次前来救我 :)
    • 但是,即使我注释掉该行,学习也不会发生 - 成本保持不变,并且标准打印为 Inf。有什么方法可以调试吗?
    • 我会先在这里设置非零学习率:lr = tf.Variable(0.0,name="learningRate")。如果那没有帮助,那么我不知道,我没有调试张量流模型的经验:(
    • ohh.. 也替换为非零数字(之前使用占位符),但对学习没有影响。我试图找出什么可能导致规范是 inf 。
    • 有趣的是,用 GRUCell 替换 LSTM 单元使其学习。
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2021-02-23
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多