基于MNIST数据集的手写数字识别项目2

资源文件

gz格式的MNIST数据集


一、MNIST数据集介绍

(1)数据集有60000张
(2)每张图片大小28*28
(3)颜色通道:1(灰度)
(4)像素取值范围[0,255],0代表黑色,255代表白色
(5)每张图片有一个标签:0-9

二、开发步骤

1.引入库

import matplotlib.pyplot as plt
import numpy as np
from keras.layers import Conv2D,Input,LeakyReLU,Dense,Activation,Flatten,Dropout,MaxPool2D
from keras import models
from keras.optimizers import Adam,RMSprop
from tensorflow.examples.tutorials.mnist import input_data

2.加载训练集验证集测试集

mnist = input_data.read_data_sets('/BASICCNN/MNIST_Data_Gather/MNIST_data/',one_hot=True)
Train_images = mnist.train.images.reshape([mnist.train.num_examples,28,28,1])
Train_labels = mnist.train.labels
Val_images = mnist.validation.images.reshape([mnist.validation.num_examples,28,28,1])
Val_labels = mnist.validation.labels
Test_images = mnist.test.images.reshape([mnist.test.num_examples,28,28,1])
Test_labels = mnist.test.labels
print(Train_images.shape)
print(Train_labels.shape)
plt.show()

在这里插入图片描述

3.显示训练集验证集测试集

XTrain = []
YTrain = []
for i in range(10):
    x = i
    y = np.sum(Train_labels[:,i]== 1)
    XTrain.append(x)
    YTrain.append(y)
    plt.text(x,y,'%s' % y,horizontalalignment='center',fontsize=14)
plt.bar(XTrain,YTrain,width=0.8,color='orange') #柱状图参数设置
plt.tick_params(labelsize=14)
plt.xticks(XTrain)
plt.xlabel('Digits',fontsize=16)
plt.ylabel('Frequency',fontsize=16)
plt.title('Frequency in Train Data',fontsize=20)
plt.savefig('/BASICCNN/TrainImage/MNIST_traingz.png')
plt.show()

XVal = []
YVal = []
for i in range(10):
    x = i
    y = np.sum(Val_labels[:,i]== 1)
    XVal.append(x)
    YVal.append(y)
    plt.text(x,y,'%s' % y,horizontalalignment='center',fontsize=14)
plt.bar(XVal,YVal,width=0.8,color='red') #柱状图参数设置
plt.tick_params(labelsize=14)
plt.xticks(XVal)
plt.xlabel('Digits',fontsize=16)
plt.ylabel('Frequency',fontsize=16)
plt.title('Frequency in Val Data',fontsize=20)
plt.savefig('/BASICCNN/TrainImage/MNIST_valgz.png')
plt.show()

在这里插入图片描述
在这里插入图片描述

4.显示部分数据集中的数字图片

rows = 5
cols = 6
fig = plt.figure(figsize=(cols,rows))
for i in range(rows*cols):
    fig.add_subplot(rows,cols,i+1)  #图片添加到相应的位置
    img = mnist.train.images[i].reshape(28, 28)
    plt.imshow(img,cmap='PuOr')
    plt.axis('off')
    plt.title(str(Train_labels[i].argmax()),y=-0.25,color='blue') #显示对应标签
plt.savefig('/BASICCNN/TrainImage/MNIST_showgz.png')
plt.show()

在这里插入图片描述

5.构建网络模型

model = models.Sequential()
model.add(Conv2D(32,(3,3),padding='same',input_shape=(28,28,1)))
model.add(LeakyReLU())
model.add(Conv2D(32,(3,3),padding='same'))
model.add(LeakyReLU())
model.add(MaxPool2D(pool_size=(2,2)))

model.add(Conv2D(64,(3,3),padding='same',input_shape=(28,28,1)))
model.add(LeakyReLU())
model.add(Conv2D(64,(3,3),padding='same'))
model.add(LeakyReLU())
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Flatten()) #维度拉平
model.add(Dense(128,activation='relu'))
model.add(Dense(64,activation='relu'))
model.add(Dense(10,activation='softmax'))  #sigmoid归一[0,1]

