我想看看神经网络是否可以使用 MNIST 手写数据集来学习恒等函数。
这是完整的代码
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import RMSprop
batch_size = 128
epochs = 20
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
model = Sequential()
model.add(Dense(784, activation='relu', input_shape=(784,)))
model.add(Dense(784, activation='relu'))
model.add(Dense(784, activation='relu'))
model.add(Dense(784, activation='relu'))
model.summary()
model.compile(loss='mean_squared_error',
optimizer=RMSprop(),
metrics=['mean_absolute_percentage_error'])
history = model.fit(x_train, x_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, x_test))
score = model.evaluate(x_test, x_test, verbose=0)
print('Test loss:', score[0])
print('Test MAPE:', score[1])
和输出
**4 dense layers**
Epoch 20/20
60000/60000 [==============================] - 50s 840us/step - loss: 456.7581 - mean_absolute_percentage_error: 351097677.7045 - val_loss: 523.7151 - val_mean_absolute_percentage_error: 504905991.0656
Test loss: 523.7150838867187
Test MAPE: 504905988.5056
我无法完全理解的是为什么培训无法找到问题的完美解决方案,以及为什么要花这么长时间才能接近它?即使只有一个密集层,也无法找到确切的解决方案:
**1 dense layer**
Epoch 20/20
60000/60000 [==============================] - 16s 268us/step - loss: 180.6187 - mean_absolute_percentage_error: 209296481.2373 - val_loss: 167.9543 - val_mean_absolute_percentage_error: 192590419.9936
Test loss: 167.954341796875
Test MAPE: 192590420.1984
从概念上讲,我可以看到有一个解决方案空间(不仅仅是精确的恒等函数),因为在所有图像中可能有一些像素具有相同的值,这些像素可以在训练集中毫无损失地交换(例如,0 在边缘附近)。知道这是一个局部最小值,我可以从中学到什么来指导我,而不是玩超参数,直到找到更好的东西?