Ошибка Keras Negative dimension size Conv1D

#python #tensorflow #machine-learning #keras

#python #тензорный поток #машинное обучение #keras

Вопрос:

я пытаюсь улучшить свою модель и прочитать статью «использование CNN и Bi-LSTM» для улучшения. Прямо сейчас я пытаюсь заставить код работать, но я застрял. Ошибка, которую я получаю, это

 ValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node time_distributed/conv1d/conv1d}} = Conv2D[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 1], explicit_paddings=[], padding="VALID", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](time_distributed/conv1d/conv1d/ExpandDims, time_distributed/conv1d/conv1d/ExpandDims_1)' with input shapes: [?,1,1,20], [1,2,20,24].
  

мои входные формы выглядят следующим образом:

 X (13800, 1, 20)
y (13800, 1)
  

код модели выглядит следующим образом:

 def ml_model(train_x,train_y):
    # prep data
    train_y = train_y
    train_x = train_x
    # define parameters
    verbose, epochs, batch_size = 0, 250, 24 #250 epoch
    n_timesteps, n_features, n_outputs = train_x.shape[1], train_x.shape[2], train_y.shape[1]
    # reshape output
    train_y = train_y.reshape((train_y.shape[0], train_y.shape[1], 1))
    model = Sequential()
    model.add(TimeDistributed(Conv1D(filters=24, kernel_size=2, activation='relu'), input_shape=(None, n_timesteps, n_features)))
    model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
    model.add(TimeDistributed(Conv1D(filters=64, kernel_size=2,activation='relu')))
    model.add(TimeDistributed(MaxPooling1D(pool_size=2)))
    model.add(TimeDistributed(Flatten()))
    model.add(Bidirectional(LSTM(64, activation='relu',return_sequences=True)))
    model.add(Bidirectional(LSTM(64, activation='relu')))
    model.add(Dense(128))
    model.add(Dropout(0.5))
    model.add(Dense(1))
    model.compile(optimizer='adam', loss='mse')

    model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, verbose=verbose)
    return model
  

Комментарии:

1. при 1 временном шаге ядро> 1 в свертке и операция maxpooling бесполезны и вызывают ошибку… (также TimeDistributed кажется бесполезным в вашем случае)

2. Нет смысла использовать рекуррентную сеть, если ваш ввод имеет только один временной шаг