torch.nn.Conv2d源代码解析

1,isinstance(padding, str)什么意思?

2,super(Conv2d, self).__init__什么意思?

第一步:

super函数用于多层继承(multilevel inheritance)的情况,简单来说,就是之继承最近的那个父类。

class A:
    def __init__(self):
        print('Initializing: class A')

    def sub_method(self, b):
        print('Printing from class A:', b)


class B(A):
    def __init__(self):
        print('Initializing: class B')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class B:', b)
        super().sub_method(b + 1)


class C(B):
    def __init__(self):
        print('Initializing: class C')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class C:', b)
        super().sub_method(b + 1)


if __name__ == '__main__':
    c = C()
    c.sub_method(1)

# Initializing: class C
# Initializing: class B
# Initializing: class A
# Printing from class C: 1
# Printing from class B: 2
# Printing from class A: 3

c = C() 创建了一个class C的实例,然后可以看到初始化是从C->B->A的。

c.sub_method(1) 首先调用了C类里的sub_method(),输出了1,然后通过super().sub_method(b + 1)调用了B类里的sub_method()。可以看到C类里的super()就是代替了class C(B)里的B类

第二步:

super(Net, self).__init__()

Python中的super(Net, self).__init__()是指首先找到Net的父类(比如是类NNet),然后把类Net的对象self转换为类NNet的对象,然后“被转换”的类NNet对象调用自己的init函数,其实简单理解就是子类把父类的__init__()放到自己的__init__()当中,这样子类就有了父类的__init__()的那些东西。 

回过头来看看我们的我们最上面的代码,Net类继承nn.Module,super(Net, self).__init__()就是对继承自父类nn.Module的属性进行初始化。而且是用nn.Module的初始化方法来初始化继承的属性。

class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        # 输入图像channel:1;输出channel:6;5x5卷积核
        self.conv1 = nn.Conv2d(1, 6, 5)

 也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。

class Person:
    def __init__(self,name,gender):
        self.name = name
        self.gender = gender
    def printinfo(self):
        print(self.name,self.gender)

class Stu(Person):
    def __init__(self,name,gender,school):
        super(Stu, self).__init__(name,gender) # 使用父类的初始化方法来初始化子类
        self.school = school
    def printinfo(self): # 对父类的printinfo方法进行重写
        print(self.name,self.gender,self.school)

if __name__ == '__main__':
    stu = Stu('djk','man','nwnu')
    stu.printinfo()

 

参考链接:

https://bramblexu.com/posts/3adca41/
https://blog.csdn.net/dongjinkun/article/details/114575998

3,def _conv_forward()和def forward什么意思?

我们在使用Pytorch的时候,模型训练时,不需要调用forward这个函数,只需要在实例化一个对象中传入对应的参数就可以自动调用 forward 函数。这个称之为前向传播。

 class Module(nn.Module):
    def __init__(self):
        super().__init__()
        # ......

    def forward(self, x):
        # ......
        return x


data = ......  # 输入数据

# 实例化一个对象
model = Module()

# 前向传播
model(data)

# 而不是使用下面的
# model.forward(data) 

但是实际上model(data)是等价于model.forward(data)

4,

 

 

 

 

 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是基于PyTorch的VGG16的源代码: ```python import torch import torch.nn as nn class VGG16(nn.Module): def __init__(self, num_classes=1000): super(VGG16, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(64, 64, kernel_size=3, padding=1) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1) self.conv4 = nn.Conv2d(128, 128, kernel_size=3, padding=1) self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv5 = nn.Conv2d(128, 256, kernel_size=3, padding=1) self.conv6 = nn.Conv2d(256, 256, kernel_size=3, padding=1) self.conv7 = nn.Conv2d(256, 256, kernel_size=3, padding=1) self.pool3 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv8 = nn.Conv2d(256, 512, kernel_size=3, padding=1) self.conv9 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.conv10 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.pool4 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv11 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.conv12 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.conv13 = nn.Conv2d(512, 512, kernel_size=3, padding=1) self.pool5 = nn.MaxPool2d(kernel_size=2, stride=2) self.avgpool = nn.AdaptiveAvgPool2d((7, 7)) self.fc1 = nn.Linear(512 * 7 * 7, 4096) self.fc2 = nn.Linear(4096, 4096) self.fc3 = nn.Linear(4096, num_classes) self.relu = nn.ReLU(inplace=True) def forward(self, x): x = self.relu(self.conv1(x)) x = self.relu(self.conv2(x)) x = self.pool1(x) x = self.relu(self.conv3(x)) x = self.relu(self.conv4(x)) x = self.pool2(x) x = self.relu(self.conv5(x)) x = self.relu(self.conv6(x)) x = self.relu(self.conv7(x)) x = self.pool3(x) x = self.relu(self.conv8(x)) x = self.relu(self.conv9(x)) x = self.relu(self.conv10(x)) x = self.pool4(x) x = self.relu(self.conv11(x)) x = self.relu(self.conv12(x)) x = self.relu(self.conv13(x)) x = self.pool5(x) x = self.avgpool(x) x = torch.flatten(x, 1) x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.fc3(x) return x ``` 该模型包括VGG16的所有层(共13层卷积层和3个全连接层),并且使用ReLU激活函数。在前向传播时,输入数据首先通过卷积层和池化层进行特征提取,然后通过全连接层进行分类。最后的输出是一个含有num_classes个元素的向量,表示每个类别的概率分数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值