#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project :实验二猫狗分类
@File :main.py
@Author :郑家祥
@Date :2021/5/17 21:57
@Description:
'''
import torch
import torchvision
from torch import nn
import torch.optim as optim
import torch.utils.data as Data
from tensorboardX import SummaryWriter
from data.CatDog import CatDog
from net import VGG16, ResNet50
import time
import torchvision.models as models
def sameNumber(y_hat, y):
'''
返回预测值与真实值相等的个数
'''
if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
y_hat = y_hat.argmax(axis=1)
cmp = y_hat.type(y.dtype) == y
return float(cmp.type(y.dtype).sum())
class Accumulator():
'''
构建n列变量,每列累加,便于计算准确率与损失
'''
def __init__(self, n):
self.data = [0.0] * n
def add(self, *args):
self.data = [a + float(b) for a, b in zip(self.data, args)]
def reset(self):
self.data = [0.0] * len(self.data)
def __getitem__(self, index):
return self.data[index]
def train(net, batch_size, lr, epochs, device, trainwriter, validatewriter, pre_model_path=None):
"""
描述:训练模型并使用验证数据集验证
"""
# step1: 模型初始化
if pre_model_path:
net.load(pre_model_path)
else:
def init(m):
if type(m) == nn.Linear or type(m) == nn.Conv2d:
nn.init.xavier_normal_(m.weight)
net.apply(init)
net.to(device)
#step2: 训练数据与验证数据
data = CatDog(root=r'data\train', train=True)
train_data, validate_data = Data.random_split(data, [int(0.7 * len(data)), int(0.3 * len(data))])
train_loader = Data.DataLoader(train_data, batch_size, shuffle=True, num_workers=4)
validate_loader = Data.DataLoader(validate_data, batch_size, shuffle=True, num_workers=4)
#step3: 定义目标函数与优化器,规定学习率衰减规则
lossFun = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=lr, momentum=0.001)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', patience=5, verbose=True)
#step4: 训练,计算训练损失、准确率、验证损失、准确率
metric = Accumulator(3)
for epoch in range(epochs):
net.train()
for i, (X, y) in enumerate(train_loader):
X, y = X.to(device), y.to(device)
y_hat = net(X)
loss = lossFun(y_hat, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
with torch.no_grad():
metric.add(loss * X.shape[0], sameNumber(y_hat, y), X.shape[0])
train_loss = metric[0] / metric[2]
train_acc = metric[1] / metric[2]
trainwriter.add_scalar('Batch Loss', train_loss, (epoch * (len(train_data)/batch_size) + i))
if i % 50 == 0:
print('epoch: {:d}, batch: {:d}, Train Loss: {:.4f}, Train Accuracy: {:.4f}'.format(epoch, i, train_loss, train_acc))
scheduler.step(train_loss)
trainwriter.add_scalar('Epoch Loss', train_loss, epoch)
trainwriter.add_scalar('Accuracy', train_acc, epoch)
#验证,计算验证损失和准确率
validate_loss, validate_acc = validate(net, validate_loader, lossFun)
print('epoch: {:d}, Validate Loss: {:.4f}, Validate Accuracy: {:.4f}'.format(epoch, validate_loss, validate_acc))
validatewriter.add_scalar('Epoch Loss', validate_loss, epoch)
validatewriter.add_scalar('Accuracy', validate_acc, epoch)
#当验证准确度达到95%以上时保存模型
if validate_acc > 0.95:
net.save()
print("该模型是在第{}个epoch取得95%以上的验证准确率, 准确率为:{:.4f}".format(epoch, validate_acc))
#step5: 返回迭代完的模型用于测试
trainwriter.close()
validatewriter.close()
return net
def validate(net, data_loader, lossFun):
"""
描述:验证模型的准确率并计算损失
"""
net.eval()
metric = Accumulator(3)
for i, (X, y) in enumerate(data_loader):
X, y = X.to(device), y.to(device)
y_hat = net(X)
loss = lossFun(y_hat, y)
metric.add(loss * X.shape[0], sameNumber(y_hat, y), X.shape[0])
validate_loss = metric[0] / metric[2]
validate_acc = metric[1] / metric[2]
net.train()
return validate_loss, validate_acc
def test(net, batch_size, device, testwriter):
"""
描述:测试模型的准确率并计算损失
"""
#step1: 测试数据
test_data = CatDog(root=r'data\test', train=False)
test_loader = Data.DataLoader(test_data, batch_size, shuffle=True, num_workers=4)
#step2: 定义目标函数
lossFun = nn.CrossEntropyLoss()
#step3: 测试,计算测试损失和准确率
metric = Accumulator(3)
net.to(device)
for i, (X, y) in enumerate(test_loader):
X, y = X.to(device), y.to(device)
y_hat = net(X)
loss = lossFun(y_hat, y)
metric.add(loss * X.shape[0], sameNumber(y_hat, y), X.shape[0])
test_loss = metric[0] / metric[2]
test_acc = metric[1] / metric[2]
testwriter.add_scalar('Loss', test_loss, i)
testwriter.add_scalar('Accuracy', test_acc, i)
print('Test Loss: {:.4f}, Test Accuracy: {:.4f}'.format(test_loss, test_acc))
if __name__ == "__main__":
batch_size = 10
lr = 0.01
epochs = 100
device = torch.device('cuda' if torch.cuda.is_available else 'cpu')
#使用resnet50训练
net = ResNet50()
visdir = time.strftime( 'assets/visualize/' + net.modelName + '_%m%d_%H_%M')
trainwriter = SummaryWriter('{}/{}'.format(visdir, 'Train'))
validatewriter = SummaryWriter('{}/{}'.format(visdir, 'Validate'))
testwriter = SummaryWriter('{}/{}'.format(visdir, 'Test'))
trainedNet = train(net, batch_size, lr, epochs, device, trainwriter, validatewriter)
test(trainedNet, batch_size, device, testwriter)
'''
#使用resnet50预训练模型训练并测试
resnet50 = models.resnet50(pretrained=True)
numFit = resnet50.fc.in_features
resnet50.fc = nn.Linear(numFit, 2)
visdir = time.strftime( 'assets/visualize/' + 'ResNet50_pretrained' + '_%m%d_%H_%M')
trainwriter = SummaryWriter('{}/{}'.format(visdir, 'Train'))
validatewriter = SummaryWriter('{}/{}'.format(visdir, 'Validate'))
testwriter = SummaryWriter('{}/{}'.format(visdir, 'Test'))
trainedNet = train(resnet50, batch_size, lr, epochs, device, trainwriter, validatewriter)
test(trainedNet, batch_size, device, testwriter)
'''
'''
#使用vgg16训练
net = VGG16()
visdir = time.strftime('assets/visualize/' + net.modelName + '_%m%d_%H_%M')
trainwriter = SummaryWriter('{}/{}'.format(visdir, 'Train'))
validatewriter = SummaryWriter('{}/{}'.format(visdir, 'Validate'))
testwriter = SummaryWriter('{}/{}'.format(visdir, 'Test'))
trainedNet = train(net, batch_size, lr, epochs, device, trainwriter, validatewriter)
test(trainedNet, batch_size, device, testwriter)
'''
'''
#使用vgg预训练模型只更新全连接层参数训练并测试
vgg16 = models.vgg16(pretrained=True)
for parameter in vgg16.parameters():
parameter.requires_grad = False
vgg16.classifier = nn.Sequential(
nn.Linear(512 * 7 * 7, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 512),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(512, 2),
)
visdir = time.strftime('assets/visualize/' + 'VGG16_pretrained' + '_%m%d_%H_%M')
trainwriter = SummaryWriter('{}/{}'.format(visdir, 'Train'))
validatewriter = SummaryWriter(
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
深度学习作业_基于resnet50和vgg16网络pytorch框架实现猫狗分类完整源码+代码注释+实验报告.zip 猫狗分类,使用Kaggle猫狗分类的原始数据集,实现模型最终的准确率达到90%及以上。本实验的目的: 为了进一步掌握使用深度学习框架进行图像分类任务的具体流程如:读取数据、构造网络、训练和测试模型 掌握经典卷积神经网络VGG16、ResNet50的基本结构 【特别强调】 1、csdn上资源保证是完整最新,会不定期更新优化; 2、请用自己的账号在csdn官网下载,若通过第三方代下,博主不对您下载的资源作任何保证,且不提供任何形式的技术支持和答疑!!!
资源推荐
资源详情
资源评论

























收起资源包目录




















































共 28 条
- 1

onnx
- 粉丝: 1w+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 互联网科技创业计划书优秀ppt模板课件【精选模板】.ppt
- 电子商务营销大赛调查报(1).doc
- 图书管理系统开题报告(2)(1).docx
- 互联网+背景下我国农业服务业发展问题研究(1).docx
- 工程制图与CAD实践课程教学大纲(1).docx
- 关于高职计算机网络课程教学的一些探索(1).docx
- 人工智能在电气自动化中的应用(1).docx
- 网站图标租赁合同(1).docx
- 软件购销协议(1).doc
- 四川德恩机械互联网布局策划方案(1).doc
- 计算机科学与技术-家庭理财管理信息系统大学毕业论文(1).doc
- 关于电气自动化的节能技术研究(1).docx
- 计算机专业实习总结集锦15篇(1).doc
- 基于大数据中学习分析技术探究专业课程开发策略(1).docx
- 会计实务:财务会计制度及核算软件备案报告-2(1).doc
- 2022年专业技术人员继续教育作业题互联网时代企业的商业模式.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

- 1
- 2
- 3
前往页