PyTorchで重みの確認と、畳み込み層のカーネルの可視化
実行したjupyternotebookはGitHubで公開しています。
https://github.com/betashort/python/blob/master/NN/PyTorch_CNN_Visualize_ConvWeight.ipynb
重みの確認
model.state_dict()
ネットワークを次のように定義したとして、
# ネットワークの定義 class CNNNet(nn.Module): def __init__(self): super(CNNNet,self).__init__() #畳み込み層 self.conv_layers = nn.Sequential( nn.Conv2d(in_channels = 1, out_channels = 16, kernel_size = 3, stride=1, padding=0), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), nn.Conv2d(in_channels = 16, out_channels = 32, kernel_size = 3, stride=1, padding=0), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), ) #全結合層 self.dence = nn.Sequential( nn.Linear(32 * 6 * 6, 128), nn.ReLU(inplace=True), #nn.Dropout(p=0.2), nn.Linear(128, 64), nn.ReLU(inplace=True), #nn.Dropout(p=0.2), nn.Linear(64, 10), ) #順伝播 def forward(self,x): out = self.conv_layers(x) #Flatten out = out.view(out.size(0), -1) #全結合層 out = self.dence(out) return out model = CNNNet()
このネットワークを学習した後、model.state_dict()を実行すると、層の実行順にOrderedDictで格納されたパラメータが取得できます。
参照
pyTorchのNetworkのパラメータの閲覧と書き換え - Qiita
...
畳み込み層のカーネルの可視化
上で、model.state_dict()で、層の重み含め、パラメータを取得できることが確認できました。
試しに、model.state_dict()を実行すると以下のような結果が出ます。
OrderedDict([('conv_layers.0.weight', tensor([[[[-0.4207, -0.4480, -0.6588], [-0.6090, -0.5266, -0.3595], [-0.2160, -0.0956, -0.4485]]], [[[-0.6202, -0.5363, -0.3624], [-0.6650, -0.8477, -0.5149], [-0.8891, -0.6004, -0.5109]]], ・・・・省略・・・・
1層目の畳み込み層のカーネルを可視化する場合は、’conv_layers.0.weight’のvalueを取得して、可視化させます。
1層目の畳み込み層の1つ目のカーネルの場合は下のようになります。
conv1_1 = np.array(model.state_dict()['conv_layers.0.weight'])[0] plt.imshow(conv1_1.reshape(3,3), cmap='gray')
1層目の畳み込み層のカーネル全てを可視化する場合は下のようになります。
plt.figure(figsize=(16,16)) for i in range(16): kernel_weight = np.array(model.state_dict()['conv_layers.0.weight'])[i].reshape(3,3) plt.subplot(4, 4, i+1) plt.title(f"kernel_weight : {i+1}") plt.imshow(kernel_weight, cmap="gray") plt.savefig("kernel_visual.png") plt.show()