1.用pytorch进行操作时,需要提前将数据转换为tensor(张量)的格式,tensor(张量)格式是pytorch底层所支持的格式。
2.学习一个框架不要去看基础操作,看了基础的也会忘记,也背不过,不如直接看一个例子,一步步去走,遇到不会用的地方去查。
3.框架最厉害的就是把反向传播都计算好了。
pytorch的add_model函数的作用
pytorch中的add_module函数 - 蒙面的普罗米修斯 - 博客园 (cnblogs.com)https://www.cnblogs.com/datasnail/p/14903643.html自定义网络中add_module的作用:
在自定义网络的时候,由于自定义变量不是Module类型(例如,我们用List封装了几个网络),所以pytorch不会自动注册网络模块。add_module函数用来为网络添加模块的,所以我们可以使用这个函数手动添加自定义的网络模块。当然,这种情况,我们也可以使用ModuleList来封装自定义模块,pytorch就会自动注册了。
add_module函数是在自定义网络添加子模块,例如,当我们自定义一个网络的过程中,我们既可以
(1)通过self.module=xxx_module的方式(如下面第3行代码),添加网络模块;
(2)通过add_module函数对网络中添加模块。
(3)通过用nn.Sequential对模块进行封装等等
class NeuralNetwork(nn.Module):
def __init__(self):
super(NeuralNetwork, self).__init__()
self.layers = nn.Linear(28*28,28*28)
self.add_module('layers',nn.Linear(28*28,28*28)) # 跟上面的方式等价
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU()
)
def forward(self, x):
for layer in layers:
x = layer(x)
logits = self.linear_relu_stack(x)
return logits
我们实例化类,然后输出网络的模块看一下:
0 Linear(in_features=784, out_features=784, bias=True)
1 Sequential(
(0): Linear(in_features=784, out_features=512, bias=True)
(1): ReLU()
)
但是,有时候pytorch不会自动给我们注册模块,我们需要根据传进来的参数对网络进行初始化,例如:
class NeuralNetwork(nn.Module):
def __init__(self, layer_num):
super(NeuralNetwork, self).__init__()
self.layers = [nn.Linear(28*28,28*28) for _ in range(layer_num)]
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU()
)
def forward(self, x):
for layer in layers:
x = layer(x)
logits = self.linear_relu_stack(x)
return logits
我们实例化类,然后输出网络的模块看一下:
0 Sequential(
(0): Linear(in_features=784, out_features=512, bias=True)
(1): ReLU()
)
定义的Linear模块都不见了!而上面定义的时候,明明都定义好了了。这是因为pytorch在注册模块的时候,会查看成员的类型,如果成员变量类型是Module的子类,那么pytorch就会注册这个模块,否则就不会。而这里的self.layers是python的List类型,所以不会注册,进而实例化的时候也就不会这个部分,所以在定义之后,需要手动注册,即add_module部分,如下面所示:
class NeuralNetwork(nn.Module):
def __init__(self, layer_num):
super(NeuralNetwork, self).__init__()
self.layers = [nn.Linear(28*28,28*28) for _ in range(layer_num)]
for i,layer in enumerate(self.layers):
self.add_module('layer_{}'.format(i),layer)
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU()
)
def forward(self, x):
for layer in layers:
x = layer(x)
logits = self.linear_relu_stack(x)
return logits
此时,输出子模块
model = NeuralNetwork(4)
for index,item in enumerate(model.children()):
print(index,item)
就会得到:
output
0 Linear(in_features=784, out_features=784, bias=True)
1 Linear(in_features=784, out_features=784, bias=True)
2 Linear(in_features=784, out_features=784, bias=True)
3 Linear(in_features=784, out_features=784, bias=True)
4 Sequential(
(0): Linear(in_features=784, out_features=512, bias=True)
(1): ReLU()
上面的方法是用add_module的方式进行注册的,下面也可以采用一个Module中的List来注册,作用等同于add_module
class NeuralNetwork(nn.Module):
def __init__(self, layer_num):
super(NeuralNetwork, self).__init__()
self.layers = nn.ModuleList([nn.Linear(28*28,28*28) for _ in range(layer_num)])
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU()
)
def forward(self, x):
for layer in layers:
x = layer(x)
logits = self.linear_relu_stack(x)
return logits