利用PyTorch实现VGG16教程

我就废话不多说了,大家还是直接看代码吧~

import torch
import torch.nn as nn
import torch.nn.functional as F

class VGG16(nn.Module):

  def __init__(self):
    super(VGG16, self).__init__()

    # 3 * 224 * 224
    self.conv1_1 = nn.Conv2d(3, 64, 3) # 64 * 222 * 222
    self.conv1_2 = nn.Conv2d(64, 64, 3, padding=(1, 1)) # 64 * 222* 222
    self.maxpool1 = nn.MaxPool2d((2, 2), padding=(1, 1)) # pooling 64 * 112 * 112

    self.conv2_1 = nn.Conv2d(64, 128, 3) # 128 * 110 * 110
    self.conv2_2 = nn.Conv2d(128, 128, 3, padding=(1, 1)) # 128 * 110 * 110
    self.maxpool2 = nn.MaxPool2d((2, 2), padding=(1, 1)) # pooling 128 * 56 * 56

    self.conv3_1 = nn.Conv2d(128, 256, 3) # 256 * 54 * 54
    self.conv3_2 = nn.Conv2d(256, 256, 3, padding=(1, 1)) # 256 * 54 * 54
    self.conv3_3 = nn.Conv2d(256, 256, 3, padding=(1, 1)) # 256 * 54 * 54
    self.maxpool3 = nn.MaxPool2d((2, 2), padding=(1, 1)) # pooling 256 * 28 * 28

    self.conv4_1 = nn.Conv2d(256, 512, 3) # 512 * 26 * 26
    self.conv4_2 = nn.Conv2d(512, 512, 3, padding=(1, 1)) # 512 * 26 * 26
    self.conv4_3 = nn.Conv2d(512, 512, 3, padding=(1, 1)) # 512 * 26 * 26
    self.maxpool4 = nn.MaxPool2d((2, 2), padding=(1, 1)) # pooling 512 * 14 * 14

    self.conv5_1 = nn.Conv2d(512, 512, 3) # 512 * 12 * 12
    self.conv5_2 = nn.Conv2d(512, 512, 3, padding=(1, 1)) # 512 * 12 * 12
    self.conv5_3 = nn.Conv2d(512, 512, 3, padding=(1, 1)) # 512 * 12 * 12
    self.maxpool5 = nn.MaxPool2d((2, 2), padding=(1, 1)) # pooling 512 * 7 * 7

    # view

    self.fc1 = nn.Linear(512 * 7 * 7, 4096)
    self.fc2 = nn.Linear(4096, 4096)
    self.fc3 = nn.Linear(4096, 1000)
    # softmax 1 * 1 * 1000

  def forward(self, x):

    # x.size(0)即为batch_size
    in_size = x.size(0)

    out = self.conv1_1(x) # 222
    out = F.relu(out)
    out = self.conv1_2(out) # 222
    out = F.relu(out)
    out = self.maxpool1(out) # 112

    out = self.conv2_1(out) # 110
    out = F.relu(out)
    out = self.conv2_2(out) # 110
    out = F.relu(out)
    out = self.maxpool2(out) # 56

    out = self.conv3_1(out) # 54
    out = F.relu(out)
    out = self.conv3_2(out) # 54
    out = F.relu(out)
    out = self.conv3_3(out) # 54
    out = F.relu(out)
    out = self.maxpool3(out) # 28

    out = self.conv4_1(out) # 26
    out = F.relu(out)
    out = self.conv4_2(out) # 26
    out = F.relu(out)
    out = self.conv4_3(out) # 26
    out = F.relu(out)
    out = self.maxpool4(out) # 14

    out = self.conv5_1(out) # 12
    out = F.relu(out)
    out = self.conv5_2(out) # 12
    out = F.relu(out)
    out = self.conv5_3(out) # 12
    out = F.relu(out)
    out = self.maxpool5(out) # 7

    # 展平
    out = out.view(in_size, -1)

    out = self.fc1(out)
    out = F.relu(out)
    out = self.fc2(out)
    out = F.relu(out)
    out = self.fc3(out)

    out = F.log_softmax(out, dim=1)
    return out

