【发布时间】:2018-06-30 19:04:40
【问题描述】:
我最近一直在学习 Keras,并尝试使用 CNN 处理 CIFAR10 数据集。但是,我训练的模型(您可以运行代码 here)无论如何都会为 每个 输入返回相同的答案。我是否忘记了模型定义中的某些内容?
【问题讨论】:
标签: python machine-learning keras conv-neural-network
我最近一直在学习 Keras,并尝试使用 CNN 处理 CIFAR10 数据集。但是,我训练的模型(您可以运行代码 here)无论如何都会为 每个 输入返回相同的答案。我是否忘记了模型定义中的某些内容?
【问题讨论】:
标签: python machine-learning keras conv-neural-network
您忘记对图像进行标准化。目前,x_train 中的值在[0,255] 范围内。这会导致大的梯度更新并停止训练过程。在这种情况下,一种简单的归一化方案是:
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
这会导致值落在[0,1] 范围内。那么你肯定会看到训练的进展。
更复杂的归一化方案涉及按特征(即按像素)归一化或居中。在这种方法中,我们对所有图像进行归一化,使得所有图像中的每个像素的均值为零,标准差为 1(即它们大多落在[-1,1] 范围内):
# make sure values are float
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_mean = x_train.mean(axis=0)
x_train -= x_mean
x_std = x_train.std(axis=0)
x_train /= x_std + 1e-8 # add a small constant to prevent division by zero
# normalize test data using the mean and std of training data
x_test -= x_mean
x_test /= x_std + 1e-8
注意最后一部分:永远不会通过自己的均值和标准对测试数据进行归一化。请改用训练均值和标准差。
【讨论】:
你正在对 x_test 进行预测
predictions = model.predict_classes(x_test, batch_size=50)
然后将它们与 y_train 进行比较
comparison = [(predictions[i], y_train_[i][0]) for i in range(0, len(predictions))]
我觉得应该是 y_test
【讨论】: