前言

本文介绍使用神经网络进行实战。

使用的代码是《零基础学习人工智能—Python—Pytorch学习(九)》里的代码。

代码实现

mudule定义

首先我们自定义一个module,创建一个torch_test17_Model.py文件(这个module要单独用个py文件定义),如下:

import torch.nn as nn
import torch.nn.functional as F class ConvNet(nn.Module):
def __init__(self):
super(ConvNet, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16*5*5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10) def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16*5*5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
return x

module创建

编写创建module的py文件,代码如下:

import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
import torch_test17_Model as tm device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') input_size = 784
hidden_size = 100
num_classes = 10
batch_size = 100
learning_rate = 0.001
num_epochs = 200 # 要训练200-400轮效果最好 transform = transforms.Compose(
[transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) train_dataset = torchvision.datasets.CIFAR10(
root='./data', train=True, download=True, transform=transform) train_loader = torch.utils. data.DataLoader(
dataset=train_dataset, batch_size=batch_size, shuffle=True) model = tm.ConvNet().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) n_total_steps = len(train_loader)
print("number total epochs(训练的回合):",num_epochs)
print("number total steps(训练的次数):",n_total_steps) for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
# images.shape: torch.Size([100, 3, 32, 32])
# images张量的四个维度是(B, C, H, W)
# B 是批量大小(即图像的数量)。
# C 是图像的通道数(例如,RGB 图像的通道数是 3)。
# H 和 W 分别是图像的高度和宽度。
print("images.shape:", images.shape) #100行,后面的维度是3,32,32。这个是图片信息。
# lables是对应images这100个图片的标签
print("labels.shape:", labels.shape)
print("labels[0].item():", labels[0].item()) # 输出例子 labels[0].item()=6
images = images.to(device)
labels = labels.to(device)
# 前向传播
outputs = model(images)
loss = criterion(outputs, labels)
print("loss.item()",loss.item()) # 输出例子 loss.item()=2.300053596496582
# 逆向传播和优化
optimizer.zero_grad()
loss.backward() ##执行逆向传播 会使用criterion的函数关系求偏导,然后把x的值,带入偏导公式求值,然后再乘以loss,得到新x值
optimizer.step()
print(f'训练轮次Epoch [{epoch}/{num_epochs}], Step [{i+1}/{n_total_steps}], Loss: {loss.item():.4f}')
print('==================')
print('训练结束') filePath = "model.pth" #没有路径,会保存到python文件所在目录
torch.save(model, filePath)
print('保存完成')

代码会输出loss的值,我们要重点关注这个值。

Loss 值越大,表示模型的预测与真实标签之间的差距较大,模型的性能较差。

Loss 值越小,表示模型的预测更接近真实标签,性能逐渐提高。

即,loss值接近0的时候,这个模型就可以用了。

module使用

编写使用module验证图片的py文件,注意要引用torch_test17_Model.py文件,代码如下:

import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn.functional as F
import torch_test17_Model as tm device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') batch_size = 100 transform = transforms.Compose(
[transforms.Resize((32, 32)),# 如果预测时处理的图片尺寸与训练时不同,如评估输入的图片尺寸为 [100, 3, 64, 64],而模型训练使用的尺寸是 [100, 3, 32, 32],可以用這個转换一下
transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) test_dataset = torchvision.datasets.CIFAR10(
root='./data', train=False, download=True, transform=transform) test_loader = torch.utils.data.DataLoader(
dataset=test_dataset, batch_size=batch_size, shuffle=False) filePath = "model.pth" #没有路径,会保存到python文件所在目录
model = torch.load(filePath,weights_only=False)
model.eval() # 切换到评估模式 ############################使用阈值判断######################################
threshold = 0.7 # 设定一个阈值,表示模型的信心度,用阈值判断的话,要求模型必须更精确,如果只是两轮的训练,会出现全部判定不过去的情况
with torch.no_grad():
for images, labels in test_loader:
print("############################判断######################################")
images = images.to(device)
labels = labels.to(device)
outputs = model(images)
print("outputs.shape",outputs.shape)
# 计算 softmax 概率
probabilities = F.softmax(outputs, dim=1) max_probs, predicted = torch.max(probabilities, 1)
for i in range(len(predicted)):
if max_probs[i] < threshold: # 如果置信度低于阈值,认为是未知类别
print(f"图片 {i} 被认为是未知类别,置信度 {max_probs[i]:.4f}")
else:
print(f"图片 {i} 被认为是类别 {predicted[i]},置信度 {max_probs[i]:.4f}")

判断图片是什么的时候,使用阈值模式。

结语

到此,我们对于神经网络,卷积神经网络,深度网络都有了一定了解。

然后我们就可以继续学习transformer了。


传送门:

零基础学习人工智能—Python—Pytorch学习—全集


注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!



若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

https://www.cnblogs.com/kiba/p/18609581