补充知识:Pytorch实现VGG(GPU版)

看代码吧~

import torch
from torch import nn
from torch import optim

from PIL import Image
import numpy as np

print(torch.cuda.is_available())
device = torch.device('cuda:0')
path="/content/drive/My Drive/Colab Notebooks/data/dog_vs_cat/"

train_X=np.empty((2000,224,224,3),dtype="float32")
train_Y=np.empty((2000,),dtype="int")
train_XX=np.empty((2000,3,224,224),dtype="float32")

for i in range(1000):
  file_path=path+"cat."+str(i)+".jpg"
  image=Image.open(file_path)
  resized_image = image.resize((224, 224), Image.ANTIALIAS)
  img=np.array(resized_image)
  train_X[i,:,:,:]=img
  train_Y[i]=0

for i in range(1000):
  file_path=path+"dog."+str(i)+".jpg"
  image = Image.open(file_path)
  resized_image = image.resize((224, 224), Image.ANTIALIAS)
  img = np.array(resized_image)
  train_X[i+1000, :, :, :] = img
  train_Y[i+1000] = 1

train_X /= 255

index = np.arange(2000)
np.random.shuffle(index)

train_X = train_X[index, :, :, :]
train_Y = train_Y[index]

for i in range(3):
  train_XX[:,i,:,:]=train_X[:,:,:,i]

# 创建网络

class Net(nn.Module):

  def __init__(self):
    super(Net, self).__init__()
    self.conv1 = nn.Sequential(
      nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.BatchNorm2d(num_features=64, eps=1e-05, momentum=0.1, affine=True),
      nn.MaxPool2d(kernel_size=2,stride=2)
    )
    self.conv2 = nn.Sequential(
      nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,stride=1,padding=1),
      nn.ReLU(),
      nn.Conv2d(in_channels=128, out_channels=128, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.BatchNorm2d(128,eps=1e-5,momentum=0.1,affine=True),
      nn.MaxPool2d(kernel_size=2,stride=2)
    )
    self.conv3 = nn.Sequential(
      nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.Conv2d(in_channels=256, out_channels=256, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.BatchNorm2d(256,eps=1e-5, momentum=0.1, affine=True),
      nn.MaxPool2d(kernel_size=2, stride=2)
    )
    self.conv4 = nn.Sequential(
      nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.BatchNorm2d(512, eps=1e-5, momentum=0.1, affine=True),
      nn.MaxPool2d(kernel_size=2, stride=2)
    )
    self.conv5 = nn.Sequential(
      nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.BatchNorm2d(512, eps=1e-5, momentum=0.1, affine=True),
      nn.MaxPool2d(kernel_size=2, stride=2)
    )
    self.dense1 = nn.Sequential(
      nn.Linear(7*7*512,4096),
      nn.ReLU(),
      nn.Linear(4096,4096),
      nn.ReLU(),
      nn.Linear(4096,2)
    )

  def forward(self, x):
    x=self.conv1(x)
    x=self.conv2(x)
    x=self.conv3(x)
    x=self.conv4(x)
    x=self.conv5(x)
    x=x.view(-1,7*7*512)
    x=self.dense1(x)
    return x

batch_size=16
net = Net().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.0005)

train_loss = []

