Выходные тензоры для Модели должны быть выходом Keras `Layer` (таким образом, удерживая метаданные прошлого слоя). При использовании функциональных API для CNN LSTM - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь выполнить простую классификацию cnn-lstm с распределением времени, но получаю следующую ошибку: Выходные тензоры в модель должны быть выходными данными Keras Layer (таким образом, удерживая метаданные прошлого слоя) , Найдено:

мои образцы представляют собой изображения в градациях серого с 366 каналами и размером 5x5 каждый образец имеет свою уникальную метку.

model_input = Input(shape=(366,5,5))

model = TimeDistributed(Conv2D(64, (3, 3), activation='relu', padding='same',data_format='channels_first')(model_input))
model = TimeDistributed(MaxPooling2D((2, 2),padding='same',data_format='channels_first'))

model = TimeDistributed(Conv2D(128, (3,3), activation='relu',padding='same',data_format='channels_first'))
model = TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2),padding='same',data_format='channels_first'))


model = Flatten()

model = LSTM(256, return_sequences=False, dropout=0.5)
model =  Dense(128, activation='relu')


model = Dense(6, activation='softmax')

cnnlstm = Model(model_input, model)
cnnlstm.compile(optimizer='adamax',
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])
cnnlstm.summary()

1 Ответ

0 голосов
/ 31 января 2020

Вы должны передавать тензоры между слоями, поскольку так работает Функциональный API для всех слоев, используя запись Layer(params...)(input):

model_input = Input(shape=(366,5,5))

model = TimeDistributed(Conv2D(64, (3, 3), activation='relu', padding='same',data_format='channels_first'))(model_input)
model = TimeDistributed(MaxPooling2D((2, 2),padding='same',data_format='channels_first'))(model)

model = TimeDistributed(Conv2D(128, (3,3), activation='relu',padding='same',data_format='channels_first'))(model)
model = TimeDistributed(MaxPooling2D((2, 2), strides=(2, 2),padding='same',data_format='channels_first'))(model)


model = TimeDistributed(Flatten())(model)

model = LSTM(256, return_sequences=False, dropout=0.5)(model)
model =  Dense(128, activation='relu')(model)


model = Dense(6, activation='softmax')(model)

cnnlstm = Model(model_input, model)

Обратите внимание, что я также исправил первое TimeDistributed слой, так как тензор был в неправильной части.

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