【发布时间】:2019-12-02 03:22:54
【问题描述】:
我创建了一个非常简单的回归模型,可以训练黑白图像和 0.5-10 之间的相应标签。在训练预测标签时,它总是收敛到一个模型,该模型为所有内容输出相同的数字,该数字看起来最有可能是所有标签的平均值。我的模型有什么东西在创造这个吗?我的代码:
from __future__ import absolute_import, division, print_function
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
(train_images, train_labels), (test_images, test_labels) = np.load("dataset.npy", allow_pickle=True)
train_labels = list(map(float, train_labels))
test_labels = list(map(float, test_labels))
train_labels = [int(i) for i in train_labels]
test_labels = [int(i) for i in test_labels]
print(train_labels)
model = keras.Sequential([
keras.layers.Flatten(input_shape=(128, 128)),
keras.layers.Dense(64, activation=tf.nn.relu),
keras.layers.Dense(1)
])
model.compile(loss='mean_squared_error',
optimizer='adam',
metrics=['mean_absolute_error', 'mean_squared_error'])
model.fit(train_images, train_labels, epochs=1000)
predictions = model.predict(test_images)
for i in range(103):
print("%s: %s" % (test_labels[i], predictions[i]))
【问题讨论】:
-
您有多少数据样本?由于您使用平均绝对误差,神经网络,如果它预测所有输出值的平均值,那么损失会自动降低到 50%。您是否对数据和输出进行了规范化?
-
它基本上表明您的模型无法学习任何东西。可能有很多可能的原因。但您可以先尝试使用
Conv2d层而不是Flatten和Dense层。 -
我有 410 个数据点,分为 328 个用于训练和 82 个用于测试。通过规范化,您的意思是在 0 和 1 之间进行映射吗?如果是这样,不,我没有。我应该吗?
-
@meowongac 我使用了 conv2d 和池化层,它的学习似乎相当一致,但仍然只学习输出相同的数字。
-
在您的示例中,首先尝试使用不同的激活函数 - 'relu' 往往会当场失效,
Dense(64)在 1000 个时期后的输出也可能为零。然后你会得到一个偏置值Dense(1)。另外,请绘制并显示标签的分布。
标签: python tensorflow machine-learning keras regression