6.编译模型

lr = 0.001 #学习率
loss = 'categorical_crossentropy' #损失函数
model.compile(Adam(lr=lr),loss=loss,metrics=['accuracy'])
model.summary()

在这里插入图片描述

7.训练模型

epochs = 2
batch_size = 32
history = model.fit(Train_images,Train_labels,batch_size=batch_size,epochs=epochs,validation_data=(Val_images,Val_labels))
model.save('/BASICCNN/TrainModel_h5/MNISTTraingz.h5')

在这里插入图片描述
在这里插入图片描述

8.绘制训练和验证结果

fig = plt.figure(figsize=(20,7))
plt.plot(history.epoch,history.history['accuracy'],label='Train Accuracy')
plt.plot(history.epoch,history.history['val_accuracy'],label='Val Accuracy')
plt.title('Accuracy Curve',fontsize=18)
plt.xlabel('Epochs',fontsize=15)
plt.ylabel('Accuracy',fontsize=15)
plt.legend()
plt.savefig('/BASICCNN/TrainImage/MNISTTraingz_accuracy.png')
plt.show()

plt.plot(history.epoch,history.history['loss'],label='Train Loss')
plt.plot(history.epoch,history.history['val_loss'],label='Val Loss')
plt.title('Loss Curve',fontsize=18)
plt.xlabel('Epochs',fontsize=15)
plt.ylabel('Loss',fontsize=15)
plt.legend()
plt.savefig('/BASICCNN/TrainImage/MNISTValgz_loss.png')
plt.show()

在这里插入图片描述
在这里插入图片描述
测试及可视化部分参考:基于MNIST数据集的手写数字识别项目1

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一个使用 PyTorch 框架实现的 MNIST 手写数字识别代码: ```python import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms from torchvision.datasets import MNIST from torch.utils.data import DataLoader # 定义模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 32, 3, padding=1) self.conv2 = nn.Conv2d(32, 64, 3, padding=1) self.pool = nn.MaxPool2d(2) self.fc1 = nn.Linear(64 * 7 * 7, 128) self.fc2 = nn.Linear(128, 10) self.relu = nn.ReLU() def forward(self, x): x = self.relu(self.conv1(x)) x = self.pool(x) x = self.relu(self.conv2(x)) x = self.pool(x) x = x.view(-1, 64 * 7 * 7) x = self.relu(self.fc1(x)) x = self.fc2(x) return x # 定义超参数 batch_size = 64 learning_rate = 0.01 num_epochs = 5 # 加载数据集 train_dataset = MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True) test_dataset = MNIST(root='./data', train=False, transform=transforms.ToTensor(), download=True) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) # 实例化模型和损失函数以及优化器 model = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate) # 训练模型 for epoch in range(num_epochs): train_loss = 0.0 train_acc = 0.0 for i, (images, labels) in enumerate(train_loader): optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() train_loss += loss.item() * images.size(0) _, preds = torch.max(outputs, 1) train_acc += torch.sum(preds == labels.data) train_loss = train_loss / len(train_loader.dataset) train_acc = train_acc / len(train_loader.dataset) print('Epoch [{}/{}], Loss: {:.4f}, Accuracy: {:.2f}%'.format(epoch+1, num_epochs, train_loss, train_acc*100)) # 测试模型 with torch.no_grad(): test_loss = 0.0 test_acc = 0.0 for i, (images, labels) in enumerate(test_loader): outputs = model(images) loss = criterion(outputs, labels) test_loss += loss.item() * images.size(0) _, preds = torch.max(outputs, 1) test_acc += torch.sum(preds == labels.data) test_loss = test_loss / len(test_loader.dataset) test_acc = test_acc / len(test_loader.dataset) print('Test Loss: {:.4f}, Test Accuracy: {:.2f}%'.format(test_loss, test_acc*100)) ``` 这个代码中定义了一个卷积神经网络模型,使用 SGD 优化器进行训练,最后在测试集上进行测试并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值