#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. Нет смысла использовать рекуррентную сеть, если ваш ввод имеет только один временной шаг