kap*_*ike 6 deep-learning pytorch
我是深度学习和 Pytorch 的新手。我想在我的 CNN 模型中可视化我的过滤器,以便我可以在我定义的 CNN 模型中迭代层。但我遇到如下错误。
错误:“CNN”对象不可迭代
CNN 对象是我的模型。
我的迭代代码如下?
for index, layer in enumerate(self.model):
# Forward pass layer by layer
x = layer(x)
Run Code Online (Sandbox Code Playgroud)
我的模型代码如下?
class CNN(nn.Module):
def __init__(self):
super(CNN,self).__init__()
self.Conv1 = nn.Sequential( # input image size (1,28,20)
nn.Conv2d(1, 16, 5, 1, 2), # outputize (16,28,20)
nn.ReLU(),
nn.MaxPool2d(2), #outputize (16,14,10)
)
self.Conv2 = nn.Sequential( # input ize ? (16,,14,10)
nn.Conv2d(16, 32, 5, 1, 2), #output size(32,14,10)
nn.ReLU(),
nn.MaxPool2d(2), #output size (32,7,5)
)
self.fc1 = nn.Linear(32 * 7 * 5, 800)
self.fc2 = nn.Linear(800,500)
self.fc3 = nn.Linear(500,10)
#self.fc4 = nn.Linear(200,10)
def forward(self,x):
x = self.Conv1(x)
x = self.Conv2(x)
x = x.view(x.size(0), -1)
x = self.fc1(x)
x = F.dropout(x)
x = F.relu(x)
x = self.fc2(x)
x = F.dropout(x)
x = F.relu(x)
x = self.fc3(x)
#x = F.relu(x)
#x = self.fc4(x)
return x
Run Code Online (Sandbox Code Playgroud)
所以任何人都可以告诉我如何解决这个问题。
Rex*_*Low 10
从本质上讲,您需要访问模型中的特征并首先将这些矩阵转置为正确的形状,然后您可以可视化过滤器
import numpy as np
import matplotlib.pyplot as plt
from torchvision import utils
def visTensor(tensor, ch=0, allkernels=False, nrow=8, padding=1):
n,c,w,h = tensor.shape
if allkernels: tensor = tensor.view(n*c, -1, w, h)
elif c != 3: tensor = tensor[:,ch,:,:].unsqueeze(dim=1)
rows = np.min((tensor.shape[0] // nrow + 1, 64))
grid = utils.make_grid(tensor, nrow=nrow, normalize=True, padding=padding)
plt.figure( figsize=(nrow,rows) )
plt.imshow(grid.numpy().transpose((1, 2, 0)))
if __name__ == "__main__":
layer = 1
filter = model.features[layer].weight.data.clone()
visTensor(filter, ch=0, allkernels=False)
plt.axis('off')
plt.ioff()
plt.show()
Run Code Online (Sandbox Code Playgroud)
还有一些可视化技术,你可以在这里学习
首先,让我陈述一些事实,以免混淆。卷积层(也称为过滤器)由内核组成。当我们说我们使用的内核大小为 3 或 (3,3) 时,内核的实际形状是 3-d 而不是 2d。内核的深度与卷积层输入中的通道数相匹配。例如,
输入图像形状 (CxHxW): (3, 128, 128) 现在我们应用一个具有输出通道数 128 和内核大小 3 的卷积层。
self.conv1 = nn.Conv2d(in_channels=3, out_channels=128, kernel_size=8, stride = 4, padding = 2)
Run Code Online (Sandbox Code Playgroud)
输出形状为 (128, 32, 32),
内核形状为 (3, 8, 8)
,过滤器形状为 (num_kernels, kernel_depth, kernel_height, kernel_width): (128, 3, 8, 8)
滤波器中的核数与输出通道数相同。
很容易可视化第一层的过滤器,因为它们的深度维度为 1 或 3,具体取决于您的输入是灰度图像还是彩色图像。
self.conv1 = nn.Conv2d(in_channels=3, out_channels=128, kernel_size=8, stride = 4, padding = 2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5005 次 |
| 最近记录: |