Я хочу классифицировать изображения с разными размерами ввода. Я хотел бы использовать следующие идеи бумаги.
'Полностью сверточные сети для семантической сегментации'
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)
и это изображения о моих данных.
Однако, есть некоторые проблемы с размерностью.
Поскольку выходной слой должен иметь 4 измерения в отличие от исходной модели CNN, размеры не помещаются в метку.
Краткое описание модели:
Оригинальное резюме модели CNN:
Как я могу справиться с этой проблемой? Я пытался изменить размер метки, увеличив размер.
label = np.expand_dims(label,0)
label = np.expand_dims(label,0)
label = np.expand_dims(label,0)
Я думаю, что есть лучший способ, и мне стало интересно, нужно ли использовать conv2DTranspose? И должен ли размер партии быть 1?