人工智能-作业6:CNN实现XO识别
文章目录
- 一、 数据集
- 二、构建模型
- 三、训练模型
- 四、测试训练好的模型
- 五、计算模型准确率
- 六、查看训练好模型的特征图
- 八、训练模型源代码
- 九、测试模型源代码
一、 数据集
在群中直接下载
二、构建模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 9, 3)self.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(9, 5, 3)self.relu = nn.ReLU()self.fc1 = nn.Linear(27 * 27 * 5, 1200)self.fc2 = nn.Linear(1200, 64)self.fc3 = nn.Linear(64, 2)def forward(self, x):x = self.maxpool(self.relu(self.conv1(x)))x = self.maxpool(self.relu(self.conv2(x)))x = x.view(-1, 27 * 27 * 5)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return x
三、训练模型
model = Net()criterion = torch.nn.CrossEntropyLoss() # 损失函数 交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr=0.1) # 优化函数:随机梯度下降epochs = 10
for epoch in range(epochs):running_loss = 0.0for i, data in enumerate(data_loader):images, label = dataout = model(images)loss = criterion(out, label)optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()if (i + 1) % 10 == 0:print('[%d %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))running_loss = 0.0print('finished train')# 保存模型
torch.save(model, 'model_name.pth')
四、测试训练好的模型
model_load = torch.load('model_name.pth')
# 读取一张图片 images[0],测试
print("labels[0] truth:\t", labels[0])
x = images[0]
x = x.reshape([1, x.shape[0], x.shape[1], x.shape[2]])
predicted = torch.max(model_load(x), 1)
print("labels[0] predict:\t", predicted.indices)img = images[0].data.squeeze().numpy() # 将输出转换为图片的格式
plt.imshow(img, cmap='gray')
plt.show()
五、计算模型准确率
# 读取模型
model_load = torch.load('model_name1.pth')correct = 0
total = 0
with torch.no_grad(): # 进行评测的时候网络不更新梯度for data in data_loader_test: # 读取测试集images, labels = dataoutputs = model_load(images)_, predicted = torch.max(outputs.data, 1) # 取出 最大值的索引 作为 分类结果total += labels.size(0) # labels 的长度correct += (predicted == labels).sum().item() # 预测正确的数目
print('Accuracy of the network on the test images: %f %%' % (100. * correct / total))
六、查看训练好模型的特征图
import torch
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
from torchvision import transforms, datasets
import torch.nn as nn
from torch.utils.data import DataLoaderplt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容
# 定义图像预处理过程(要与网络模型训练过程中的预处理过程一致)
transforms = transforms.Compose([transforms.ToTensor(), # 把图片进行归一化,并把数据转换成Tensor类型transforms.Grayscale(1) # 把图片 转为灰度图
])
path = r'train_data'
data_train = datasets.ImageFolder(path, transform=transforms)
data_loader = DataLoader(data_train, batch_size=64, shuffle=True)
for i, data in enumerate(data_loader):images, labels = data# print(images.shape)# print(labels.shape)breakclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 9, 3) # in_channel , out_channel , kennel_size , strideself.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(9, 5, 3) # in_channel , out_channel , kennel_size , strideself.relu = nn.ReLU()self.fc1 = nn.Linear(27 * 27 * 5, 1200) # full connect 1self.fc2 = nn.Linear(1200, 64) # full connect 2self.fc3 = nn.Linear(64, 2) # full connect 3def forward(self, x):outputs = []x = self.maxpool(self.relu(self.conv1(x)))# outputs.append(x)x = self.maxpool(self.relu(self.conv2(x)))outputs.append(x)x = x.view(-1, 27 * 27 * 5)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return outputs# create model
model1 = Net()# load model weights加载预训练权重
# model_weight_path ="./AlexNet.pth"
# model_weight_path = "model_name.pth"
# model1.load_state_dict(torch.load(model_weight_path))# 读取模型
model1 = torch.load('model_name.pth')x = images[0]# forward正向传播过程
out_put = model1(x)weights_keys = model1.state_dict().keys()
for key in weights_keys:print("key :", key)# 卷积核通道排列顺序 [kernel_number, kernel_channel, kernel_height, kernel_width]if key == "conv1.weight":weight_t = model1.state_dict()[key].numpy()print("weight_t.shape", weight_t.shape)k = weight_t[:, 0, :, :] # 获取第一个卷积核的信息参数# show 9 kernel ,1 channelplt.figure()for i in range(9):ax = plt.subplot(3, 3, i + 1) # 参数意义:3:图片绘制行数,5:绘制图片列数,i+1:图的索引plt.imshow(k[i, :, :], cmap='gray')title_name = 'kernel' + str(i) + ',channel1'plt.title(title_name)plt.show()if key == "conv2.weight":weight_t = model1.state_dict()[key].numpy()print("weight_t.shape", weight_t.shape)k = weight_t[:, :, :, :] # 获取第一个卷积核的信息参数print(k.shape)print(k)plt.figure()for c in range(9):channel = k[:, c, :, :]for i in range(5):ax = plt.subplot(2, 3, i + 1) # 参数意义:3:图片绘制行数,5:绘制图片列数,i+1:图的索引plt.imshow(channel[i, :, :], cmap='gray')title_name = 'kernel' + str(i) + ',channel' + str(c)plt.title(title_name)plt.show()
八、训练模型源代码
# https://blog.csdn.net/qq_53345829/article/details/124308515
import torch
from torchvision import transforms, datasets
import torch.nn as nn
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import torch.optim as optimtransforms = transforms.Compose([transforms.ToTensor(), # 把图片进行归一化,并把数据转换成Tensor类型transforms.Grayscale(1) # 把图片 转为灰度图
])path = r'train_data'
path_test = r'test_data'data_train = datasets.ImageFolder(path, transform=transforms)
data_test = datasets.ImageFolder(path_test, transform=transforms)print("size of train_data:",len(data_train))
print("size of test_data:",len(data_test))data_loader = DataLoader(data_train, batch_size=64, shuffle=True)
data_loader_test = DataLoader(data_test, batch_size=64, shuffle=True)for i, data in enumerate(data_loader):images, labels = dataprint(images.shape)print(labels.shape)breakfor i, data in enumerate(data_loader_test):images, labels = dataprint(images.shape)print(labels.shape)breakclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 9, 3) # in_channel , out_channel , kennel_size , strideself.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(9, 5, 3) # in_channel , out_channel , kennel_size , strideself.relu = nn.ReLU()self.fc1 = nn.Linear(27 * 27 * 5, 1200) # full connect 1self.fc2 = nn.Linear(1200, 64) # full connect 2self.fc3 = nn.Linear(64, 2) # full connect 3def forward(self, x):x = self.maxpool(self.relu(self.conv1(x)))x = self.maxpool(self.relu(self.conv2(x)))x = x.view(-1, 27 * 27 * 5)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return xmodel = Net()criterion = torch.nn.CrossEntropyLoss() # 损失函数 交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr=0.1) # 优化函数:随机梯度下降epochs = 10
for epoch in range(epochs):running_loss = 0.0for i, data in enumerate(data_loader):images, label = dataout = model(images)loss = criterion(out, label)optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()if (i + 1) % 10 == 0:print('[%d %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))running_loss = 0.0print('finished train')# 保存模型 torch.save(model.state_dict(), model_path)
torch.save(model.state_dict(), 'model_name1.pth') # 保存的是模型, 不止是w和b权重值# 读取模型
model = torch.load('model_name1.pth')
九、测试模型源代码
# https://blog.csdn.net/qq_53345829/article/details/124308515
import torch
from torchvision import transforms, datasets
import torch.nn as nn
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import torch.optim as optimtransforms = transforms.Compose([transforms.ToTensor(), # 把图片进行归一化,并把数据转换成Tensor类型transforms.Grayscale(1) # 把图片 转为灰度图
])path = r'train_data'
path_test = r'test_data'data_train = datasets.ImageFolder(path, transform=transforms)
data_test = datasets.ImageFolder(path_test, transform=transforms)print("size of train_data:", len(data_train))
print("size of test_data:", len(data_test))data_loader = DataLoader(data_train, batch_size=64, shuffle=True)
data_loader_test = DataLoader(data_test, batch_size=64, shuffle=True)
print(len(data_loader))
print(len(data_loader_test))class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 9, 3) # in_channel , out_channel , kennel_size , strideself.maxpool = nn.MaxPool2d(2, 2)self.conv2 = nn.Conv2d(9, 5, 3) # in_channel , out_channel , kennel_size , strideself.relu = nn.ReLU()self.fc1 = nn.Linear(27 * 27 * 5, 1200) # full connect 1self.fc2 = nn.Linear(1200, 64) # full connect 2self.fc3 = nn.Linear(64, 2) # full connect 3def forward(self, x):x = self.maxpool(self.relu(self.conv1(x)))x = self.maxpool(self.relu(self.conv2(x)))x = x.view(-1, 27 * 27 * 5)x = self.relu(self.fc1(x))x = self.relu(self.fc2(x))x = self.fc3(x)return x# 读取模型
model = Net()
model.load_state_dict(torch.load('model_name1.pth', map_location='cpu')) # 导入网络的参数# model_load = torch.load('model_name1.pth')
# https://blog.csdn.net/qq_41360787/article/details/104332706correct = 0
total = 0
with torch.no_grad(): # 进行评测的时候网络不更新梯度for data in data_loader_test: # 读取测试集images, labels = dataoutputs = model(images)_, predicted = torch.max(outputs.data, 1) # 取出 最大值的索引 作为 分类结果total += labels.size(0) # labels 的长度correct += (predicted == labels).sum().item() # 预测正确的数目
print('Accuracy of the network on the test images: %f %%' % (100. * correct / total))# "_," 的解释 https://blog.csdn.net/weixin_48249563/article/details/111387501
人工智能-作业6:CNN实现XO识别相关推荐
- NNDL 作业6:基于CNN的XO识别
实现卷积-池化-激活 Numpy版本:手工实现 卷积-池化-激活 自定义卷积算子.池化算子实现,源码如下: import numpy as npx = np.array([[-1, -1, -1, - ...
- 作业6:基于CNN的XO识别 深度学习 手搓卷积代码
目录 一.实现卷积 池化 激活 代码 1.numpy版本 生成图像 卷积核生成 卷积操作 池化操作 最大池化 平均池化 激活操作 2.pytorch版本(利用pytorch框架) 2.1相关函数 2. ...
- 【2021-2022 春学期】人工智能-作业6:CNN实现XO识别
文章目录 一.数据集 二.构建模型 三.训练模型 四.测试训练好的模型 五.计算模型准确率 六.查看训练好模型的特征图 七.查看卷积核 八.源码 1.训练模型源码 2.测试模型源码 一.数据集 二.构 ...
- 【机器学习/人工智能】 大作业:手写数字识别系统
写在前面 参考的是https://zh.d2l.ai/index.html 一.大作业设计目的与要求 (1)利用所学习的聚类算法完成简单的图像分割系统. (2)编程并利用相关软件完成大作业测试,得到实 ...
- Python仿真及应用结课大作业—基于CNN的手写数字识别与涂鸦识别
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.结课文档目录 二.涂鸦识别(篇幅问题只展示其一) 涂鸦识别 引入必要的库函数 导入数据 为各个数据文件添加标签 数 ...
- 2021年人工神经网络第四次作业 - 第二题MNIST手写体识别
简 介: ※MNIST数据集合是深度学习基础训练数据集合.改数据集合可以使用稠密前馈神经网络训练,也可以使用CNN.本文采用了单隐层BP网络和LeNet网络对于MNIST数据集合进行测试.实验结果标明 ...
- 使用Python+Tensorflow的CNN技术快速识别验证码
北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文 ...
- 深度学习100例-卷积神经网络(CNN)花朵识别 | 第4天
文章目录 一.前期工作 1. 设置GPU 2. 下载数据 3. 检查数据 二.数据预处理 1. 加载数据 2. 可视化数据 3. 再次检查数据 4. 配置数据集 三.构建CNN网络 四.编译 五.训练 ...
- 天池算法赛——广东电网智慧现场作业挑战赛 赛道三:识别高空作业及安全带佩戴
记录下第一次正式参加线上算法比赛的解题流程.虽然错过了B榜时间,但收获匪浅! 相关数据集及下文代码可见 识别高空作业及安全带_数据集及相关代码.txt 目录 项目介绍 数据处理 标签数据提取 标签数据 ...
最新文章
- 用pycharm写python_使用Pycharm编写第一个python程序
- 如何学习项目管理?项目管理工具有哪些?
- CPD和DESCR文件查看
- OvS v.s. OvS-DPDK v.s. VPP
- mysql yn 字段类型_mysql常用数据类型
- atlas安装需要kafka吗_Apache Atlas安装使用说明文档
- mysql多表成绩查询_MySQL多表数据记录查询(一)
- 人类附身机器人获得永生_脑机接口先驱尼古莱利斯:人类无法实现数字永生
- 数据库SQL语言类型(DQL.DML.DDL.DCL)
- 线下产品风控门道真不少
- LC-779 语法中的第k个字符
- 基于TCP协议的电子词典
- arduino雨滴传感器和舵机控制
- 计算机系统繁体环境,繁体简体转换
- Python 中的决策树
- Python:PDF文件处理(数据处理)
- 华为鸿蒙是诺基亚,诺基亚、三星前车之鉴,华为鸿蒙必须做好这两点
- 今日收获总结 (前端知识点3)
- 云慧计算机有限公司触屏,工业平板电脑触摸屏使用注意事项
- TensorFlow 高性能数据输入管道设计指南