Поскольку вы выбрали valid
в качестве border_mode
для свертки, произойдет следующее: при размере фильтра 3 x 3 мы удалим 1 пиксель вокруг границ для сгенерированных выходов фильтра на каждом Convolution2D
слой. Также обратите внимание, что пропуск аргумента предполагает также допустимое заполнение. Если вы решите уменьшение выходных размеров на каждом слое, вы попадете в точку, где одно из измерений (строк) размеров выходного фильтра будет равно 0, и, таким образом, вы получите ошибку. С d_filter = 3
давайте пройдемся по размерам выходного фильтра на каждом слое, учитывая, что размер входного изображения равен 13 x 78. Обратите внимание, что я опускаю показ выходных размеров фильтра на слоях Activation
и Dropout
, так как мы уже знаем, что они поддерживают те же размеры вывода, что и краткость:
model.add(Convolution2D(n_filters_1, d_filter, d_filter, border_mode='valid', input_shape=(data_w, data_h,2))) # 11 x 76
model.add(Activation('relu'))
model.add(Convolution2D(n_filters_1, d_filter, d_filter)) # 9 x 74
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) # 4 x 37
model.add(Dropout(p_drop_1))
model.add(Convolution2D(n_filters_2, d_filter, d_filter, border_mode='valid')) # 2 x 35
model.add(Activation('relu'))
model.add(Convolution2D(n_filters_2, d_filter, d_filter)) # 0 x 33 (!!!!)
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(p_drop_1))
Я хотел бы сразу предложить изменить border_mode
, чтобы он стал 'same'
. Таким образом, размеры выходного фильтра сохраняются для каждого слоя Convolution2D
, прежде чем он достигнет слоя пула. Я не уверен относительно вашей цели выбора правильной свертки, но попробуйте сделать это:
model.add(Convolution2D(n_filters_1, d_filter, d_filter, border_mode='same', input_shape=(data_w, data_h,2))) # 13 x 78
model.add(Activation('relu'))
model.add(Convolution2D(n_filters_1, d_filter, d_filter), border_mode='same') # 13 x 78
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) # 6 x 39
model.add(Dropout(p_drop_1))
model.add(Convolution2D(n_filters_2, d_filter, d_filter, border_mode='same')) # 6 x 39
model.add(Activation('relu'))
model.add(Convolution2D(n_filters_2, d_filter, d_filter), border_mode='same') # 6 x 39
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) # 3 x 19
model.add(Dropout(p_drop_1))
Если нет, вам нужно удалить некоторые слои Convolution2D
и MaxPooling2D
, чтобы можно было генерировать ненулевые выходные результаты фильтра. Проделайте ту же работу, что и я выше, чтобы выяснить, сколько вам нужно, чтобы удалить нужные слои. Я бы предложил удалить слои после первых Convolution2D
и Activation
слоев с фильтрами n_filters_2
:
model.add(Convolution2D(n_filters_1, d_filter, d_filter, border_mode='valid', input_shape=(data_w, data_h,2))) # 11 x 76
model.add(Activation('relu'))
model.add(Convolution2D(n_filters_1, d_filter, d_filter)) # 9 x 74
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2))) # 4 x 37
model.add(Dropout(p_drop_1))
model.add(Convolution2D(n_filters_2, d_filter, d_filter, border_mode='valid')) # 2 x 35
model.add(Activation('relu'))
# model.add(Convolution2D(n_filters_2, d_filter, d_filter)) # 0 x 33 (!!!!)
# model.add(Activation('relu'))
# model.add(MaxPooling2D(pool_size=(2, 2)))
# model.add(Dropout(p_drop_1))