如何使用 PyTorch 在 CNN 中可视化过滤器

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)

您应该能够获得网格视觉效果。 在此处输入图片说明

还有一些可视化技术,你可以在这里学习


adi*_*ana 6

首先,让我陈述一些事实,以免混淆。卷积层(也称为过滤器)由内核组成。当我们说我们使用的内核大小为 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)

自编码器的过滤器