6.Vgg16--CNN经典网络模型详解(pytorch实现)

embedded/2024/9/23 9:34:59/

1.首先建立一个model.py文件,用来写神经网络,代码如下:

import torch
import torch.nn as nn
class My_VGG16(nn.Module):def __init__(self,num_classes=5,init_weight=True):super(My_VGG16, self).__init__()# 特征提取层self.features = nn.Sequential(nn.Conv2d(in_channels=3,out_channels=64,kernel_size=3,stride=1,padding=1),nn.Conv2d(in_channels=64,out_channels=64,kernel_size=3,stride=1,padding=1),nn.MaxPool2d(kernel_size=2,stride=2),nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1),nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, stride=1, padding=1),nn.MaxPool2d(kernel_size=2, stride=2),nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1),nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1),nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1),nn.MaxPool2d(kernel_size=2,stride=2),nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),nn.MaxPool2d(kernel_size=2, stride=2),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),nn.MaxPool2d(kernel_size=2, stride=2),)# 分类层self.classifier = nn.Sequential(nn.Linear(in_features=7*7*512,out_features=4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(in_features=4096,out_features=4096),nn.ReLU(),nn.Dropout(0.5),nn.Linear(in_features=4096,out_features=num_classes))# 参数初始化if init_weight: # 如果进行参数初始化for m in self.modules():  # 对于模型的每一层if isinstance(m, nn.Conv2d): # 如果是卷积层# 使用kaiming初始化nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu")# 如果bias不为空,固定为0if m.bias is not None:nn.init.constant_(m.bias, 0)elif isinstance(m, nn.Linear):# 如果是线性层# 正态初始化nn.init.normal_(m.weight, 0, 0.01)# bias则固定为0nn.init.constant_(m.bias, 0)def forward(self,x):x = self.features(x)x = torch.flatten(x,1)result = self.classifier(x)return result

2.下载数据集

DATA_URL = 'http://download.tensorflow.org/example_images/flower_photos.tgz'

3.下载完后写一个spile_data.py文件,将数据集进行分类

#spile_data.py
import os
from shutil import copy
import randomdef mkfile(file):if not os.path.exists(file):os.makedirs(file)file = 'flower_data/flower_photos'
flower_class = [cla for cla in os.listdir(file) if ".txt" not in cla]
mkfile('flower_data/train')
for cla in flower_class:mkfile('flower_data/train/'+cla)mkfile('flower_data/val')
for cla in flower_class:mkfile('flower_data/val/'+cla)split_rate = 0.1
for cla in flower_class:cla_path = file + '/' + cla + '/'images = os.listdir(cla_path)num = len(images)eval_index = random.sample(images, k=int(num*split_rate))for index, image in enumerate(images):if image in eval_index:image_path = cla_path + imagenew_path = 'flower_data/val/' + clacopy(image_path, new_path)else:image_path = cla_path + imagenew_path = 'flower_data/train/' + clacopy(image_path, new_path)print("\r[{}] processing [{}/{}]".format(cla, index+1, num), end="")  # processing barprint()print("processing done!")

之后应该是这样:
在这里插入图片描述

4.再写一个train.py文件,用来训练模型

