Как изменить плотный слой на слой conv2D в керасе? - PullRequest
0 голосов
/ 15 января 2019

Я хочу классифицировать изображения с разными размерами ввода. Я хотел бы использовать следующие идеи бумаги.

'Полностью сверточные сети для семантической сегментации' https://www.cv -foundation.org / OpenAccess / content_cvpr_2015 / документы / Long_Fully_Convolutional_Networks_2015_CVPR_paper.pdf

Я изменил плотный слой на слой conv2D, как это.

def FullyCNN(input_shape, n_classes):

inputs = Input(shape=(None, None, 1))

first_layer = Conv2D(filters=16, kernel_size=(12,16), strides=1, activation='relu', kernel_initializer='he_normal', name='conv1')(inputs)
first_layer = BatchNormalization()(first_layer)
first_layer = MaxPooling2D(pool_size=2)(first_layer)

second_layer = Conv2D(filters=24, kernel_size=(8,12), strides=1, activation='relu', kernel_initializer='he_normal', name='conv2')(first_layer)
second_layer = BatchNormalization()(second_layer)
second_layer = MaxPooling2D(pool_size=2)(second_layer)

third_layer = Conv2D(filters=32, kernel_size=(5,7), strides=1, activation='relu', kernel_initializer='he_normal', name='conv3')(first_layer)
third_layer = BatchNormalization()(third_layer)
third_layer = MaxPooling2D(pool_size=2)(third_layer)

fully_layer = Conv2D(64, kernel_size=8, activation='relu', kernel_initializer='he_normal')(third_layer)
fully_layer = BatchNormalization()(fully_layer)
fully_layer = Dropout(0.5)(fully_layer)
fully_layer = Conv2D(n_classes, kernel_size=1)(fully_layer)
output = Conv2DTranspose(n_classes, kernel_size=1, activation='softmax')(fully_layer)
model = Model(inputs=inputs, outputs=output)
return model

и я создал генератор для использования fit_generator ().

def data_generator(x_train, y_train):
      while True:

          index = np.asscalar(np.random.choice(len(x_train),1))
          feature = np.expand_dims(x_train[index],-1)
          feature = np.resize(feature,(-1,feature.shape))
          feature = np.expand_dims(feature,0) # make (1,input_height,input_width,1) 
          label = y_train[index]
          yield (feature,label)

и это изображения о моих данных.

y_train_onehot_img

y_train_img

Однако, есть некоторые проблемы с размерностью. Поскольку выходной слой должен иметь 4 измерения в отличие от исходной модели CNN, размеры не помещаются в метку.

Краткое описание модели:

My model summary_img

Оригинальное резюме модели CNN:

Original CNN model summary img

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

label = np.expand_dims(label,0)
label = np.expand_dims(label,0)
label = np.expand_dims(label,0)

Я думаю, что есть лучший способ, и мне стало интересно, нужно ли использовать conv2DTranspose? И должен ли размер партии быть 1?

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