1、用PyCharm进行Debug后访问网络结构:
如下在对网络初始化后,在下面设置一个断点,然后就可以按照如下动图所示的步骤进行访问参数,如这里layer1就是一个包含Linear层和BatchNorm1d层的Sequential容器,再选择module里面的0表示第一个即Linear层,而我们都知道Linear层有weight和bias两个参数也正如图所示的一样。
下面附上代码(之前项目的一部分,仅仅作为演示这个访问参数可能不够简洁,但不用管前面的)和演示图:
import torch
from matplotlib import pyplot as plt
import numpy as np
from torchvision.datasets import mnist
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
from torch import nn
train_batch_size=64
test_batch_size=128
learning_rate=0.01
num_epoches=20
lr=0.01
momentum=0.5
transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.5],[0.5])])#黑白图只有一个通道,所以Normalize元组只有一个值
train_dataset=mnist.MNIST('./data',train=True,transform=transform,download=True)
test_dataset=mnist.MNIST('./data',train=False,transform=transform)
train_loader=DataLoader(train_dataset,batch_size=train_batch_size,shuffle=True)
test_loader=DataLoader(test_dataset,batch_size=test_batch_size,shuffle=False)
examples=enumerate(test_loader)#组合成一个索引序列
batch_idx,(example_data,example_targets)=next(examples)
fig=plt.figure()
for i in range(6):
plt.subplot(2,3,i+1)
plt.tight_layout()
plt.imshow(example_data[i][0],cmap='gray',interpolation='none')
plt.title('Groud Truth: {}'.format(example_targets[i]))
plt.xticks([])
plt.yticks([])
#plt.show()
#构建模型
class Net(nn.Module):
def __init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim):
super(Net,self).__init__()
self.layer1=nn.Sequential(nn.Linear(in_dim,n_hidden_1),nn.BatchNorm1d(n_hidden_1))
self.layer2 = nn.Sequential(nn.Linear(n_hidden_1, n_hidden_2), nn.BatchNorm1d(n_hidden_2))
self.layer3=nn.Sequential(nn.Linear(n_hidden_2,out_dim))
def forward(self,x):
x=F.relu(self.layer1(x))
x=F.relu(self.layer2(x))
x=self.layer3(x)
return x
model=Net(28*28,300,100,10)
print('ok')
2、直接print某一层的参数
只需加一行代码,比如我们想访问layer1的Linear层的参数:
print(model.layer1[0].state_dict())
效果:
当然我们还可以具体访问某个参数的type和值
print(model.layer1[0].weight.data)
print(type(model.layer1[0].weight))
可以看见是Parameter型的。
3、根据named_parameters方法:
print(*[(name,param.data) for name,param in model.named_parameters()])
通过运行这一行代码可以直接访问所有层的参数的值
这里输出太多了就不放图了,我们用这种方法看某一层的参数即可:
print(*[(name,param.data) for name,param in model.layer1[0].named_parameters()])