pytorch 网络参数初始化

知识点1、以循环的方式给layer初始化
知识点2、nn.Module中.children()与.modules()的区别

知识点1(重点)

以循环的方式给layer初始化,重点是一下代码,记住

for layer in net1()
	if isinstance(layer, nn.Linear):
		layer.weight.data = torch.from_numpy(np.random.uniform(3, 4, size=layer.weight.shape))

对于Sequential定义的网络

import torch
from torch import nn
import numpy as np
# 初始化网络
net1 = nn.Sequential(
    nn.Linear(3, 4),
    nn.ReLU(),
    nn.Linear(4, 5),
    nn.ReLU(),
    nn.Linear(5, 1)
)
# 通过net1[0].weight访问第一层的w(variable)然后.data 以tensor的形式访问w
print(net1[0].weight.data)
# 给net中参数赋值
net1[0].weight.data = torch.from_numpy(np.random.uniform(3, 4, size=(3, 4)))
# 赋值模板
for layer in net1:
    if isinstance(layer, nn.Linear):
        layer.weight.data = torch.from_numpy(np.random.uniform(3, 4, size=layer.weight.data.shape))

print(net1[0].weight.data)
print(net1[2].weight.data)

对于用Module定义的网络
知识点2
有children() 和 modules 可以访问Module 的layer
区别是:children只能访问表面的一层layer ,如果layer套着layer ,children是不会访问的。而modules直接访问最深层的layer,一个一个的访问,不会跳过。

import torch
import numpy as np
from torch import nn
class sim_net(nn.Module):
	def __init__(self):
		super(sim_net, self).__init__()
		self.l1 = nn.Sequential(
			nn.Linear(30, 40),
			nn.ReLU()
		)
		self.l2 = nn.Sequential(
			nn.Linear(40, 50),
			nn.ReLU()
		)
		self.l3 = nn.Sequential(
			nn.Linear(50, 10),
			nn.ReLU()
		)
	def forward(self, x):
		x = self.l1(x)
		x = self.l2(x)
		x = self.l3(x)
		return x


net2 = sim_net()
for i in net2.children():
	print(i)
print('*'*50)
for i in net2.modules():
	print(i)

for layer in net2.modules():
	if isinstance(layer, nn.Linear):
		layer.weight.data = torch.from_numpy(np.random.uniform(9, 10, size=layer.weight.shape))
		print(layer.weight)

你可能感兴趣的:(习惯养成,Deep,Learning,pytorch)