【问题标题】:Using tensorflow layers, model not trained使用张量流层,模型未训练
【发布时间】:2023-03-12 10:00:01
【问题描述】:

我之前在 Theano 上使用过 keras,现在想以 tensorflow 风格编写代码,这对我来说是新的。我尝试编写一个非常简单的模型(我在 keras 上实现并且它有效),但训练过程似乎不起作用。无论我经过多少个 epoch,模型总是做出相同的预测,这表明模型在训练过程中根本没有更新。我想我一定是误会了什么,犯了一个愚蠢的错误,但找不到它在哪里。

我确定输入的数据和标签是正确的,因为我之前使用过它们。输入数据 training_input[0] 和 training_input[1] 分别是 2D numpy 数组。标签是 4 维的 one-hot。

def model_1(features, labels):
    hl_input = features['hl_input']
    bd_input = features['bd_input']
    encoder = tf.concat([hl_input, bd_input], axis=1)

    encoder = tf.layers.dense(encoder, 128, activation=tf.nn.relu)
    decoder = tf.layers.dense(encoder, 64)
    logits = tf.layers.dense(decoder, 4, activation=tf.nn.softmax)
    predictions = tf.argmax(logits, 1, name="predictions")

    loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits)
    train_op = tf.contrib.layers.optimize_loss(loss, tf.contrib.framework.get_global_step(), optimizer='Adam',
                                           learning_rate=0.1)
    predictions = {"classes": predictions, "probabilities": logits}

    return predictions, loss, train_op
... ...
classifier = tf.contrib.learn.Estimator(model_fn=model_1)
classifier.fit(x={'hl_input':training_input[0], 'bd_input':training_input[1]}, y=training_labels, batch_size=batch_size, steps=steps)

【问题讨论】:

  • 好的,我终于找到了我的问题。我使用 numpy 数组作为单热向量而不是张量。所以我需要添加一行labels = tf.cast(labels, tf.int32)。希望显示我的错误可以帮助其他人。

标签: python tensorflow layer


【解决方案1】:

您在最后一层应用softmax 激活两次。 tf.losses.softmax_cross_entropy 函数在内部应用softmax,因此通过设置activation=None 删除logits 上的激活。

【讨论】:

  • 谢谢,这确实是一个错误,我更正了。然而,这不是该模型根本不起作用的原因。改正后还是有问题。我还打印了预测,对于任何输入,输出(logits)都是完全相同的。出于某种原因,要么输入数据没有正确迭代,要么模型完全有偏差。我会调查的。
  • 我只能在此处显示的代码中找到一个错误。 Logits 作为输入传递,我猜不出它的类型是问题。
猜你喜欢
  • 2020-02-29
  • 2021-06-28
  • 2021-12-24
  • 2017-09-22
  • 2016-06-14
  • 2018-03-05
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多