Проблемы с Keras Conv1D и VGG - PullRequest
       65

Проблемы с Keras Conv1D и VGG

1 голос
/ 18 марта 2020

Я пытаюсь построить модель глубокого обучения с VGG16 на вершине. Я реализовал это в Keras, используя следующий код:

image_input = Input(shape=(224, 224, 3))

model = VGG16(input_tensor=image_input, include_top=True,weights='imagenet')
model.summary()
fc7 = model.get_layer('fc2').output
conv1d = Conv1D(1,5,activation='relu', name="conv1d",input_shape=(1,4096)) (fc7) #error appears here
# flat = Flatten()(conv1d)
fc8 = Dense(512, activation='relu', name="fc8")(conv1d)
#x= Flatten(name='flatten')(last_layer)
out = Dense(num_classes, activation='softmax', name='output')(fc8)
custom_vgg_model = Model(image_input, out)
custom_vgg_model.summary()

Я получаю следующую ошибку:

ValueError: Input 0 is incompatible with layer conv1d: expected ndim=3, found ndim=2

Почему мы не можем сделать последовательные векторы функций 1d свертки, как в изображение ниже? введите описание ссылки здесь

1 Ответ

1 голос
/ 18 марта 2020

Полностью связанный слой в VGG является 2D, а 1D сверточный слой ожидает 3D-данные.

В тот момент, когда VGG добавляет слой Dense, он уничтожает формат изображения (4D) со сглаживанием или глобальным пулом, превращая его в простые данные (2D). У вас больше нет размеров для использования сверток.

Если вы попытаетесь объяснить, почему вам нужен Conv1D, что вы ожидаете от него, тогда мы могли бы подумать об альтернативе.


Пример модели:

movie_data = any_data_with_shape((number_of_videos, frames, 224, 224, 3))
movie_input = Input((None,224,224,3)) #None means any number of frames

vgg = VGG16(include_top=True,weights='imagenet')

Эта часть необходима, только если вы получаете промежуточные выходные данные от vgg:

vgg_in = vgg.input
vgg_out = vgg.get_layer('fc2').output #make sure this layer exists
vgg = Model(vgg_in, vgg_out)

Продолжение:

vgg_outs = TimeDistributed(vgg)(movie_input) #out shape (None, frames, fc2_units)

outs = Conv1D(.....)(vgg_outs)
outs = GlobalAveragePooling1D()(outs)
outs = Dense(....)(outs)
.....

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