【问题标题】:tensorflow keras model predicts similar value for every testtensorflow keras 模型为每个测试预测相似的值
【发布时间】:2020-05-29 22:46:41
【问题描述】:

我正在尝试使用带有 tensorflow 的 RNN 进行二进制分类。我的训练和测试数据的标签是 0 和 1。当我尝试在我完成的模型上使用我的 RNN 时,它会为每个样本返回几乎相同的预测:

model.predict(holdout_x[400:500])

array([[-4.116061 , -1.3410028],
   [-4.1405125, -1.3521721],
   [-4.171639 , -1.3665637],
   [-4.1515126, -1.356805 ],
   [-4.1466017, -1.3546   ],
   [-4.1306634, -1.3479614],
   [-4.1259437, -1.3455958],
   [-4.1161146, -1.3414239],
   [-4.135389 , -1.3504343],
   [-4.1410503, -1.3527975],
   [-4.1413574, -1.3528765],
   [-4.1483955, -1.3562942],
   [-4.208541 , -1.383785 ],
   [-4.212775 , -1.3856986],
   [-4.2415767, -1.3998709],
   [-4.250041 , -1.4033642],
   [-4.2150397, -1.3866954],
   [-4.2094893, -1.3843822],
   [-4.1996937, -1.380172 ],
   [-4.0357003, -1.3077384],
   [-4.030937 , -1.3050178],
   [-4.0273657, -1.3041242],
   [-4.0044518, -1.2939129],
   [-4.003211 , -1.2922926],
   [-4.015193 , -1.2991027],
   [-3.9627366, -1.2757865],
   [-3.9252415, -1.2586563],
   [-3.936089 , -1.265475 ],
   [-3.8994193, -1.2497959],
   [-3.918683 , -1.2593002],
   [-3.7673016, -1.1924615],
   [-3.7568831, -1.1912583]], dtype=float32)

这是我的模型的外观:

model = tf.keras.Sequential()

model.add(keras.layers.LSTM(200, input_shape=(200, 7), return_sequences=True))

model.add(keras.layers.LSTM(200, input_shape=(200, 7), return_sequences=True))

model.add(keras.layers.LSTM(200))

# Add a Dense layer with 10 units.
model.add(keras.layers.Dense(2))

model.summary()

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

如何防止这种情况发生?

【问题讨论】:

  • 我不得不遗漏很多预测,因为 stackoverflow 不喜欢它们
  • 如何设置layers.Dense(1)并使用loss="binary_crossentropy"
  • 您的网络似乎没有学到任何东西。您可以发布每个时期图的训练和验证损失吗?首先要检查的是训练损失是否在减少。
  • 在实施了我在这个论坛上获得的所有技巧后,我的损失是静态的,为 0.6932。我已经完成了 30 个 epoch,准确率在 49.5 和 50.5 之间交替变化。所以我的网络大概没有学到任何东西。

标签: tensorflow keras


【解决方案1】:

理论上,可能有多种原因。然而,在这个例子中有一件事绝对需要澄清。

稀疏分类交叉熵期望您为预测提供概率(值从 0 到 1),除非您使用 from_logits=True 对其进行实例化。但是,您的最后一层没有指定激活。所以输出值不限于[0,1]。

我将从将最后一层更改为model.add(keras.layers.Dense(2, activation='softmax')) 开始。然后确保以正确的格式(根据https://www.tensorflow.org/api_docs/python/tf/keras/losses/sparse_categorical_crossentropy)提供地面实况类标签。

【讨论】:

    【解决方案2】:

    更改model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

    将损失更改为:loss='binary_crossentropy',因为您正在进行二进制分类。

    在进行二元分类时,最后应该只有一个 Dense 节点,将其更改为 model.add(keras.layers.Dense(1))

    【讨论】:

    • 我这样做了,但网络似乎仍然偏向于一个站点,即使训练数据是完全平衡的 50/50 like this
    • 尝试改变 LSTM 层的单位,在 LSTM 之后添加几个密集层,并尝试实现Dropout
    猜你喜欢
    • 2018-01-23
    • 2020-10-31
    • 1970-01-01
    • 2021-12-28
    • 2017-05-29
    • 1970-01-01
    • 2022-06-16
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多