import torch
import torch.nn as nn
from torchvision import transforms, datasets
import json
import os
import torch.optim as optim
from model import My_VGG16device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
data_transform = {"train": transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),"val": transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])}data_root = os.getcwd() # get data root path
image_path = data_root + "/flower_data/"  # flower data set path
train_dataset = datasets.ImageFolder(root=image_path+"train",transform=data_transform["train"])
train_num = len(train_dataset)# {'daisy':0, 'dandelion':1, 'roses':2, 'sunflower':3, 'tulips':4}
flower_list = train_dataset.class_to_idx
cla_dict = dict((val, key) for key, val in flower_list.items())cla_dict = dict((val, key) for key, val in flower_list.items())
# write dict into json file
json_str = json.dumps(cla_dict, indent=4)
with open('class_indices.json', 'w') as json_file:json_file.write(json_str)batch_size = 16train_loader = torch.utils.data.DataLoader(train_dataset,batch_size=batch_size, shuffle=True,num_workers=0)validate_dataset = datasets.ImageFolder(root=image_path + "val",transform=data_transform["val"])
val_num = len(validate_dataset)
validate_loader = torch.utils.data.DataLoader(validate_dataset,batch_size=batch_size, shuffle=False,num_workers=0)
net = My_VGG16(num_classes=5)# load pretrain weights
model_weight_path = "./vgg16.pth"
pre_weights = torch.load(model_weight_path)net.to(device)loss_function = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.0001)best_acc = 0.0
save_path = './vgg16_train.pth'for epoch in range(5):# trainnet.train()running_loss = 0.0for step, data in enumerate(train_loader, start=0):images, labels = dataoptimizer.zero_grad()logits = net(images.to(device))#.to(device)print("===>",logits.shape,labels.shape)loss = loss_function(logits, labels.to(device))loss.backward()optimizer.step()# print statisticsrunning_loss += loss.item()# print train processrate = (step+1)/len(train_loader)a = "*" * int(rate * 50)b = "." * int((1 - rate) * 50)print("\rtrain loss: {:^3.0f}%[{}->{}]{:.4f}".format(int(rate*100), a, b, loss), end="")print()# validatenet.eval()acc = 0.0  # accumulate accurate number / epochwith torch.no_grad():for val_data in validate_loader:val_images, val_labels = val_dataoutputs = net(val_images.to(device))  # eval model only have last output layer# loss = loss_function(outputs, test_labels)predict_y = torch.max(outputs, dim=1)[1]acc += (predict_y == val_labels.to(device)).sum().item()val_accurate = acc / val_numif val_accurate > best_acc:best_acc = val_accuratetorch.save(net.state_dict(), save_path)print('[epoch %d] train_loss: %.3f  test_accuracy: %.3f' %(epoch + 1, running_loss / step, val_accurate))print('Finished Training')


http://www.ppmy.cn/embedded/21188.html

相关文章

conda 与 pip 工具笔记

前言 conda与pip是Python开发中常用的两种工具,conda本质是环境、包管理工具,pip是包管理工具,两者的功能有一定的重叠。本文主要记录开发工作中与两者相关的使用说明与注意事项。 推荐用conda创建隔离的虚拟环境,用pip进行包安…

合肥高新区党工委委员、管委会副主任方向民一行调研昂辉科技

4月24日,合肥高新区党工委委员、管委会副主任方向民,合肥高新区经发局产业处处长王佳奇,产业创新处陈珂,合肥高投投资管理二部副总经理张雪松,兴泰资本章延隽一行莅临昂辉科技调研指导。昂辉科技董事长方菱、总经理徐封…

python Django中分配库存给用户包括定义库存模型、用户模型、以及一个用于分配库存的逻辑

在Django中分配库存给用户通常涉及几个步骤,包括定义库存模型、用户模型、以及一个用于分配库存的逻辑。以下是一个基本的示例来说明如何执行这个过程: 1. 定义模型 首先,你需要定义两个模型:一个是User模型(可以使用…

创建SpringBoot和RabbitMQ的整合项目

文章目录 创建SpringBoot和RabbitMQ的整合项目首先快速创建一个maven项目引入SpringBoot整合rabbitMQ的依赖在src/main目录下创建resources目录并引入配置文件写消息发送者MessageSender写消息接收者MessageReceiver写RabbitMQConfig配置类写SpringBoot启动主类CommandLineRunn…

Linux Makefile编写之静态库

1 概述 编译工具有很多(make/cmake/BJam)。如果不考虑跨平台的话,还是make比较方便。使用make编译需要编写Makefile。本文编写Makefile来生成C/C静态库。 2 Makefile文件命名 Makefile文件首先是一个文本文件,Linux下默认有两种命名方式: Makefile 这…

Elasticsearch概念 使用docker安装Elasticsearch和kibana

目录 一、Elasticsearch概念 倒排索引和正向索引 正向和倒排 二、ES安装 三、安装 kibana 四、IK分词器 下载ES中文分词器 扩展或停用词条 一、Elasticsearch概念 倒排索引和正向索引 正向索引 就像在mysql数据中搜索非主键字段的内容,就需要逐条数据的去查…

Golang Colly实现CSDN内容部分图片爬取

语言:Golang 库:Iris/Colly 日志输出: Received Url: https://blog.csdn.net/smile_sundays/article/details/137207581?spm=1001.2100.3001.7377&utm_medium=distribute.pc_feed_blog_category.none-task-bl og-classify_tag-4-137207581-null-null.nonecase&dep…

Q1笔记本电脑线上市场发展现状:大盘下滑,深耕细分市场是机会

今年,宏观经济环境的恶化和笔记本电脑需求的持续放缓,导致全球笔记本电脑出货量,尤其是线上市场的整体状态不容乐观。 根据鲸参谋数据显示,今年Q1笔记本在线上市场(京东天猫淘宝)综合销量约250万件&#x…