零基础学习人工智能—Python—Pytorch学习(十二)的更多相关文章

  1. 如何零基础开始自学Python编程

    转载——原作者:赛门喵 链接:https://www.zhihu.com/question/29138020/answer/141170242 0. 明确目标 我是真正零基础开始学Python的,从一 ...

  2. 零基础快速掌握Python系统管理视频课程【猎豹网校】

    点击了解更多Python课程>>> 零基础快速掌握Python系统管理视频课程[猎豹网校] 课程目录 01.第01章 Python简介.mp4 02.第02章 IPython基础.m ...

  3. 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

    进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...

  4. 零基础的人该怎么学习JAVA

    对于JAVA有所兴趣但又是零基础的人,该如何学习JAVA呢?对于想要学习开发技术的学子来说找到一个合适自己的培训机构是非常难的事情,在选择的过程中总是  因为这样或那样的问题让你犹豫不决,阻碍你前进的 ...

  5. 零基础如何学Python爬虫技术?

    在作者学习的众多编程技能中,爬虫技能无疑是最让作者着迷的.与自己闭关造轮子不同,爬虫的感觉是与别人博弈,一个在不停的构建 反爬虫 规则,一个在不停的破译规则. 如何入门爬虫?零基础如何学爬虫技术?那前 ...

  6. 零基础学完Python的7大就业方向,哪个赚钱多?

    “ 我想学 Python,但是学完 Python 后都能干啥 ?” “ 现在学 Python,哪个方向最简单?哪个方向最吃香 ?” “ …… ” 相信不少 Python 的初学者,都会遇到上面的这些问 ...

  7. 零基础怎么学Python编程,新手常犯哪些错误?

    Python是人工智能时代最佳的编程语言,入门简单.功能强大,深获初学者的喜爱. 很多零基础学习Python开发的人都会忽视一些小细节,进而导致整个程序出现错误.下面就给大家介绍一下Python开发者 ...

  8. 零基础如何入门Python

    编程零基础如何学习Python 如果你是零基础,注意是零基础,想入门编程的话,我推荐你学Python.虽然国内基本上是以C语言作为入门教学,但在麻省理工等国外大学都是以Python作为编程入门教学的. ...

  9. 零基础自学人工智能,看这些资料就够了(300G资料免费送)

    为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ...

  10. 零基础自学用Python 3开发网络爬虫

    原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...

随机推荐

  1. [OI] 交互 | pipe

    关于如何在本地实现交互 管道 Linux 内置了一种管道操作,可以方便地把 \(A\) 程序的输出和 \(B\) 程序的输入连接起来,只需要以下指令: A | B 此代码行的意思是:同时运行 \(A\ ...

  2. Passwords

    详见 此处 Header File 0*)1190*+0**0).0970)/0)/111105000

  3. laravel框架接口

    下面是增删改查的接口,在使用过程中按自己需求对代码进行更改 控制器代码 <?php namespace App\Http\Controllers; use App\Models\Fang; us ...

  4. DevNow: Search with Lunrjs

    前言 假期真快,转眼国庆假期已经到了最后一天.这次国庆没有出去玩,在北京看了看房子,原先的房子快要到期了,找了个更加通透一点的房子,采光也很好. 闲暇时间准备优化下 DevNow 的搜索组件,经过上一 ...

  5. 2021年7月国产数据库排行榜:openGauss成绩依旧亮眼,Kingbase向Top 10发起冲刺

    7月份的国产数据库流行度排行榜已经揭晓.本期榜单展示的136个数据库中,近三分之二实现了评分增长.笔者认为这与6月份中国信通院发布第十二批大数据产品能力评测结果有关,65家企业的120款产品通过了本次 ...

  6. docker-compose -- 创建 redis && mysql

    version: '3' services: nest-admin-web: image: buqiyuan/vue3-antdv-admin:stable container_name: nest- ...

  7. vue 组件中使用 scoped 有的样式不会生效 解决办法

    造成原因:组件的嵌套导致 : 解决:

  8. OpenGL RHI优化

    前言 随着Vulkan的普及,OpenGL已经在被慢慢淘汰,更轻的API调用可以节省不少性能,尤其是在移动平台上,可以减少CPU开销,进而减少功耗.看起来很完美,但是问题是目前移动平台Vulkan驱动 ...

  9. 神经网络之卷积篇:详解残差网络(ResNets)(Residual Networks (ResNets))

    详解残差网络 ResNets是由残差块(Residual block)构建的,首先解释一下什么是残差块. 这是一个两层神经网络,在\(L\)层进行激活,得到\(a^{\left\lbrack l + ...

  10. 妙用编辑器:把EverEdit变成计算器

    妙用编辑器:把EverEdit变成计算器 应用场景 日常工作过程中,会存在需要计算一些数据的场景,调用系统的计算器当然可以完成这项工作,但是需要来回切换,且系统自带的计算器没有表达式计算功能,真是不方 ...