使用keras训练神经网络时 训练集和验证集准确率远远高于测试集

环境为keras 在cifar100上训练lenet5 训练集和验证集准确率分别为 acc: 0.9510 val_acc: 0.9330 测试集准确率只有0.46

model=Lenet(n_class)
es = EarlyStopping(monitor='val_acc', patience=5)
tb = TensorBoard(log_dir='./logs',  # log 目录
                     histogram_freq=1,  # 按照何等频率(epoch)来计算直方图,0为不计算
                     batch_size=32,  # 用多大量的数据计算直方图
                     write_graph=True,  # 是否存储网络结构图
                     write_grads=False,  # 是否可视化梯度直方图
                     write_images=True,  # 是否可视化参数
                     embeddings_freq=0,
                     embeddings_layer_names=None,
                     embeddings_metadata=None)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=batch_size, epochs=300, callbacks=[es,tb], validation_split=0.2,shuffle=True)
acc0=model.evaluate(x_test, y_test,verbose=0) #这里输出的准确率与验证机集接近 为0.9333
pre = model.predict(x_test)
ytest = y_te.argmax(axis=1)
pp = pre.argmax(axis=1)
acc1 = metrics.accuracy_score(ytest, pp) #这里的准确率为0.46

造成这种情况的可能原因
1.训练是使用GPU训练,而测试时没有使用
2.model.predict在预测时会对数据进行shuffle 导致输出的预测值与原始数据的顺序不匹配,从而导致结果不一致
3.这里进行的是多分类,而训练时损失函数设置为binary_crossentropy(二分类的损失函数)显示的是二进制精度,不是分类精度,修改为categorical_crossentropy后,两者结果一致。
使用keras训练神经网络时 训练集和验证集准确率远远高于测试集_第1张图片

你可能感兴趣的:(算法学习)