无论输入如何,Keras上的CNN都收敛到相同的值

时间:2018-06-30 19:04:40

标签: python machine-learning keras conv-neural-network

我最近一直在学习Keras,并在带有CNN的CIFAR10数据集上进行了尝试。但是,我训练的模型(可以运行代码here)对于每次输入都返回相同的答案,无论如何。我在模型定义中忘记了什么吗?

2 个答案:

答案 0 :(得分:3)

您忘记了对图像进行标准化。当前,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

请注意最后一部分:从不通过其自身的均值和标准差对测试数据进行归一化。改用训练平均值和std。

答案 1 :(得分:0)

您正在对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