2023-11-30

news/发布时间2024/5/20 19:42:44
import torchvision
import torchvision.datasets as datasets
from torch import nn
from torch.utils.data import DataLoader
import torch
# 设置学习率和训练轮数
learning_rate = 1e-3
epoch = 50

# 准备数据集
train_data = datasets.ImageFolder('./data/train', transform=torchvision.transforms.Compose([
torchvision.transforms.Resize((32, 32)),
torchvision.transforms.ToTensor()
]))
test_data = datasets.ImageFolder('./data/test', transform=torchvision.transforms.Compose([
torchvision.transforms.Resize((32, 32)),
torchvision.transforms.ToTensor()
]))

train_data_size = len(train_data)
test_data_size = len(test_data)

train_dataloader = DataLoader(train_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)

# 搭建神经网络
class Tudui(nn.Module):
def __init__(self):
super(Tudui, self).__init__()
self.model = nn.Sequential(
nn.Conv2d(3, 32, 5, 1, 2),
nn.MaxPool2d(2),
nn.Conv2d(32, 32, 5, 1, 2),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 5, 1, 2),
nn.MaxPool2d(2),
nn.Conv2d(64, 64, 5, 1, 2),
nn.MaxPool2d(2),
nn.Flatten(),
nn.Linear(64 * 2 * 2, 128),
nn.Linear(128, 64),
nn.Linear(64, 5)
)
self.dropout = nn.Dropout(0.5)

def forward(self, x):
x = self.model(x)
x = self.dropout(x)
return x

tudui = Tudui()

loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(tudui.parameters(), lr=learning_rate)

total_train_step = 0
total_test_step = 0

for i in range(epoch):
print("-------第 {} 轮训练开始-------".format(i+1))

# 训练步骤开始
tudui.train()
for data in train_dataloader:
imgs, targets = data
outputs = tudui(imgs)
loss = loss_fn(outputs, targets)

optimizer.zero_grad()
loss.backward()
optimizer.step()

total_train_step += 1
if total_train_step % 100 == 0:
print("训练次数:{}, Loss: {}".format(total_train_step, loss.item()))

# 测试步骤开始
tudui.eval()
total_test_loss = 0
correct_predictions = 0
total_samples = 0
with torch.no_grad():
for data in test_dataloader:
imgs, targets = data
outputs = tudui(imgs)
loss = loss_fn(outputs, targets)
total_test_loss += loss.item()
_, predicted = torch.max(outputs, 1)
correct_predictions += (predicted == targets).sum().item()
total_samples += targets.size(0)

print("整体测试集上的Loss: {}".format(total_test_loss))
print("整体测试集上的正确率: {}".format(correct_predictions / total_samples))
total_test_step += 1
torch.save(tudui, "tudui_{}.pth".format(i))
print("模型已保存")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/75715747.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

[Codeforces] CF1591C Minimize Distance

CF1591C Minimize Distance 题目 一条线上有 \(n\) (\(1 \le n \le 2 \cdot 10^5\))个仓库,第 \(i\) 个仓库的位置是 \(x_i\) (\(1 \le i \le n\))。 你有 \(n\) 箱货物,要分别运到这 \(n\) 个仓库里。你的初始位置在点 \(0\) ,一次可以携带 \(k\) (\(1 \le k \le n\))…

python内置方法

【整型的内置方法】 【浮点型】 【数字类型判断】 【字符串】 【列表类型】

6How To Use Messages With Flask - Flask Fridays #6 10:43

消息闪现 消息闪现{% for message in get_flashed_messages() %} <div class="alert alert-success alert-dismissible fade show" role="alert"> {{ message }} <button type="button" class="btn-close" data…

秦疆的Java课程笔记:50 方法 递归讲解

一般情况下,我们用A方法调用B方法。 递归就是,A方法调用A方法,自己调用自己。 利用递归可以用简单的程序来解决一些复杂的问题。通常把一个大型复杂的问题转化为一个与原问题相似的规模较小的问题来求解,递归策略只需要少量的程序就可描述出解题过程所需要的多此重复计算,…

ModbusTCP转Profinet网关

Modbus Tcp转Profinet网关XD-ETHPN20可以将Modbus TCP设备连接到Profinet网络,支持多种应用场景。用户无需了解Profinet协议细节,即可实现与现场总线PROFINET的互连。ModbusTCP转Profinet网关Modbus tcp转profinet网关XD-ETHPN20网关可以将Modbus TCP接口设备连接到Profinet网…

汇编-数据结构

.386 .model flat,stdcall option casemap:none .stack 4096include windows.incExitProcess PROTO,dwExitCode:DWORD STUDENT struct ;自定义数据结构 name DWORD ? ID DWORD ? STUDENT ends.data stwndclass WNDCLASS <> ;末初始化stwndclass1 WNDCLASS &…