TensorFlow Keras 模型为每个测试预测类似的值



我正在尝试用张量流的RNN进行二元分类。m y 训练和测试数据的标签为 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'])

如何防止这种情况发生?

理论上,可能有多种原因。但是,此示例中有一件事肯定需要澄清。

稀疏分类交叉熵期望您为预测提供概率(从 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(提供。

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

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

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

最新更新