for epoch in range(10):

  for i in range(2000//batch_size):
    x=train_XX[i*batch_size:i*batch_size+batch_size]
    y=train_Y[i*batch_size:i*batch_size+batch_size]

    x = torch.from_numpy(x)    #(batch_size,input_feature_shape)
    y = torch.from_numpy(y)    #(batch_size,label_onehot_shape)
    x = x.cuda()
    y = y.long().cuda()

    out = net(x)

    loss = criterion(out, y)     # 计算两者的误差
    optimizer.zero_grad()       # 清空上一步的残余更新参数值
    loss.backward()          # 误差反向传播, 计算参数更新值
    optimizer.step()         # 将参数更新值施加到 net 的 parameters 上
    train_loss.append(loss.item())

    print(epoch, i*batch_size, np.mean(train_loss))
    train_loss=[]

total_correct = 0
for i in range(2000):
  x = train_XX[i].reshape(1,3,224,224)
  y = train_Y[i]
  x = torch.from_numpy(x)

  x = x.cuda()
  out = net(x).cpu()
  out = out.detach().numpy()
  pred=np.argmax(out)
  if pred==y:
    total_correct += 1
  print(total_correct)

acc = total_correct / 2000.0
print('test acc:', acc)

torch.cuda.empty_cache()

将上面代码中batch_size改为32,训练次数改为100轮,得到如下准确率

过拟合了~

以上这篇利用PyTorch实现VGG16教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 简单易懂Pytorch实战实例VGG深度网络

    简单易懂Pytorch实战实例VGG深度网络 模型VGG,数据集cifar.对照这份代码走一遍,大概就知道整个pytorch的运行机制. 来源 定义模型: '''VGG11/13/16/19 in Pytorch.''' import torch import torch.nn as nn from torch.autograd import Variable cfg = {     'VGG11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M

  • PyTorch预训练的实现

    前言 最近使用PyTorch感觉妙不可言,有种当初使用Keras的快感,而且速度还不慢.各种设计直接简洁,方便研究,比tensorflow的臃肿好多了.今天让我们来谈谈PyTorch的预训练,主要是自己写代码的经验以及论坛PyTorch Forums上的一些回答的总结整理. 直接加载预训练模型 如果我们使用的模型和原模型完全一样,那么我们可以直接加载别人训练好的模型: my_resnet = MyResNet(*args, **kwargs) my_resnet.load_state_dict(

  • pytorch获取vgg16-feature层输出的例子

    实际应用时可能比较想获取VGG中间层的输出, 那么就可以如下操作: import numpy as np import torch from torchvision import models from torch.autograd import Variable import torchvision.transforms as transforms class CNNShow(): def __init__(self, model): self.model = model self.model

  • 利用PyTorch实现VGG16教程

    我就废话不多说了,大家还是直接看代码吧~ import torch import torch.nn as nn import torch.nn.functional as F class VGG16(nn.Module): def __init__(self): super(VGG16, self).__init__() # 3 * 224 * 224 self.conv1_1 = nn.Conv2d(3, 64, 3) # 64 * 222 * 222 self.conv1_2 = nn.Co

  • 利用python实现AR教程

    先了解如何利用python语言实现以平面和标记物进行姿态估计 本实验只是先实现一个简单的小例子.简单来说就是先识别出图像中的参考面,再拍摄一张目标图像,将参考面顶部的3D模型投影到目标图像上. 大致步骤如下: 识别参考平面 在这一步中,我们所需要做的事就是提取参考图像和目标图像的sift特征,然后使用RANSAC算法稳健地估计单应性矩阵. 代码如下: #计算特征 sift.process_image('D:输入图片/book_frontal.JPG', 'im0.sift') l0, d0 =

  • 利用pytorch实现对CIFAR-10数据集的分类

    步骤如下: 1.使用torchvision加载并预处理CIFAR-10数据集. 2.定义网络 3.定义损失函数和优化器 4.训练网络并更新网络参数 5.测试网络 运行环境: windows+python3.6.3+pycharm+pytorch0.3.0 import torchvision as tv import torchvision.transforms as transforms import torch as t from torchvision.transforms import

  • 利用Pytorch实现简单的线性回归算法

    最近听了张江老师的深度学习课程,用Pytorch实现神经网络预测,之前做Titanic生存率预测的时候稍微了解过Tensorflow,听说Tensorflow能做的Pyorch都可以做,而且更方便快捷,自己尝试了一下代码的逻辑确实比较简单. Pytorch涉及的基本数据类型是tensor(张量)和Autograd(自动微分变量),对于这些概念我也是一知半解,tensor和向量,矩阵等概念都有交叉的部分,下次有时间好好补一下数学的基础知识,不过现阶段的任务主要是应用,学习掌握思维和方法即可,就不再

  • 如何利用Pytorch计算三角函数

    一.加载库 首先加载torch库,进入python后加载库使用import导入 [import 库名] 二.sin值计算方法 pytorch中的sin计算都是基于tensor的,所以无论单个值还是多个值同时计算sin值,都需要首先将输入量转换为tensor 使用指令: [torch.sin(tensor)] 实例中,使用了计算单个和多个sin值时的情况 三.cos值计算方法 pytorch中的cos计算都是基于tensor的,所以无论单个值还是多个值同时计算cos值,都需要首先将输入量转换为te

  • 人工智能学习Pytorch进阶操作教程

    目录 一.合并与分割 1.cat拼接 2.stack堆叠 3.拆分 ①Split按长度拆分 ②Chunk按数量拆分 二.基本运算 1.加减乘除 2.矩阵相乘 3.次方计算 4. clamp 三.属性统计 1.求范数 2.求极值.求和.累乘 3. dim和keepdim 4.topk和kthvalue 5.比较运算 6.高阶操作 ①where ②gather 一.合并与分割 1.cat拼接 直接按照指定的dim维度进行合并,要求除了所需要合并的维度之外,其他的维度需要是一样的 2.stack堆叠

  • 教你利用PyTorch实现sin函数模拟

    目录 一.简介 二.第一种方法 三.第二种方法 四.总结 一.简介 本文旨在使用两种方法来实现sin函数的模拟,具体的模拟方法是使用机器学习来实现的,我们使用Python的torch模块进行机器学习,从而为sin确定多项式的系数. 二.第一种方法 # 这个案例相当于是使用torch来模拟sin函数进行计算啦. # 通过3次函数来模拟sin函数,实现类似于机器学习的操作. import torch import math dtype = torch.float # 数据的类型 device = t

  • python神经网络学习利用PyTorch进行回归运算

    目录 学习前言 PyTorch中的重要基础函数 1.class Net(torch.nn.Module)神经网络的构建: 2.optimizer优化器 3.loss损失函数定义 4.训练过程 全部代码 学习前言 我发现不仅有很多的Keras模型,还有很多的PyTorch模型,还是学学Pytorch吧,我也想了解以下tensor到底是个啥. PyTorch中的重要基础函数 1.class Net(torch.nn.Module)神经网络的构建: PyTorch中神经网络的构建和Tensorflow

  • 利用PyTorch实现爬山算法

    目录 0. 前言 1. 使用 PyTorch 实现爬山算法 1.1 爬山算法简介 1.2 使用爬山算法进行 CartPole 游戏 2. 改进爬山算法 0. 前言 在随机搜索策略中,每个回合都是独立的.因此,随机搜索中的所有回合都可以并行运行,最终选择能够得到最佳性能的权重.我们还通过绘制总奖励随回合增加的变化情况进行验证,可以看到奖励并没有上升的趋势.在本节中,我们将实现爬山算法 (hill-climbing algorithm),以将在一个回合中学习到的知识转移到下一个回合中. 1. 使用

  • python机器学习pytorch 张量基础教程

    目录 正文 1.初始化张量 1.1 直接从列表数据初始化 1.2 用 NumPy 数组初始化 1.3 从另一个张量初始化 1.4 使用随机值或常量值初始化 2.张量的属性 3.张量运算 3.1 标准的类似 numpy 的索引和切片: 3.2 连接张量 3.3 算术运算 3.4单元素张量 Single-element tensors 3.5 In-place 操作 4. 张量和NumPy 桥接 4.1 张量到 NumPy 数组 4.2 NumPy 数组到张量 正文 张量是一种特殊的数据结构,与数组

随机推荐