Pytorch卷积神经网络resent网络实践

作者:浅念念52 时间:2022-01-21 02:08:42 

前言

上篇文章,讲了经典卷积神经网络-resnet,这篇文章通过resnet网络,做一些具体的事情。

一、技术介绍

总的来说,第一步首先要加载数据集,对数据进行一些处理,第二步,调整学习率一些参数,训练好resnet网络模型,第三步输入图片或者视频通过训练好的模型,得到结果。

二、实现途径

1.加载数据集,对数据进行处理,加载的图片是(N,C,H,W )对图片进行处理成(C,H,W),通过图片名称获取标签,进行分类。

Pytorch卷积神经网络resent网络实践

train_paper=r'E:\桌面\资料\cv3\数据集\罚拳_公开\train\paper'
train_rock=r'E:\桌面\资料\cv3\数据集\罚拳_公开\train\rock'
train_scissors=r'E:\桌面\资料\cv3\数据集\罚拳_公开\train\scissors'
test_paper=r'E:\桌面\资料\cv3\数据集\罚拳_公开\test\paper'
test_rock=r'E:\桌面\资料\cv3\数据集\罚拳_公开\test\rock'
test_scission=r'E:\桌面\资料\cv3\数据集\罚拳_公开\test\scissors'
Batch_files=10
transs=trans.Compose([
   trans.ToTensor(),
   trans.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))
])
def read_img(batch_files):
   images=[]
   labels=[]
   for file in batch_files:
       image=Image.open(file)
       image=image.convert('RGB')
       image=image.resize((64,64))
       tensor=transs(image)
       images.append(tensor)
       if 'rock' in file :
           labels.append(torch.tensor(0,dtype=torch.int64))
       if 'paper' in file:
           labels.append(torch.tensor(1,dtype=torch.int64))
       if 'scissors' in file:
           labels.append(torch.tensor(2,dtype=torch.int64))
   return images,labels
if __name__ == '__main__':

2.写入resnet模型:

这里用的是resnet18

class tiao(nn.Module):
   def __init__(self,shuru,shuchu):
       super(tiao, self).__init__()
       self.conv1=nn.Conv2d(in_channels=shuru,out_channels=shuchu,kernel_size=(3,3),padding=(1,1))
       self.bath=nn.BatchNorm2d(shuchu)
       self.relu=nn.ReLU()
   def forward(self,x):
       x1=self.conv1(x)
       x2=self.bath(x1)
       x3=self.relu(x2)
       x4=self.conv1(x3)
       x5=self.bath(x4)
       x6=self.relu(x5)
       x7=x6+x
       return x7
class tiao2(nn.Module):
   def __init__(self,shuru):
       super(tiao2, self).__init__()
       self.conv1=nn.Conv2d(in_channels=shuru,out_channels=shuru*2,kernel_size=(3,3),stride=(2,2),padding=(1,1))
       self.conv11=nn.Conv2d(in_channels=shuru,out_channels=shuru*2,kernel_size=(1,1),stride=(2,2))
       self.batch=nn.BatchNorm2d(shuru*2)
       self.relu=nn.ReLU()
       self.conv2=nn.Conv2d(in_channels=shuru*2,out_channels=shuru*2,kernel_size=(3,3),stride=(1,1),padding=(1,1))
   def forward(self,x):
       x1=self.conv1(x)
       x2=self.batch(x1)
       x3=self.relu(x2)
       x4=self.conv2(x3)
       x5=self.batch(x4)
       x6=self.relu(x5)
       x11=self.conv11(x)
       x7=x11+x6
       return x7
class resnet18(nn.Module):
   def __init__(self):
       super(resnet18, self).__init__()
       self.conv1=nn.Conv2d(in_channels=3,out_channels=64,kernel_size=(7,7),stride=(2,2),padding=(3,3))
       self.bath=nn.BatchNorm2d(64)
       self.relu=nn.ReLU()
       self.max=nn.MaxPool2d(2,2)
       self.tiao1=tiao(64,64)
       self.tiao2=tiao(64,64)
       self.tiao3=tiao2(64)
       self.tiao4=tiao(128,128)
       self.tiao5=tiao2(128)
       self.tiao6=tiao(256,256)
       self.tiao7=tiao2(256)
       self.tiao8=tiao(512,512)
       self.a=nn.AdaptiveAvgPool2d(output_size=(1,1))
       self.l=nn.Linear(512,3)
   def forward(self,x):
       x1=self.conv1(x)
       x2=self.bath(x1)
       x3=self.relu(x2)
       x4=self.tiao1(x3)
       x5=self.tiao2(x4)
       x6=self.tiao3(x5)
       x7=self.tiao4(x6)
       x8=self.tiao5(x7)
       x9=self.tiao6(x8)
       x10=self.tiao7(x9)
       x11=self.tiao8(x10)
       x12=self.a(x11)
       x13=x12.view(x12.size()[0],-1)
       x14=self.l(x13)
       return x14

第三步:调用读取数据函数,读取数据,打乱,开始训练:

