ожидал, что time_distributed_38_input будет иметь 5 измерений, но получит массив с формой (13974, 100, 6, 5) - PullRequest
0 голосов
/ 30 сентября 2019

Размер поезда: 13974 Размер теста: 3494 Форма поезда: (13974, 101, 6, 5) Форма теста: (3494, 101, 6, 5) Форма входа поезда: (13974, 100, 6, 5) Выход поездаshape: (13974, 1, 6, 5) тестовая входная форма: (3494, 100, 6, 5) тестовая выходная форма: (3494, 1, 6, 5)

model = Sequential()
model.add(TimeDistributed(Conv2D(32, (3, 3), padding='same'), 
input_shape=(100, 6, 5,1)))
model.add(TimeDistributed(Activation('relu')))
model.add(TimeDistributed(Conv2D(32, (3, 3))))
model.add(TimeDistributed(Activation('relu')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Dropout(0.25)))

model.add(TimeDistributed(Flatten()))
model.add(TimeDistributed(Dense(512)))

model.add(TimeDistributed(Dense(35, name="first_dense_flow" )))

model.add(LSTM(20, return_sequences=True, name="lstm_layer_flow"));    
model.add(TimeDistributed(Dense(101), name=" time_distr_dense_one_ flow "))  
model.add(GlobalAveragePooling1D(name="global_avg_flow"))
model.compile(loss='mae', optimizer='adam', metrics=['accuracy'])
model.fit(train_input,train_output,epochs=50,batch_size=60)

Я получил ValueError:Ошибка при проверке ввода: ожидалось, что time_distributed_38_input будет иметь 5 измерений, но получил массив с формой (13974, 100, 6, 5)

Мне нужно предсказать (1,6,5) из (100,6,5)) где 100 - отметка времени.

Пожалуйста, исправьте любые изменения, необходимые в модели

1 Ответ

0 голосов
/ 30 сентября 2019

См. Переписанный фрагмент:

model.add(Conv2D(32, (3, 3), padding='same'), input_shape=(100, 6, 5))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(TimeDistributed(Dense(512)))
model.add(TimeDistributed(Dense(35, name="first_dense_flow" )))

model.add(LSTM(20, return_sequences=True, name="lstm_layer_flow"));    
model.add(TimeDistributed(Dense(101), name=" time_distr_dense_one_ flow "))  
model.add(GlobalAveragePooling1D(name="global_avg_flow"))
  • Бросьте 1 в input_shape;input_shape равно batch_shape без измерения пакета - поэтому у вас будет batch_shape = (60, 100, 6, 5) (начиная с batch_size=60)
  • Ваша форма данных (101, 6, 5), а input_shape - (100, 6, 5) - этоможет не всегда работать;либо задайте input_shape=(101, 6, 5), либо данные срезов перед подачей в модель (например, x[:, :100, :, :])
  • Conv2D не нужно TimeDistributed, так как ваш ввод 3D (минус пакетное затемнение)
  • Activation, MaxPooling2D и Dropout автоматически масштабируются с учетом их входного размера, поэтому TimeDistributed является избыточным
  • Flatten, что устраняет отношения timesteps - channels, и может небыть звуковым дополнением - но если вы все равно будете его использовать, вам нужно избавиться от TimeDistributed для двух Dense после, затем Reshape до подачи на LSTM
...