推销网站的方法,网站转移空间以后ip会变化吗,武义住房和城乡建设局网站,wordpress 医疗使用重复元素的网络#xff08;VGG#xff09;
VGG的名字来源于论文作者所在的实验室Visual Geometry Group#xff0c;VGG提出了可以通过重复使用简单的基础块来构建深度模型的思路。
VGG Block(VGG 块)
VGG块的组成规律是#xff1a;连续使用数个相同的填充为1、窗口形…使用重复元素的网络VGG
VGG的名字来源于论文作者所在的实验室Visual Geometry GroupVGG提出了可以通过重复使用简单的基础块来构建深度模型的思路。
VGG Block(VGG 块)
VGG块的组成规律是连续使用数个相同的填充为1、窗口形状为3×33\times 33×3的卷积层后接上一个步幅为2、窗口形状为2×22\times 22×2的最大池化层。 卷积层保持输入的高和宽不变而池化层则对其减半。
用函数来实现基础的VGG块它可以指定卷积层的数量和输入输出通道数。
import time
import torch
from torch import nn, optimdevice torch.device(cuda if torch.cuda.is_available() else cpu)def vgg_block(num_convs, in_channels, out_channels):blk []for i in range(num_convs):if i 0:blk.append(nn.Conv2d(in_channels, out_channels, kernel_size3, padding1))else:blk.append(nn.Conv2d(out_channels, out_channels, kernel_size3, padding1))blk.append(nn.ReLU())blk.append(nn.MaxPool2d(kernel_size2, stride2)) # 这里会使宽高减半return nn.Sequential(*blk)对于给定的感受野与输出有关的输入图片的局部大小采用堆积的小卷积核优于采用大的卷积核因为可以增加网络深度来保证学习更复杂的模式而且代价还比较小参数更少。例如在VGG中使用了3个3x3卷积核来代替7x7卷积核使用了2个3x3卷积核来代替5*5卷积核这样做的主要目的是在保证具有相同感知野的条件下提升了网络的深度在一定程度上提升了神经网络的效果。
VGG 网络
VGG网络由卷积层模块后接全连接层模块构成。卷积层模块串联数个VGG Block其超参数由变量conv_arch定义。该变量指定了每个VGG块里卷积层个数和输入输出通道数。全连接模块则跟AlexNet中的一样。 构造一个VGG网络。
它有5个卷积块前2块使用单卷积层而后3块使用双卷积层。第一块的输入输出通道分别是1和64之后每次对输出通道数翻倍直到变为512
因为这个网络使用了8个卷积层和3个全连接层所以经常被称为VGG-11。
conv_arch ((1, 1, 64), (1, 64, 128), (2, 128, 256), (2, 256, 512), (2, 512, 512))
# 经过5个VGG Block, 宽高会减半5次, 变成 224/32 7
fc_features 512 * 7 * 7 # c * w * h
fc_hidden_units 4096 # 任意设定实现VGG-11
def vgg(conv_arch, fc_features, fc_hidden_units4096):net nn.Sequential()# 卷积层部分for i, (num_convs, in_channels, out_channels) in enumerate(conv_arch):# 每经过一个vgg_block都会使宽高减半net.add_module(vgg_block_ str(i1), vgg_block(num_convs, in_channels, out_channels))# 全连接层部分net.add_module(fc, nn.Sequential(d2l.FlattenLayer(),nn.Linear(fc_features, fc_hidden_units),nn.ReLU(),nn.Dropout(0.5),nn.Linear(fc_hidden_units, fc_hidden_units),nn.ReLU(),nn.Dropout(0.5),nn.Linear(fc_hidden_units, 10)))return net构造一个高和宽均为224的单通道数据样本来观察每一层的输出形状。
net vgg(conv_arch, fc_features, fc_hidden_units)
X torch.rand(1, 1, 224, 224)# named_children获取一级子模块及其名字(named_modules会返回所有子模块,包括子模块的子模块)
for name, blk in net.named_children(): X blk(X)print(name, output shape: , X.shape)输出
vgg_block_1 output shape: torch.Size([1, 64, 112, 112])
vgg_block_2 output shape: torch.Size([1, 128, 56, 56])
vgg_block_3 output shape: torch.Size([1, 256, 28, 28])
vgg_block_4 output shape: torch.Size([1, 512, 14, 14])
vgg_block_5 output shape: torch.Size([1, 512, 7, 7])
fc output shape: torch.Size([1, 10])每次输入的高和宽减半直到最终高和宽变成7后传入全连接层。与此同时输出通道数每次翻倍直到变成512。因为每个卷积层的窗口大小一样所以每层的模型参数尺寸和计算复杂度与输入高、输入宽、输入通道数和输出通道数的乘积成正比。VGG这种高和宽减半以及通道翻倍的设计使得多数卷积层都有相同的模型参数尺寸和计算复杂度。
获取数据
ratio 8
small_conv_arch [(1, 1, 64//ratio), (1, 64//ratio, 128//ratio), (2, 128//ratio, 256//ratio), (2, 256//ratio, 512//ratio), (2, 512//ratio, 512//ratio)]
net vgg(small_conv_arch, fc_features // ratio, fc_hidden_units // ratio)
print(net)输出
Sequential((vgg_block_1): Sequential((0): Conv2d(1, 8, kernel_size(3, 3), stride(1, 1), padding(1, 1))(1): ReLU()(2): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse))(vgg_block_2): Sequential((0): Conv2d(8, 16, kernel_size(3, 3), stride(1, 1), padding(1, 1))(1): ReLU()(2): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse))(vgg_block_3): Sequential((0): Conv2d(16, 32, kernel_size(3, 3), stride(1, 1), padding(1, 1))(1): ReLU()(2): Conv2d(32, 32, kernel_size(3, 3), stride(1, 1), padding(1, 1))(3): ReLU()(4): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse))(vgg_block_4): Sequential((0): Conv2d(32, 64, kernel_size(3, 3), stride(1, 1), padding(1, 1))(1): ReLU()(2): Conv2d(64, 64, kernel_size(3, 3), stride(1, 1), padding(1, 1))(3): ReLU()(4): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse))(vgg_block_5): Sequential((0): Conv2d(64, 64, kernel_size(3, 3), stride(1, 1), padding(1, 1))(1): ReLU()(2): Conv2d(64, 64, kernel_size(3, 3), stride(1, 1), padding(1, 1))(3): ReLU()(4): MaxPool2d(kernel_size2, stride2, padding0, dilation1, ceil_modeFalse))(fc): Sequential((0): FlattenLayer()(1): Linear(in_features3136, out_features512, biasTrue)(2): ReLU()(3): Dropout(p0.5)(4): Linear(in_features512, out_features512, biasTrue)(5): ReLU()(6): Dropout(p0.5)(7): Linear(in_features512, out_features10, biasTrue))
)训练
def load_data_fashion_mnist(batch_size, resizeNone, root~/Datasets/FashionMNIST):Download the fashion mnist dataset and then load into memory.trans []if resize:trans.append(torchvision.transforms.Resize(sizeresize))trans.append(torchvision.transforms.ToTensor())transform torchvision.transforms.Compose(trans)mnist_train torchvision.datasets.FashionMNIST(rootroot, trainTrue, downloadTrue, transformtransform)mnist_test torchvision.datasets.FashionMNIST(rootroot, trainFalse, downloadTrue, transformtransform)if sys.platform.startswith(win):num_workers 0 # 0表示不用额外的进程来加速读取数据else:num_workers 4train_iter torch.utils.data.DataLoader(mnist_train, batch_sizebatch_size, shuffleTrue, num_workersnum_workers)test_iter torch.utils.data.DataLoader(mnist_test, batch_sizebatch_size, shuffleFalse, num_workersnum_workers)return train_iter, test_iterbatch_size 64
# 如出现“out of memory”的报错信息可减小batch_size或resize
train_iter, test_iter load_data_fashion_mnist(batch_size, resize224)lr, num_epochs 0.001, 5
optimizer torch.optim.Adam(net.parameters(), lrlr)
d2l.train_ch5(net, train_iter, test_iter, batch_size, optimizer, device, num_epochs)