文章目录

  • 一、 数据集
  • 二、构建模型
  • 三、训练模型
  • 四、测试训练好的模型
  • 五、计算模型准确率
  • 六、查看训练好模型的特征图
  • 八、训练模型源代码
  • 九、测试模型源代码

一、 数据集

在群中直接下载

二、构建模型

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识别相关推荐

  1. NNDL 作业6:基于CNN的XO识别

    实现卷积-池化-激活 Numpy版本:手工实现 卷积-池化-激活 自定义卷积算子.池化算子实现,源码如下: import numpy as npx = np.array([[-1, -1, -1, - ...

  2. 作业6:基于CNN的XO识别 深度学习 手搓卷积代码

    目录 一.实现卷积 池化 激活 代码 1.numpy版本 生成图像 卷积核生成 卷积操作 池化操作 最大池化 平均池化 激活操作 2.pytorch版本(利用pytorch框架) 2.1相关函数 2. ...

  3. 【2021-2022 春学期】人工智能-作业6:CNN实现XO识别

    文章目录 一.数据集 二.构建模型 三.训练模型 四.测试训练好的模型 五.计算模型准确率 六.查看训练好模型的特征图 七.查看卷积核 八.源码 1.训练模型源码 2.测试模型源码 一.数据集 二.构 ...

  4. 【机器学习/人工智能】 大作业:手写数字识别系统

    写在前面 参考的是https://zh.d2l.ai/index.html 一.大作业设计目的与要求 (1)利用所学习的聚类算法完成简单的图像分割系统. (2)编程并利用相关软件完成大作业测试,得到实 ...

  5. Python仿真及应用结课大作业—基于CNN的手写数字识别与涂鸦识别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.结课文档目录 二.涂鸦识别(篇幅问题只展示其一) 涂鸦识别 引入必要的库函数 导入数据 为各个数据文件添加标签 数 ...

  6. 2021年人工神经网络第四次作业 - 第二题MNIST手写体识别

    简 介: ※MNIST数据集合是深度学习基础训练数据集合.改数据集合可以使用稠密前馈神经网络训练,也可以使用CNN.本文采用了单隐层BP网络和LeNet网络对于MNIST数据集合进行测试.实验结果标明 ...

  7. 使用Python+Tensorflow的CNN技术快速识别验证码

    北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文                        ...

  8. 深度学习100例-卷积神经网络(CNN)花朵识别 | 第4天

    文章目录 一.前期工作 1. 设置GPU 2. 下载数据 3. 检查数据 二.数据预处理 1. 加载数据 2. 可视化数据 3. 再次检查数据 4. 配置数据集 三.构建CNN网络 四.编译 五.训练 ...

  9. 天池算法赛——广东电网智慧现场作业挑战赛 赛道三:识别高空作业及安全带佩戴

    记录下第一次正式参加线上算法比赛的解题流程.虽然错过了B榜时间,但收获匪浅! 相关数据集及下文代码可见 识别高空作业及安全带_数据集及相关代码.txt 目录 项目介绍 数据处理 标签数据提取 标签数据 ...

最新文章

  1. 用pycharm写python_使用Pycharm编写第一个python程序
  2. 如何学习项目管理?项目管理工具有哪些?
  3. CPD和DESCR文件查看
  4. OvS v.s. OvS-DPDK v.s. VPP
  5. mysql yn 字段类型_mysql常用数据类型
  6. atlas安装需要kafka吗_Apache Atlas安装使用说明文档
  7. mysql多表成绩查询_MySQL多表数据记录查询(一)
  8. 人类附身机器人获得永生_脑机接口先驱尼古莱利斯:人类无法实现数字永生
  9. 数据库SQL语言类型(DQL.DML.DDL.DCL)
  10. 线下产品风控门道真不少
  11. LC-779 语法中的第k个字符
  12. 基于TCP协议的电子词典
  13. arduino雨滴传感器和舵机控制
  14. 计算机系统繁体环境,繁体简体转换
  15. Python 中的决策树
  16. Python:PDF文件处理(数据处理)
  17. 华为鸿蒙是诺基亚,诺基亚、三星前车之鉴,华为鸿蒙必须做好这两点
  18. 今日收获总结 (前端知识点3)
  19. 云慧计算机有限公司触屏,工业平板电脑触摸屏使用注意事项
  20. TensorFlow 高性能数据输入管道设计指南

热门文章

  1. 3.图解排序算法(三)之堆排序
  2. Hive:从HDFS回收站恢复被删的表
  3. 64位 atol c linux_Linux_C函数参考
  4. js文件导入前端页面无法渲染的问题
  5. linux之虚拟文件系统源码分析(详解)
  6. 强制类型转换运算符的优先级
  7. 计算机的哪个盘用来玩游戏,玩游戏的电脑虚拟内存放在哪个盘更好
  8. 一文读懂舵机工作原理并运用(附代码)
  9. smart NAT和full-coneNAT的配置以及应用场景
  10. java输出月份对应的季节