У меня есть генератор, который выдает данные в форме (32, 9, 200, 1)
, где 32 - размер пакета. Модель для него выглядит следующим образом:
def create_model(le):
optimizer = Adam(lr=0.001)
model = Sequential()
model.add(TimeDistributed(Conv1D(filters=32, kernel_size=30, activation='relu'), input_shape=(None, 200, 1)))
model.add(TimeDistributed(BatchNormalization()))
model.add(TimeDistributed(Conv1D(filters=32, kernel_size=10, activation='relu')))
model.add(TimeDistributed(MaxPool1D(pool_size=2)))
model.add(TimeDistributed(BatchNormalization()))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(50))
model.add(Dense(30, activation='relu'))
model.add(Dense(len(le.classes_), activation='softmax'))
model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy'])
print(model.summary())
return model
Эта модель хорошо работает. Вторым способом я получаю данные в форме 5x (32, 9, 200, 1)
. Причина 5x
в том, что я выдаю список из 5 массивов для подачи модели с несколькими входами. Модель выглядит следующим образом:
def create_model():
input_x = Input(batch_shape=(None, 200, 1), dtype='float32')
conv_1 = TimeDistributed(Conv1D(64, kernel_size=(20), activation='relu'))(input_x)
maxpool_1 = TimeDistributed(MaxPool1D(pool_size=(4)))(conv_1)
bn_1 = TimeDistributed(BatchNormalization())(maxpool_1)
conv_2 = TimeDistributed(Conv1D(64, kernel_size=(10), activation='relu'))(bn_1)
maxpool_2 = TimeDistributed(MaxPool1D(pool_size=(4)))(conv_2)
flatten = TimeDistributed(Flatten())(maxpool_2)
lstm_1 = LSTM(50)(flatten)
dense1 = Dense(units=64, activation='relu')(lstm_1)
out = Dense(units=32, activation='relu')(dense1)
model = Model(input_x, out)
inputA = Input(shape=(latent_dimension, 1), dtype='float32')
inputB = Input(shape=(latent_dimension, 1), dtype='float32')
inputC = Input(shape=(latent_dimension, 1), dtype='float32')
inputD = Input(shape=(latent_dimension, 1), dtype='float32')
inputE = Input(shape=(latent_dimension, 1), dtype='float32')
cnn_out1 = model(inputA)
cnn_out2 = model(inputB)
cnn_out3 = model(inputC)
cnn_out4 = model(inputD)
cnn_out5 = model(inputE)
combined = concatenate([cnn_out1, cnn_out2, cnn_out3, cnn_out4, cnn_out5], axis=-1)
fully_connected = Dense(64, activation="relu")(combined)
outputs_fc = Dense(13, activation="softmax")(fully_connected)
model_encoded = Model(
inputs=[inputA, inputB, inputC, inputD, inputE], outputs=outputs_fc)
adamtopimizer = optimizers.Adam(lr=0.001)
model_encoded.compile(optimizer=adamtopimizer, loss='categorical_crossentropy', metrics=['accuracy'])
print(model_encoded.summary())
return model_encoded
Но вторая выдает ошибку, в строке conv_1
:
ValueError: Входной тензор должен иметь ранг 3, 4 или 5, но было 2.
Эта ошибка возникает в create_model
, так что это вообще до того, как генератор заработает, поэтому я не думаю, что это имеет отношение к генератору, который я использую.
Почему он хорошо работает в первом, но не работает во втором? Я могу дать любую информацию, которая вам нужна. Спасибо.
Edit-1: Если я изменю его на input_x = Input(batch_shape=(None, 9, 200, 1), dtype='float32')
, он все равно выдаст ошибку выше.