我正在使用mnist数据集(数字(,并希望实现均方误差损失函数,但我有以下错误:
ValueError:在使用作为损失mean_squared_error
时,为形状为(None,10(的输出传递了形状为(60000,1(的目标数组。这种损失预计目标的形状与产出相同。
这是我的代码:最初,我尝试了spare_categorical_crossentry代码修改自:https://www.youtube.com/watch?v=wQ8BIBpya2k
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test,y_test) = mnist.load_data()
x_train = tf.keras.utils.normalize(x_train, axis = 1)
x_test = tf.keras.utils.normalize(x_test, axis = 1)
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28,28)),
tf.keras.layers.Dense(128, activation='sigmoid'),
tf.keras.layers.Dense(10, activation='sigmoid')
])
model.compile(optimizer='SGD',
loss='mean_squared_error',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3)
如何重塑我的数据,使其与MSE一起工作?
我想你错过了一些非常重要的东西。您正试图将回归中使用的度量(均方误差(用于分类任务(预测类(。这两个目标在机器学习世界中是不同的任务。
如果你想尝试一下,只需将你的最后一层重塑为一个输出神经元和ReLU激活:
tf.keras.layers.Dense(1, activation='relu')
一个输出神经元和ReLU激活,因为您的标签只是从0到9的(整数(数字。Sigmoid为您提供0到1之间的连续值,因此在这种情况下,这不会给您带来任何成功。
请记住,你的模型不再进行分类,它会给你一个0到inf之间的连续数字。因此,如果你在模型中输入3的图像,你会得到3.1415作为输出,不要感到惊讶。该模型现在尝试生成尽可能接近标签中数字的输出。