Machine learning 如何正确地训练CNN对看不见的数据进行预测?

Machine learning 如何正确地训练CNN对看不见的数据进行预测?,machine-learning,neural-network,keras,conv-neural-network,mnist,Machine Learning,Neural Network,Keras,Conv Neural Network,Mnist,我一直在为我的学校项目开发一个识别数字的程序。为此,我使用了Python、Keras和MNIST数据集。这是我用来训练它的代码: 导入keras 从keras.dataset导入mnist 从keras.models导入顺序 从keras.layers导入致密、脱落、平坦 从keras.layers导入卷积2D、最大池2D、激活、平均池2D 从keras导入后端为K 将matplotlib.pyplot作为plt导入 导入matplotlib 批量大小=32 num_类=10 纪元=10 img

我一直在为我的学校项目开发一个识别数字的程序。为此,我使用了Python、Keras和MNIST数据集。这是我用来训练它的代码:

导入keras
从keras.dataset导入mnist
从keras.models导入顺序
从keras.layers导入致密、脱落、平坦
从keras.layers导入卷积2D、最大池2D、激活、平均池2D
从keras导入后端为K
将matplotlib.pyplot作为plt导入
导入matplotlib
批量大小=32
num_类=10
纪元=10
img_行,img_列=28,28
(x_列,y_列),(x_测试,y_测试)=列表负载数据()
如果K.image_data_format()==“channels_first”:
x_列=x_列重塑(x_列形状[0],1,img_行,img_列)
x_测试=x_测试。重塑(x_测试。形状[0],1,img_行,img_列)
输入形状=(1,img\u行,img\u列)
其他:
x_列=x_列重塑(x_列形状[0],img_行,img_列,1)
x_测试=x_测试。重塑(x_测试。形状[0],img_行,img_列,1)
输入形状=(img\u行,img\u列,1)
x_-train=x_-train.astype('float32')
x_test=x_test.astype('float32')
x_列/=255
x_检验/=255
打印('x_列形状:',x_列形状)
打印(x_序列形状[0],“序列样本”)
打印(x_测试形状[0],“测试样本”)
y_train=keras.utils.to_categorical(y_train,num_classes)
y_测试=keras.utils.to_分类(y_测试,num_类)
模型=顺序()
添加(卷积2D(6,(5,5),输入形状=输入形状))
添加(激活('sigmoid'))
add(MaxPooling2D(池大小=(2,2)))
模型添加(卷积2D(12,(5,5)))
添加(激活('sigmoid'))
添加(平均池2D(池大小=(2,2)))
model.add(展平())
模型添加(密度(192))
模型.添加(密度(10))
添加(激活('sigmoid'))
模型.添加(密度(10))
添加(激活('softmax'))
model.compile(loss=keras.loss.categorical_交叉熵,
optimizer=keras.optimizers.Adadelta(),
指标=[‘准确度’])
hist=模型拟合(x\U系列、y\U系列、,
批次大小=批次大小,
时代,
verbose=1,
验证数据=(x_检验,y_检验)
分数=模型。评估(x_检验,y_检验,详细度=0)
打印('测试损失:',分数[0])
打印('测试精度:',分数[1])
model.save('model3.h5')
列车损失=历史记录[“损失”]
val_loss=历史记录['val_loss']
列车加速=历史记录['acc']
val_acc=历史记录['val_acc']
xc=范围(历元)
plt.图(1,figsize=(7,5))
plt.绘图(xc,列车损失)
plt.绘图(xc,val_损耗)
plt.xlabel('numofepochs')
plt.ylabel(“损失”)
plt.title(“列车损失vs价值损失”)
plt.grid(真)
plt.图例(['train','val']))
打印(plt.style.available)#使用bmh、classic、ggplot打印大图片
plt.style.use(['classic']))
plt.图(2,figsize=(7,5))
plt.绘图(xc,列车加速)
plt.绘图(xc、val_acc)
plt.xlabel('numofepochs')
plt.ylabel(“精度”)
plt.标题(列车与车辆)
plt.grid(真)
plt.图例(['train','val',loc=4)
#打印plt.style.available#使用bmh、classic、ggplot打印大图片
plt.style.use(['classic']))
plt.show()
我以model3.h5的名称保存了模型。然而,在我编写的另一个程序中,我试图用模型预测我在画图中输入的数字。我有10张照片(0-9),在预测模型时预测所有数字都是8,这当然是错误的。 然而,在训练期间,准确率接近98.5%,损失小于0.1%。我做错什么了吗

下面是我运行的代码,用于在看不见的数据上预测它。它将图片的大小调整为28列28行,这样就可以在我的CNN上运行

这是我关于卷积神经网络的第一个项目,我不知道“一些额外的技术”可以帮助我更好地处理看不见的数据

我也尝试了一些不同的架构(使用max-pooling和relu激活函数进行卷积层,然后添加完全连接的层),但结果仍然是一样的。我也试着将它设置为100或200个时代,但仍然没有用

导入操作系统,cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从sklearn.utils导入shuffle
从sklearn.model\u选择导入列车\u测试\u拆分
从keras导入后端为K
从keras.models导入负载_模型
K.设置图像尺寸顺序(“tf”)
从keras.utils导入np_utils
从keras.models导入顺序
从keras.layers.core导入致密、脱落、激活、展平
从keras.layers.convolution导入Convolution2D,MaxPoolig2D
从keras.optimizers导入新加坡元、RMSprop、adam
PATH=os.getcwd()
数据路径=路径+'\myNumbers'
data_dir_list=os.listdir(数据路径)#direktoriji unutra
img_数据=[]
对于数据目录列表中的文件:
test\u image=cv2.imread(数据路径+“\\”+文件)
测试图像=cv2.CVT颜色(测试图像,cv2.COLOR\U RGB2GRAY)
test_image=cv2.调整大小(test_image,(28,28))
test\u image=np.array(test\u image)
test\u image=test\u image.astype('float32')
测试图像/=255
打印(测试图像形状)
测试图像=np。展开图像(测试图像,轴=3)
测试图像=np。展开图像(测试图像,轴=0)
打印(测试图像形状)
img_data.append(测试_图像)
模型=负荷\模型(“模型3.h5”)
对于img_数据中的img:
打印(模型预测(img))
打印(模型预测类(img))

MNIST数据集共包含60000个训练样本和10000个测试样本,与原始MNIST数据集相同。每个样本图像为28x28,并线性化为1x784大小的向量。因此,训练和测试数据集分别是大小为60000x784和10000x784的二维向量。我看到您实际上使用cv2.resize函数调整了它们的大小。当你在你的Jupyter笔记本中显示它时,图像质量如何?