从头学pytorch(十六):VGG NET

  AlexNet在Lenet的基础上增加了几个卷积层,改变了卷积核大小,每一层输出通道数目等,并且取得了很好的效果.但是并没有提出一个简单有效的思路.
  
  VGG做到了这一点,提出了可以通过重复使⽤简单的基础块来构建深度学习模型的思路.
  
  论文地址:https://www.letianhuanchao.cn .org/abs/1409.1556
  
  vgg的结构如下所示:
  
  上图给出了不同层数的vgg的结构.也就是常说的vgg16,vgg19等等.
  
  VGG BLOCK
  
  vgg的设计思路是,通过不断堆叠3x3的卷积核,不断加深模型深度.vgg net证明了加深模型深度对提高模型的学习能力是一个很有效的手段.
  
  看上图就能发现,连续的2个3x3卷积,感受野和一个5x5卷积是一样的,但是前者有两次非线性变换,后者只有一次!,这就是连续堆叠小卷积核能提高
  
  模型特征学习的关键.此外,2个3x3的参数数量也比一个5x5少.(2x3x3 < 5x5)
  
  vgg的基础组成模块,每一个卷积层都由n个3x3卷积后面接2x2的最大池化.池化层的步幅为2.从而卷积层卷积后,宽高不变,池化后,宽高减半.
  
  我们可以有以下代码:
  
  def make_layers(in_channels,cfg):
  
  layers = []
  
  previous_channel = in_channels #上一层的输出的channel数量
  
  for v in cfg:
  
  if v == 'M':
  
  layers.append(nn.MaxPool2d(kernel_www.lecaixuanzc.cn size=2,stride=2))
  
  else:
  
  layers.append(nn.Conv2d(previous_channel,v,kernel_size=3,padding=1))
  
  layers.append(nn.ReLU(www.zhuyngyule.cn))
  
  previous_channel = v
  
  conv = nn.Sequential(*layers)
  
  return conv
  
  cfgs = {
  
  'A': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
  
  'B': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
  
  'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
  
  'E': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
  
  }
  
  cfgs定义了不同的vgg模型的结构,比如'A'代表vgg11. 数字代表卷积后的channel数. 'M'代表Maxpool
  
  我们可以给出模型定义
  
  class VGG(nn.Module):
  
  def __init__(self,input_channels,cfg,num_classes=10, init_weights=True):
  
  super(VGG, self).__init__(www.lthczcgw.cn)
  
  self.conv = make_layers(input_channels,cfg) # torch.Size([1, 512, 7, 7])
  
  self.fc = nn.Sequential(
  
  nn.Linear(512*7*7,4096),
  
  nn.ReLU(),
  
  nn.Linear(4096,4096),
  
  nn.ReLU(),
  
  nn.Linear(4096,num_classes)
  
  )
  
  def forward(self, img):
  
  feature = self.conv(www.lafei6v.cn)
  
  output = self.fc(feature.view(img.shape[0], -1))
  
  return output
  
  卷积层的输出可由以下测试代码得出
  
  # conv = make_layers(1,cfgs['A'])
  
  # X = torch.randn((1,1,224,224))
  
  # out = conv(X)
  
  # #print(out.shape)
  
  加载数据
  
  batch_size,num_workers=4,4
  
  train_iter,test_iter = learntorch_utils.load_data(batch_size,num_workers,resize=224)
  
  这里batch_size调到8我的显存就不够了...
  
  定义模型
  
  net = VGG(1,cfgs['A']).cuda()
  
  定义损失函数
  
  loss = nn.CrossEntropyLoss()
  
  定义优化器
  
  opt = torch.optim.Adam(net.parameters(),lr=0.001)
  
  定义评估函数
  
  def test():
  
  acc_sum = 0
  
  batch = 0
  
  for X,y in test_iter:
  
  X,y = X.cuda(),y.cuda()
  
  y_hat = net(X)
  
  acc_sum += (y_hat.argmax(dim=1) == y).float().sum().item()
  
  batch += 1
  
  #print('acc_sum %d,batch %d' % (acc_sum,batch))
  
  return 1.0*acc_sum/(batch*batch_size)
  
  训练
  
  num_epochs = 3
  
  def train():
  
  for epoch in range(num_epochs):
  
  train_l_sum,batch,acc_sum = 0,0,0
  
  start = time.time()
  
  for X,y in train_iter:
  
  # start_batch_begin = time.time()
  
  X,y = X.cuda(),y.cuda()
  
  y_hat = net(X)
  
  acc_sum += (y_hat.argmax(dim=1) == y).float().sum().item()
  
  l = loss(y_hat,y)
  
  opt.zero_grad()
  
  l.backward()
  
  opt.step()
  
  train_l_sum += l.item()
  
  batch += 1
  
  mean_loss = train_l_sum/(batch*batch_size) #计算平均到每张图片的loss
  
  start_batch_end = time.time()
  
  time_batch = start_batch_end - start
  
  print('epoch %d,batch %d,train_loss %.3f,time %.3f' %
  
  (epoch,batch,mean_loss,time_batch))
  
  print('***************************************')
  
  mean_loss = train_l_sum/(batch*batch_size) #计算平均到每张图片的loss
  
  train_acc = acc_sum/(batch*batch_size)     #计算训练准确率
  
  test_acc = test()                           #计算测试准确率
  
  end = time.time()
  
  time_per_epoch =  end - start
  
  print('epoch %d,train_loss %f,train_acc %f,test_acc %f,time %f' %
  
  (epoch + 1,mean_loss,train_acc,test_acc,time_per_epoch))
  
  train()
  
  4G的GTX 1050显卡,训练一个epoch大概一个多小时.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch是一种流行的深度习框架,在人脸对比任务中具有很高的适用性和性能。人脸对比是一个重要的人脸识别应用,它可以用于验证一个人是否与数据库中的人脸相匹配。 在PyTorch中,人脸对比一般可以分为以下几个步骤: 1. 数据准备:首先需要准备人脸图像数据集,包括正样本和负样本。正样本是同一人的不同照片,负样本是不同人的照片。可以使用现有的人脸数据集,如LFW、CelebA等。 2. 网络模型选择:选择适合的网络模型进行人脸对比。在PyTorch中,可以使用已经训练好的人脸识别模型,如VGGNet、ResNet等,也可以从头开始训练自己的网络模型。 3. 数据预处理:对输入的人脸图像进行预处理,如调整大小、裁剪、归一化等操作。这样可以将不同尺寸的人脸图像转换为相同大小的输入。 4. 特征提取:使用网络模型提取人脸图像的特征表示。一般来说,通过将人脸图像输入到网络中,获取最后一层全连接层或卷积层的输出作为特征向量。 5. 相似度计算:利用特征向量计算人脸之间的相似度。常用的相似度计算方法包括欧式距离、余弦相似度等。根据相似度的阈值,可以决定是否将两个人脸判定为同一人。 6. 模型训练和评估:使用人脸对比数据集进行模型的训练和评估。通过调整网络结构、损失函数、优化算法等进行模型的优化,以提高人脸对比的准确率和性能。 总的来说,PyTorch提供了丰富的工具和库,可以方便地进行人脸对比任务。通过合理选择网络模型、数据处理和训练策略,可以得到准确度很高的人脸对比系统,用于实际应用和研究。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值