我正在进行一个分类机器学习任务,输入形状为(700,50,34)(批次,时间步,长)
def convLSTM_model(X_train, y_train, X_test, y_test, num_classes,loss, batch_size=68, units=128, learning_rate=0.005, epochs=20, dropout=0.2, recurrent_dropout=0.2): class myCallback(tf.keras.callbacks.Callback): def on_epoch_end(self, epoch, logs={}): if (logs.get('acc') > 0.9): print("\n已达到90%准确率,取消训练!") self.model.stop_training = True callbacks = myCallback() model = tf.keras.models.Sequential() model.add(Masking(mask_value=0.0, input_shape=(None,X_train.shape[0],X_train.shape[1], X_train.shape[2]))) model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3), padding="same", return_sequences=True)) model.add(BatchNormalization()) model.add(Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout, return_sequences=True))) model.add(Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout, return_sequences=True))) model.add(Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout))) model.add(Dense(30, activation='relu')) model.add(Dense(10, activation='relu')) model.add(Dense(num_classes, activation='softmax')) adamopt = tf.keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-8) model.compile(loss=loss, optimizer=adamopt, metrics=['accuracy']) history = model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(X_test, y_test), verbose=1, callbacks=[callbacks]) score, acc = model.evaluate(X_test, y_test, batch_size=batch_size) yhat = model.predict(X_test) return history, that
显然,仅仅更改input_shape并简单地添加
model.add(ConvLSTM2D(filters=40, kernel_size=(3, 3), padding="same", return_sequences=True))model.add(BatchNormalization())
是行不通的。
ValueError: 两个形状的维度1必须相等,但它们是708和501264。形状分别是[?,708,50,40]和[?,501264,2500,40]。对于'conv_lst_m2d/while/Select'(操作:'Select')的输入形状为:[?,501264,2500,40],[?,708,50,40],[?,708,50,40]。
我应该如何处理?关于滤波器的数量有什么建议吗?
回答:
试试这个,我认为CNN
层应该在masking
层之前实现。
model = tf.keras.models.Sequential() model.add(Conv1D(filters=32, kernel_size=8, strides=1, activation="relu", padding="same",input_shape=(X_train.shape[1], X_train.shape[2]))) model.add(MaxPooling1D(pool_size = 2)) model.add(Conv1D(filters=16, kernel_size=8, strides=1, activation="relu", padding="same")) model.add(MaxPooling1D(pool_size = 2)) model.add(Masking(mask_value=0.0)) model.add(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout, return_sequences=True)) model.add(Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout, return_sequences=True))) model.add(Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout, return_sequences=True))) model.add(Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout))) model.add(Dense(30, activation='relu')) model.add(Dense(10, activation='relu')) model.add(Dense(num_classes, activation='softmax'))