Замена максимального уровня объединения на средний уровень объединения в модели VGG

#deep-learning #pytorch

#глубокое обучение #pytorch

Вопрос:

Я следую этой статье и пытаюсь реализовать эту функцию:

 def replace_max_pooling(model):
 '''
 The function replaces max pooling layers with average pooling layers with 
 the following properties: kernel_size=2, stride=2, padding=0.
 '''
 for layer in model.layers:
    if layer is max pooling:
        replace
 

Но я получаю ошибку на итерации, которая гласит:

ModuleAttributeError: объект ‘VGG’ не имеет атрибута ‘layers’…

Как я могу сделать это правильно?

Комментарии:

1. Вы пробовали это с torch.nn.AvgPool2d ?

2. Я не пробовал, потому что я новичок в этом и не знаю, с чего начать… Как я могу выполнить итерацию по слоям и заменить их?

Ответ №1:

Модель VGG, предоставляемая Torchvision, содержит три компонента: features подмодуль avgpool (адаптивный средний пул) и classifier . Вам нужно смотреть в начало сети, где расположены уровни свертки и пула : features .

Вы можете перебирать слои nn.Module с named_children() помощью . Однако есть и другие способы сделать это. Вы можете использовать isinstance , чтобы определить, относится ли слой к определенному типу.

В этой конкретной модели слои называются по индексу. Итак, чтобы найти соответствующие слои в nn.Module и перезаписать их, мы можем преобразовать имена в int s .

 for i, layer in m.features.named_children():
    if isinstance(layer, torch.nn.MaxPool2d):
        m.features[int(i)] = nn.AvgPool2d(kernel_size=2, stride=2, padding=0)
 

Предварительная настройка:

 import torch
import torch.nn as nn
m = models.vgg16()