做网站交付标准,多语言商城网站开发,wordpress上传到服务器,玉石电商网站建设方案一般来说#xff0c;大家使用VGG16#xff0c;用的是第四列的网络架构#xff0c;而使用VGG19#xff0c;使用的就是第六列的网络架构。 使用vgg进行提取特征#xff0c;在这个项目中#xff0c;使用的就是每一块卷积层的第一层。
import torch.nn as nn
from torchvis…一般来说大家使用VGG16用的是第四列的网络架构而使用VGG19使用的就是第六列的网络架构。 使用vgg进行提取特征在这个项目中使用的就是每一块卷积层的第一层。
import torch.nn as nn
from torchvision import models
from torchvision.models.vgg import VGG19_Weightsclass VGGNet(nn.Module):def __init__(self):super(VGGNet, self).__init__()self.select [0, 5, 10, 19, 28]# self.vgg models.vgg19(pretrainedTrue).features # .features用于提取卷积层self.vgg models.vgg19(weightsVGG19_Weights.IMAGENET1K_V1).featuresdef forward(self, x):features []for name, layer in self.vgg._modules.items():x layer(x) # name为第几层的序列号layer就是卷积层,,x为输入的图片。x layer(x)的意思是x经过layer层卷积后再赋值给xif name in self.select:features.append(x)return featuresnet VGGNet()
print(net)我们打印了一下我们定义的net
VGGNet((vgg): Sequential((0): Conv2d(3, 64, kernel_size(3, 3), stride(1, 1), padding(1, 1))(1): ReLU(inplaceTrue)(2): Conv2d(64, 64, kernel_size(3, 3), stride(1, 1), padding(1, 1))(3): ReLU(inplaceTrue)(4): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse)(5): Conv2d(64, 128, kernel_size(3, 3), stride(1, 1), padding(1, 1))(6): ReLU(inplaceTrue)(7): Conv2d(128, 128, kernel_size(3, 3), stride(1, 1), padding(1, 1))(8): ReLU(inplaceTrue)(9): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse)(10): Conv2d(128, 256, kernel_size(3, 3), stride(1, 1), padding(1, 1))(11): ReLU(inplaceTrue)(12): Conv2d(256, 256, kernel_size(3, 3), stride(1, 1), padding(1, 1))(13): ReLU(inplaceTrue)(14): Conv2d(256, 256, kernel_size(3, 3), stride(1, 1), padding(1, 1))(15): ReLU(inplaceTrue)(16): Conv2d(256, 256, kernel_size(3, 3), stride(1, 1), padding(1, 1))(17): ReLU(inplaceTrue)(18): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse)(19): Conv2d(256, 512, kernel_size(3, 3), stride(1, 1), padding(1, 1))(20): ReLU(inplaceTrue)(21): Conv2d(512, 512, kernel_size(3, 3), stride(1, 1), padding(1, 1))(22): ReLU(inplaceTrue)(23): Conv2d(512, 512, kernel_size(3, 3), stride(1, 1), padding(1, 1))(24): ReLU(inplaceTrue)(25): Conv2d(512, 512, kernel_size(3, 3), stride(1, 1), padding(1, 1))(26): ReLU(inplaceTrue)(27): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse)(28): Conv2d(512, 512, kernel_size(3, 3), stride(1, 1), padding(1, 1))(29): ReLU(inplaceTrue)(30): Conv2d(512, 512, kernel_size(3, 3), stride(1, 1), padding(1, 1))(31): ReLU(inplaceTrue)(32): Conv2d(512, 512, kernel_size(3, 3), stride(1, 1), padding(1, 1))(33): ReLU(inplaceTrue)(34): Conv2d(512, 512, kernel_size(3, 3), stride(1, 1), padding(1, 1))(35): ReLU(inplaceTrue)(36): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse))
)讲解
特征提取列表
self.select [0, 5, 10, 19, 28]第一次看代码的时候会被这个列表给迷惑住VGG19不是只有19层吗19层指的是除去maxpoolsoftmax这些层以外卷积层和全连接层这些包含参数的层共有19层。
但是实际过程中ReLU激活函数也算在里面因此上文打印出来会超过19层因此通过对应的索引可以找到每块卷积的第一层。
forward函数
最简单的解释就是将x逐层喂入神经网络当经过的这个层刚好是每块卷积层的第一层就将经过这层的结果保存到列表中该结果中保存的就是图片的特征。
我们调试一下看看
import torch.nn as nn
import torch
from torchvision import models
from torchvision.models.vgg import VGG19_Weightsclass VGGNet(nn.Module):def __init__(self):super(VGGNet, self).__init__()self.select [0, 5, 10, 19, 28]# self.vgg models.vgg19(pretrainedTrue).features # .features用于提取卷积层self.vgg models.vgg19(weightsVGG19_Weights.IMAGENET1K_V1).features# self.vgg models.vgg19(weightsVGG19_Weights.IMAGENET1K_V1).featuresdef forward(self, x):features []for name, layer in self.vgg._modules.items():x layer(x) # name为第几层的序列号layer就是卷积层,,x为输入的图片。x layer(x)的意思是x经过layer层卷积后再赋值给xif name in self.select:features.append(x)return featuresnet VGGNet()
print(net)
input_tensor torch.randn(1, 3, 256, 256)
output net(input_tensor)
print(output)可以看到里面存放的是tensor格式的数据。 所以经过这个网络提取了图片的特征。