我如何更改数据以使其在丢失时起作用:均方误差?

时间:2019-10-27 10:08:03

标签: python tensorflow keras mnist

我正在使用mnist数据集(数字),并且想要实现均方误差损失函数,但是我遇到以下错误:

ValueError:传递形状为(60000,1)的目标数组以输出形状为(None,10),同时用作损失mean_squared_error。这种损失期望目标与输出具有相同的形状。

这是我的代码: 最初,我尝试 sparse_categorical_crossentropy 代码修改自: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兼容?

1 个答案:

答案 0 :(得分:0)

我想您在这里错过了一些非常重要的内容。您正在尝试对分类任务(预测类)使用回归(均方误差)中使用的度量。这两个目标是机器学习世界中的不同任务。

如果仍要尝试,只需将最后一层重塑为一个输出神经元并激活ReLU:

tf.keras.layers.Dense(1, activation='relu')

一个输出神经元和ReLU激活,因为您的标签只是0到9之间的(整数)数字。Sigmoid为您提供0到1之间的连续值,所以在这种情况下不会给您带来任何成功。

请记住,您的模型不再进行分类,它将为您提供0到inf之间的连续数字。因此,如果您收到例如如果将3的图像输入模型,则输出为3.1415。该模型现在尝试产生的输出尽可能接近标签中的数字。