Я новичок в глубоком обучении и Pytorch. Я хочу визуализировать свой фильтр в моей модели CNN, чтобы я мог повторять слой в модели CNN, которую я определяю. Но я встречаю ошибку, как показано ниже.
ошибка: объект «CNN» не является итерируемым
Объект CNN — моя модель.
Мой код итерации выглядит следующим образом:
for index, layer in enumerate(self.model):
# Forward pass layer by layer
x = layer(x)
код моей модели, как показано ниже:
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
Так что любой может сказать мне, как я могу решить эту проблему.
Как и этот связь, но я хочу реализовать его с помощью pytroch, поэтому я хочу повторить слой в модели.
По сути, вам нужно будет получить доступ к функциям вашей модели и сначала транспонировать эти матрицы в правильную форму, а затем вы сможете визуализировать фильтры.
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()
Вы должны быть в состоянии получить визуальную сетку.
Есть еще несколько приемов визуализации, их можно изучить здесь
К сведению: я думаю, что tensor.shape должен быть n, c, h, w
в соответствии с документацией Pytorch (pytorch.org/docs/stable/generated/torch.nn.Conv2d.html).
Он поднял AttributeError: объект «CNNModel» не имеет атрибута «функции», может ли кто-нибудь сказать мне, почему. большое спасибо
def imshow_filter(img,row,col):
print('-------------------------------------------------------------')
plt.figure()
for i in range(len(filters)):
w = np.array([0.299, 0.587, 0.114]) #weight for RGB
img = filters[i]
img = np.transpose(img, (1, 2, 0))
img = img/(img.max()-img.min())
img = np.dot(img,w)
plt.subplot(row,col,i+1)
plt.imshow(img,cmap= 'gray')
plt.xticks([])
plt.yticks([])
plt.show()
# swap color axis because
# numpy image: H x W x C
# torch image: C X H X W
filters = net.conv1.weight.data.cpu().numpy()
imshow_filter(filters)
это должно работать над вашим кодом
Я получаю TypeError: imshow_filter() missing 2 required positional arguments: 'row' and 'col'
какие должны быть эти значения?
Строка и столбец — это количество строк и столбцов изображения визуализации. Например, если у вас есть 32 фильтра на первом слое, вы можете отобразить их как изображение 4 x 8 или 8 x 4 или как угодно, если row * col = номер вашего фильтра.
Во-первых, позвольте мне привести некоторые факты, чтобы не было путаницы. Сверточный слой (также называемый фильтром) состоит из ядер. Когда мы говорим, что используем размер ядра 3 или (3,3), фактическая форма ядра является трехмерной, а не двухмерной. Глубина ядра соответствует количеству каналов на входе сверточного слоя. Например,
форма входного изображения (CxHxW): (3, 128, 128), и теперь мы применяем Conv Layer с количеством выходных каналов 128 и размером ядра 3.
self.conv1 = nn.Conv2d(in_channels=3, out_channels=128, kernel_size=8, stride = 4, padding = 2)
Выходная форма будет (128, 32, 32),
форма ядра будет (3, 8, 8)
и форма фильтра будет (num_kernels, kernel_depth, kernel_height, kernel_width): (128, 3, 8, 8)
Количество ядер в фильтре равно количеству выходных каналов.
Легко визуализировать фильтры первого слоя, поскольку они имеют размерность глубины 1 или 3 в зависимости от того, является ли ваш ввод полутоновым или цветным изображением соответственно.
# instantiate model
conv = ConvModel()
# load weights if they haven't been loaded
# skip if you're directly importing a pretrained network
checkpoint = torch.load('model_weights.pt')
conv.load_state_dict(checkpoint)
# get the kernels from the first layer
# as per the name of the layer
kernels = conv.first_conv_layer.weight.detach().clone()
#check size for sanity check
print(kernels.size())
# normalize to (0,1) range so that matplotlib
# can plot them
kernels = kernels - kernels.min()
kernels = kernels / kernels.max()
filter_img = torchvision.utils.make_grid(kernels, nrow = 12)
# change ordering since matplotlib requires images to
# be (H, W, C)
plt.imshow(filter_img.permute(1, 2, 0))
# You can directly save the image as well using
img = save_image(kernels, 'encoder_conv1_filters.png' ,nrow = 12)
Что вы подразумеваете под фильтром визуализации?