train_rock=[os.path.join(train_rock,file) for file in os.listdir(train_rock)]
   train_paper= [os.path.join(train_paper, file) for file in os.listdir(train_paper)]
   train_scissors = [os.path.join(train_scissors, file) for file in os.listdir(train_scissors)]
   test_rock=[os.path.join(test_rock,file) for file in os.listdir(test_rock)]
   test_paper=[os.path.join(test_paper,file) for file in os.listdir(test_paper)]
   test_scission=[os.path.join(test_scission,file) for file in os.listdir(test_scission)]
   train=train_rock+train_paper+train_scissors
   test=test_rock+test_paper+test_scission
   random.shuffle(train)
   random.shuffle(test)
   model=resnet18().cuda()
   opt = torch.optim.ASGD(model.parameters(), lr=0.001, weight_decay=0.8)
   loss = nn.CrossEntropyLoss()
   print("开始训练")

第四步:训练模型,完成后保存模型:

for i in range(5):
       running_loss=0
       for index in range(0,len(train),Batch_files):
           images,labels=read_img(train[index:index+Batch_files])
           inputs=torch.stack(images,0).cuda()
           labels=torch.stack(labels,0).cuda()
           inputs, labels = Variable(inputs), Variable(labels)
           opt.zero_grad()
           h=model(inputs)
           loss1=loss(h,labels)
           loss1.backward()
           opt.step()
           running_loss+=loss1.item()
           if index%41==40:
               avg_loos=running_loss/41
               running_loss=0
               print('avg_loss',avg_loos)
           if index%101==99:
               test_files=random.sample(test,100)
               test_image,test_label=read_img(test_files)
               test_images=torch.stack(test_image,0).cuda()
               test_labels=torch.stack(test_label,0).cuda()
               test_h=model(test_images)
               _,prediction=torch.max(test_h.data,1)
               total=test_labels.size(0)
               correct=(prediction==test_labels).sum()
               print('100张测试集准确率%d %%'%(100*correct/total))
   torch.save(model.state_dict(),'resnet_caiq猜拳.pth')

Pytorch卷积神经网络resent网络实践

第五步:加载模型,进行测试:

model.load_state_dict(torch.load('resnet_caiq猜拳.pth'))
labels={0:'rock',1:'paper',2:'scissors'}
   images=[]
   image=Image.open(r'E:\桌面\1.png')
   image=image.convert('RGB')
   image=image.resize((64,64))
   image=transs(image)
   images.append(image)
   image= torch.stack(images, 0).cuda()
   label=model(image)
   _,prediction=torch.max(label.data,1)
   print("预测类别",labels[prediction.item()])

Pytorch卷积神经网络resent网络实践

Pytorch卷积神经网络resent网络实践

三、总结

本文只是简单介绍了,通过pytorch训练resnet模型。调用训练好的模型,对图片,视频,摄像头进行检测。

本文只是简单对图片进行检测,得到预测结果。

在这里运用了resnet18模型进行训练,其实还有更好的模型,得到更好的训练结果。

在目标检测领域,最著名的是YOLO,检测速度非常快,在实时检测领域很受欢迎,在一些游戏上,可以通过YOLO脚本,实现自动锁定,追踪之类的,比如现在欢迎的吃鸡游戏,玩家通过脚本,实现自动识别人,进行射击操作。在yolov3中,作者提到过yolo已经运用到军事中,出于道德层面的考虑,作者暂停了yolo的更新,在这之后v4,v5,v6以及之后的版本都是一些大佬接棒的。

在实时检测中,现在AI在一些方面已经超越人类了,在准确率上虽然人脑的高层次演绎归纳能力是远胜于AI的,但是在低级信息处理速度和精确度上,人类就很难比得过专精某个功能的AI了。

来源:https://blog.csdn.net/Lightismore/article/details/124713535

标签:Pytorch,卷积神经网络,resent
0
投稿

猜你喜欢

  • ThinkPHP3.0略缩图不能保存到子目录的解决方法

    2024-04-30 08:47:06
  • JS脚本加载后执行相应回调函数的操作方法

    2024-04-17 10:23:07
  • 为vue项目自动设置请求状态的配置方法

    2024-04-30 10:44:26
  • Django2.1.3 中间件使用详解

    2023-11-06 19:46:00
  • 五个Python迷你版小程序附代码

    2023-09-28 02:55:26
  • Linux下指定mysql数据库数据配置主主同步的实例

    2024-01-16 09:10:37
  • django中的ajax组件教程详解

    2023-11-19 00:59:32
  • 解决Pycharm调用Turtle时 窗口一闪而过的问题

    2023-05-06 14:46:29
  • 如何给eWebEditor编辑器加上运行代码框功能

    2007-09-25 07:02:00
  • 网页特效文字之—粗糙字

    2013-07-23 04:34:56
  • XML的简单读取与写入

    2008-09-04 10:35:00
  • 通过pycharm使用git的步骤(图文详解)

    2023-07-24 14:43:21
  • Python实现上下班抢个顺风单脚本

    2021-01-12 15:56:51
  • django与小程序实现登录验证功能的示例代码

    2023-08-04 01:06:58
  • python去除字符串中空格的6种常用方法

    2023-09-25 12:36:53
  • 使用python实现两数之和的画解算法

    2022-01-04 21:06:05
  • 浅谈MySQL之浅入深出页原理

    2024-01-18 20:38:29
  • vue实现添加标签demo示例代码

    2024-05-21 10:14:49
  • 同时安装sql2000和sql2005,经验点滴

    2008-03-04 17:56:00
  • Java通过正则表达式获取字符串中数字的方法示例

    2022-11-26 16:21:22
  • asp之家 网络编程 m.aspxhome.com