Не могу сделать Conv1D с tf.keras - PullRequest
0 голосов
/ 30 января 2020

У меня есть следующая модель, и набор данных содержит 186093 временных рядов, где каждый временной ряд имеет длину 48

Версия Tensorflow 2.x

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv1D(30, 4, activation=tf.nn.selu, input_shape=(train_data.shape[1], train_data.shape[0])),
    tf.keras.layers.MaxPooling1D(3),
    tf.keras.layers.Conv1D(15, 2, padding='same', activation=tf.keras.activations.selu),
    tf.keras.layers.MaxPooling1D(3),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation=tf.keras.activations.relu),
    tf.keras.layers.Dense(1, activation=tf.keras.activations.sigmoid)
])

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

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d (Conv1D)              (None, 45, 30)            22331190  
_________________________________________________________________
max_pooling1d (MaxPooling1D) (None, 15, 30)            0         
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 15, 15)            915       
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 5, 15)             0         
_________________________________________________________________
flatten (Flatten)            (None, 75)                0         
_________________________________________________________________
dense (Dense)                (None, 128)               9728      
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 129       
=================================================================
Total params: 22,341,962
Trainable params: 22,341,962
Non-trainable params: 0

Однако, когда я пытаюсь обучить модель, как показано ниже

model.fit(train_data, train_result, epochs=2000, validation_split=0.2, verbose=0, callbacks=[early_stop])

Я получаю следующую ошибку

ValueError: Error when checking input: expected conv1d_input to have 3 dimensions, but got array with shape (186093, 48)

Я попытался изменить input_shape на (Нет, 48), так как у меня 48 функций. Но тогда я даже не могу создать модель, поскольку она выдает ошибку ниже

ValueError: The last dimension of the inputs to `Dense` should be defined. Found `None`.

Может ли кто-нибудь помочь мне выяснить, что я делаю здесь неправильно или отсутствует?

1 Ответ

1 голос
/ 30 января 2020

Проблема просто в форме ваших данных.

Во-первых, я предполагаю, что train_data.shape[0] дает 186093. Это число дискретных выборок. Это не количество элементов в одном образце.

Поэтому измените input_shape=(train_data.shape[1], train_data.shape[0]) на input_shape=(train_data.shape[1], 1)

Далее,

Conv1D (при использовании для времени- series) ожидает данные формы [batch_size, временные шаги, функции]. В вашем случае features равно 1.

Поэтому вы можете установить правильную форму следующим образом (Предполагая, что вы используете numpy):

train_data = np.expand_dims(train_data, axis=-1)

Добавьте эту строку перед вызовом model.fit()

...