Выходные тензоры для модели должны быть выходом слоя Keras (таким образом, удерживая метаданные прошлого слоя) - PullRequest
0 голосов
/ 13 апреля 2019

Я хочу построить сеть CNN-LSTM, как описано в Автоматическая классификация ступеней сна с использованием сверточных нейронных сетей с длинной кратковременной памятью для классификации ступеней сна. Хотите достичь архитектуры модели, как описано в приложении (изображение прилагается). enter image description here

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

Кажется, что эта часть хорошо работает даже на моих данных (после подгонки). Проблема начинается с LSTM части. Было бы замечательно, если бы вы могли посмотреть на мою архитектуру как для CNN, так и для LSTM, потому что я не очень уверен, где на самом деле начинается проблема. Заранее большое спасибо.

from keras.layers import Input, Conv1D

from keras.layers import Dropout, BatchNormalization

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

from keras import regularizers

block1 = Conv1D( kernel_size=(50,),filters=128, strides=5, kernel_regularizer=regularizers.l2(0.05))(inputs)
#block1 = Dropout(0.2)(block1)

#block1 = BatchNormalization()(block1)
block1.get_shape

block2 = Conv1D(strides=1,kernel_size=5, filters=256,  kernel_regularizer=regularizers.l2(0.01))(block1)

block2 = Dropout(0.2)(block2)

block2 = BatchNormalization()(block2)

block2.get_shape

from keras.layers import MaxPooling1D

block2_output = MaxPooling1D( strides=2,)(block2)
block2_output.get_shape

block3 = Conv1D(kernel_size=5, filters=300, strides=2, kernel_regularizer=regularizers.l2(0.01))(block2_output)

block3 = Dropout(0.2)(block3)

block3 = BatchNormalization()(block3)

block3.get_shape

block3_output = MaxPooling1D(pool_size=3, strides=2)(block3)
block3_output.get_shape

from keras.layers import Dense
from keras.layers import Flatten
import numpy as np

block4=Flatten()(block3_output)

block4=Dense(1500,)(block4)
block4=Dropout(0.5)(block4)
block4=BatchNormalization()(block4)

block4.shape

block5=Dense(1500,)(block4)
block5=Dropout(0.5)(block5)
block5=BatchNormalization()(block5)

block5.shape

block6=Dense(5, activation='softmax')(block5)

block6.shape

from keras.models import Model
model = Model(inputs=inputs, outputs=block6)

model.summary()
# LSTM STARTS HERE
lstminputs=inputs = Input(shape=(1500,1))

import tensorflow as tf
from keras.layers import LSTM
block6_new = tf.reshape(block6,(100,1,1))
block7=LSTM(1,recurrent_dropout=0.3)(block6_new)
block7=Dropout(0.3)(block7)

block7.shape

block7_new = tf.reshape(block7,(100,1,1))
block8=LSTM(1,recurrent_dropout=0.3)(block7_new)
block8=Dropout(0.3)(block8)
block8.shape

block8_new = tf.reshape(block8,(1,100))
block9=Dense(5, activation='softmax')(block8_new)
block9.shape
block9 = tf.reshape(block9,(5,1))
block9.shape

lstmmodel=Model(inputs=lstminputs, outputs=block9)

В приведенной выше строке выскакивает следующая ошибка:

ValueError: Выходные тензоры в модель должны быть выходными данными Keras Layer (таким образом, удерживая метаданные прошлого слоя). Найденный: Тензор ("Reshape_26: 0", форма = (5, 1), dtype = float32)

...