我创建了一个非常简单的回归模型,用于训练黑白图像及其对应的标签,标签值在0.5到10之间。在训练预测标签时,模型总是收敛到一个对所有输入输出相同数字的模型,这个数字很可能是所有标签的平均值。请问我的模型中有什么问题导致了这种情况?我的代码如下:
from __future__ import absolute_import, division, print_functionimport tensorflow as tffrom tensorflow import kerasimport numpy as npimport 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]))
回答:
处理图像时,一个关键步骤是归一化图像值。这有助于优化过程和梯度更新的平滑进行,也有助于模型更快更好地收敛。有多种方法可以进行归一化,其中一种简单的归一化方案是将图像像素值除以255(别忘了图像像素值通常在[0,255]范围内,因此将它们除以255会使它们落入[0,1]范围):
train_images = train_images.astype('float32') / 255.0test_images = test_images.astype('float32') / 255.0