Как создать CNN для классификации изображений с динамическим вводом - PullRequest
0 голосов
/ 08 марта 2019

Я хотел бы создать полностью сверточную сеть для классификации двоичных изображений в pytorch, которая может принимать динамические размеры входного изображения, но я не совсем концептуально понимаю идею смены конечного слоя с полностью связанного слоя на слой свертки, Здесь и здесь оба заявляют, что это возможно при использовании свертки 1x1.

Предположим, у меня есть изображение 16x16x1 в качестве входных данных для CNN.После нескольких свертываний получается 16x16x32.Если я использую полностью связанный слой, я могу вывести одно значение, создав вес 16 * 16 * 32 и передав его в один нейрон.Чего я не понимаю, так это как бы вы могли получить одно значение при применении свертки 1x1.Разве вы не получили бы выход 16x16x1?

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Проверьте эту ссылку: http://cs231n.github.io/convolutional-networks/#convert

В этом случае ваш слой свертки должен быть фильтром 16 x 16 с 1 выходным каналом.Это преобразует вход 16 x 16 x 32 в один выход.

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

from keras.layers import Conv2D, Input
from keras.models import Model
import numpy as np
input = Input((16,16,32))
output = Conv2D(1, 16)(input)
model = Model(input, output)
print(model.summary()) # check the output shape
output = model.predict(np.zeros((1, 16, 16, 32))) # check on sample data
print(f'output is {np.squeeze(output)}')

Этот подход полностью сверточных сетей полезен в задачах сегментации с использованием подходов, основанных на исправлениях, поскольку вы можете ускорить прогнозирование (вывод), подавая большую частьthe image.

Для задач классификации у вас обычно есть слой fc в конце.В этом случае используется слой, подобный AdaptiveAvgPool2d, который гарантирует, что слой fc видит постоянный размер входного объекта независимо от размера входного изображения.https://pytorch.org/docs/stable/nn.html#adaptiveavgpool2d

См. Этот запрос на извлечение данных для torchvision VGG: https://github.com/pytorch/vision/pull/747

В случае Keras - GlobalAveragePooling2D.См. Пример «Тонкая настройка InceptionV3 для нового набора классов».https://keras.io/applications/

0 голосов
/ 09 марта 2019

Надеюсь, вы знакомы с керасом.Теперь посмотрите на ваше изображение 16 * 16 * 1.Изображение передается в сверточный слой керас, но сначала мы должны создать модель.как model=Sequential() этим мы можем получить экземпляр модели keras.Теперь мы дадим наш сверточный слой с нашими параметрами, такими как

model.add(Conv2D(20,(2,2),padding="same"))

, теперь мы добавляем 20 фильтров к нашему изображению.и наше изображение становится 16 * 16 * 20, теперь для большего количества лучших функций мы добавляем больше конвективных слоев, таких как

model.add(Conv2D(32,(2,2),padding="same"))

, теперь мы добавляем к вашему изображению 32 фильтра, после этого ваше изображение будет иметь размер 16 * 16 * 32.

не забыл поставить активацию после конвоя.Если вы новичок, вам следует изучить возможности активации, оптимизации и потери сети.это основная часть нейронных сетей.

Теперь пришло время перейти к полностью связанному слою.Сначала нам нужно сгладить наше изображение, потому что полностью связанный слой работает только на 2d векторах (no_of_ex, image_dim), в вашем случае уменьшение imgae после применения сглаживания будет (16 * 16 * 32)

model.add(Flatten())

после растягиванияimage Ваша сеть передаст ее полностью соединенным слоям

    model.add(Dense(32))
    model.add(Activation("relu"))
    model.add(Dense(8))
    model.add(Activation("relu"))
    model.add(Dense(2)) 

, потому что у вас есть проблема двоичной классификации, если вам нужно классифицировать 3 класса, тогда как последний слой будет иметь 3 нейрона, если вам нужно классифицировать 10 примеров, чемваш последний плотный слой будет иметь 10 нейронов.

model.add(Activation("softmax"))
    model.compile(loss='binary_crossentropy',
                  optimizer=Adam(),
                  metrics=['accuracy'])
   return model

после этого вам нужно будет соответствовать этой модели.

estimator=model()
estimator.fit(X_train,y_train)

полный код:

def model (classes):
    model=Sequential()

        # conv2d set  =====> Conv2d====>relu=====>MaxPooling
    model.add(Conv2D(20,(5,5),padding="same"))
    model.add(Activation("relu"))
    model.add(Conv2D(32,(5,5),padding="same"))
    model.add(Activation("relu"))

    model.add(Flatten())
    model.add(Dense(32))
    model.add(Activation("relu"))
    model.add(Dense(8))
    model.add(Activation("relu"))
    model.add(Dense(2))

        #now adding Softmax Classifer because we want to classify 10 class

    model.add(Dense(classes))
    model.add(Activation("softmax"))
    model.compile(loss='categorical_crossentropy',
                  optimizer=Adam(lr=0.0001, decay=1e-6),
                  metrics=['accuracy'])
    return model

Вы можете получить помощь от этого кернала

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...