Как убедиться, что output_shape con1D совпадает с input_shape с временными рядами в keras autoencoder?

#python #keras #time-series #conv-neural-network #autoencoder

#python #keras #временные ряды #conv-нейронная сеть #автоэнкодер

Вопрос:

Неправильная форма вывода Conv1D в модели автоэнкодера keras при запуске autoencoder fit.

Я пытаюсь использовать модель автоэнкодера keras для сжатия и распаковки моих данных временных рядов. но когда я меняю слой на Conv1D , форма вывода неверна.

У меня есть некоторые данные временных рядов в форме (4000, 689), где представлены 4000 выборок, и каждая выборка имеет 689 функций. Я хочу использовать Conv1D для сжатия данных, но форма Upsampling вывода слоя и последнего Conv1D слоя (?, 688, 1) не равна форме ввода (, 689, 1).

Как я должен установить параметры этих слоев? Заранее спасибо.

 x_train = data[0:4000].values
x_test = data[4000:].values
print('x_train shape:', x_train.shape)
print('x_test shape:', x_test.shape)
 

форма x_train: (4000, 689)
форма x_test: (202, 689)

Я изменил формат x_train, x_test на 3dim, как показано ниже.

 x_tr = x_train.reshape(4000,689,1)
x_te = x_test.reshape(202,689,1)
print('x_tr shape:', x_tr.shape)
print('x_te shape:', x_te.shape)
 

форма x_tr: (4000, 689, 1)
форма x_te: (202, 689, 1)

 input_img = Input(shape=(689,1))

x = Conv1D(16, 3, activation='relu', padding='same')(input_img)
print(x)
x = MaxPooling1D(2, padding='same')(x)
print(x)
x = Conv1D(8, 3, activation='relu', padding='same')(x)
print(x)
x = MaxPooling1D(2, padding='same')(x)
print(x)
x = Conv1D(8, 3, activation='relu', padding='same')(x)
print(x)
encoded = MaxPooling1D(2)(x)
print(encoded)
print('--------------')
    
    
x = Conv1D(8, 3, activation='relu', padding='same')(encoded)
print(x)
x = UpSampling1D(2)(x)
print(x)
x = Conv1D(8, 3, activation='relu', padding='same')(x)
print(x)
x = UpSampling1D(2)(x)
print(x)
x = Conv1D(16, 3, activation='relu', padding='same')(x)
print(x)
x = UpSampling1D(2)(x)
print(x)
decoded = Conv1D(1, 3, activation='sigmoid', padding='same')(x)
print(decoded)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='mse')
 

Когда я импортировал эти модели и запустил ячейки выше в Jupyter, кажется, все в порядке. Возможно. Но я получаю ошибку в следующем коде при запуске autoencoder.fit .

 autoencoder.fit(x_tr, x_tr, epochs=50, batch_size=128, shuffle=True, validation_data=(x_te, x_te)) 
 

Итак, я print каждый слой.

Результат каждого слоя print приведен ниже.

 Tensor("conv1d_166/Relu:0", shape=(?, 689, 16), dtype=float32)
Tensor("max_pooling1d_71/Squeeze:0", shape=(?, 345, 16), dtype=float32)
Tensor("conv1d_167/Relu:0", shape=(?, 345, 8), dtype=float32)
Tensor("max_pooling1d_72/Squeeze:0", shape=(?, 173, 8), dtype=float32)
Tensor("conv1d_168/Relu:0", shape=(?, 173, 8), dtype=float32)
Tensor("max_pooling1d_73/Squeeze:0", shape=(?, 86, 8), dtype=float32)

Tensor("conv1d_169/Relu:0", shape=(?, 86, 8), dtype=float32)
Tensor("up_sampling1d_67/concat:0", shape=(?, 172, 8), dtype=float32)
Tensor("conv1d_170/Relu:0", shape=(?, 172, 8), dtype=float32)
Tensor("up_sampling1d_68/concat:0", shape=(?, 344, 8), dtype=float32)
Tensor("conv1d_171/Relu:0", shape=(?, 344, 16), dtype=float32)
Tensor("up_sampling1d_69/concat:0", shape=(?, 688, 16), dtype=float32)
Tensor("conv1d_172/Sigmoid:0", shape=(?, 688, 1), dtype=float32) 
 

Ошибка значения ниже:

 ValueError                                Traceback (most recent call last)
<ipython-input-74-56836006a800> in <module>
      3                 batch_size=128,
      4                 shuffle=True,
----> 5                 validation_data=(x_te, x_te)
      6                 )

~/anaconda3/envs/keras/lib/python3.6/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)
    950             sample_weight=sample_weight,
    951             class_weight=class_weight,
--> 952             batch_size=batch_size)
    953         # Prepare validation data.
    954         do_validation = False

~/anaconda3/envs/keras/lib/python3.6/site-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    787                 feed_output_shapes,
    788                 check_batch_axis=False,  # Don't enforce the batch size.
--> 789                 exception_prefix='target')
    790 
    791             # Generate sample-wise weight values given the `sample_weight` and

~/anaconda3/envs/keras/lib/python3.6/site-packages/keras/engine/training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    136                             ': expected '   names[i]   ' to have shape '  
    137                             str(shape)   ' but got array with shape '  
--> 138                             str(data_shape))
    139     return data
    140 

ValueError: Error when checking target: expected conv1d_172 to have shape (688, 1) but got array with shape (689, 1)
 

Является floor ли функция причиной этого?
Как исправить ошибку и autoencoder.fit правильно?
Заранее спасибо.