Pytorch源码学习之一 torchvision.models.alexnet
torch中一行代码导入的alexnet配置如下:
64@11x11 stride=4 + ReLU + Maxpooling 3x3 stride=2
192@5x5 stride=1 + ReLU + MaxPooling 3x3 stride=2
384@3x3 stride=1 + ReLU
256@3x3 stride=1 + ReLU
256@3x3 stride=1 + ReLU + MaxPooling 3x3 stride=2
AvgPool => 6x6x256
Dropout
fc 6x6x256 => 4096 + ReLU + Dropout
fc 4096 => 4096 + ReLU
fc 4096 => num_classes
一、源码
参考地址torchvison.models.alexnet源码
import torch
import torch.nn as nn
class alexnet(nn.Module):
def __init__(self, num_classes=1000):
super(alexnet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(64, 192, kernel_size=5, stride=1, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(192, 384, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True) ,
nn.MaxPool2d(kernel_size=3, stride=2)
)
self.avgpool = nn.AdaptiveAvgPool2d((6,6))
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(6*6*256, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, num_classes)
)
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = x.view(x.size(0), -1)
out = self.classifier(x)
return out
一些函数/类用法笔记
下面对复现过程中遇到的函数的用法进行回顾,有些用法虽然已经熟知,仍做简介
torch.nn.Module
super(alexnet, self).__init__()
super(type[, object-or-type])
nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=0, groups=1, bias=True)
nn.MaxPool2d(kernel_size, stride=1)
nn.ReLU(inplace=False)
nn.Dropout(p=0.5, inplace=False)
nn.linear(in_features, out_features, bias=True)
torch.Tensor.view(*shape)
x = x.view(x.size(0), -1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)