网络备份版本,怕自己忘了
## A。这个是基础的resnet50模型样本,后期需要改进
##### 需要改进的点有
1. ~~增加时间记录time(找一下其他的notebooks~~
2. 访问自己的数据集(使用ImageFolder)
3. 封装train和test函数(自己测试另一个版本)
4. 使用冻结训练层,提高准确度
5. 用不同的优化器和损失函数
- 使用可以让结果可视化的tensorboard或Xpytorch(极客里面和抖音工地防护检测)
7. 使用不同的分类结果,比如说换成二分类
8. ~~怎么查看cifra-10数据集~~
import time
start_time = time.time()
# 运行你的代码
# 加载CIFAR10数据集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=None)
# 显示第三张图片
image, label = trainset[2]
plt.imshow(image)
plt.show()
end_time = time.time()
print("程序运行时间:", end_time - start_time, "秒")
import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import matplotlib.pyplot as plt
from ResNet import Bottleneck, ResNet, ResNet50
#train和test的数据转换内容的不同的
# 训练集
transform_train = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomCrop(32, padding=4),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])
# 测试集
transform_test = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])
classes = ['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
net = ResNet50(10).to('cuda')#引入模型
# 定义损失函数和优化器,使用torch.nn中的CrossEntropyLoss类和torch.optim中的SGD类,并指定学习率等参数
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9, weight_decay=0.0001)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor = 0.1, patience=5)
EPOCHS = 200
for epoch in range(EPOCHS):
losses = []
running_loss = 0
for i, inp in enumerate(trainloader):
inputs, labels = inp #将数据分成x,y
inputs, labels = inputs.to('cuda'), labels.to('cuda')#将数据放入GPU里面
optimizer.zero_grad()#模型梯度清零
outputs = net(inputs)#记录模型输出结果
loss = criterion(outputs, labels)#记录损失函数值
losses.append(loss.item())# 累加损失值
loss.backward()
optimizer.step()
running_loss += loss.item()
if i%100 == 0 and i > 0:
print(f'Loss [{epoch+1}, {i}](epoch, minibatch): ', running_loss / 100)
running_loss = 0.0
avg_loss = sum(losses)/len(losses)
scheduler.step(avg_loss)
print('Training Done')
correct = 0
total = 0
with torch.no_grad():
for data in testloader:
images, labels = data
images, labels = images.to('cuda'), labels.to('cuda')
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print('Accuracy on 10,000 test images: ', 100*(correct/total), '%')