ValueError: Ошибка при проверке ввода: ожидалось, что input_58 будет иметь 3 измерения, но получил массив с формой (10000, 10020) - PullRequest
0 голосов
/ 11 февраля 2020

Итак, я пытаюсь создать 1D CNN автоэнкодер с данными, имеющими форму (10000, 10020). Вот мои настройки:

input_wave = Input(shape=(10020,1))
encode1 = Conv1D(16, 16)(input_wave)
pool1 = MaxPooling1D(3)(encode1)
encode2 = Conv1D(32, 60)(pool1)
pool2 = MaxPooling1D(5)(encode2)
encode3 = Conv1D(64, 130)(pool2)
pool3 = MaxPooling1D(5)(encode3)
encode4 = Conv1D(128, 105)(pool3)
up1 = UpSampling1D(10)(encode4)
drop = Dropout(.2)(up1)
up2 = UpSampling1D(10)(drop)
drop2 = Dropout(.2)(up2)
flat  = Flatten()(drop2)
Den = Dense(10020, activation = 'sigmoid', input_shape = (12800, 1))(flat)

autoencoder.compile(optimizer = 'Adam',
                    loss = 'mean_squared_error',
                    metrics = ['accuracy'])

autoencoder = Model(input_wave, Den)
autoencoder.summary()

Here is the summary

Я, к сожалению, не могу опубликовать сами данные, но их цифра c, от 0 до 1, имеет нет NA, и есть данные формы сигнала.

Когда я запускаю data.shape (), я получаю:

(10000, 10020)

Когда я запускаю тип (data), я получаю:

pandas.core.frame.DataFrame

I, мое выражение fit выглядит так:

autoencoder.fit(data,data,
                batch_size = 250,
                epochs = 10)

, и я получаю следующую ошибку:

  ValueError: Error when checking target: expected dense_7 to have 2 dimensions, but got array with shape (10000, 10020, 1)

Я попытался использовать data.values ​​и изменил свои данные с помощью следующего кода:

data = np.reshape(i_data[1].values, (10000, 10020, 1))

но это дает мне эту ошибку:

ValueError: Error when checking target: expected dense_7 to have 2 dimensions, but got array with shape (10000, 10020, 1)

Так что, похоже, моя сеть плохо структурирована в любом случае. Извините, но я не могу опубликовать свои данные :( но я могу сделать игрушечные данные, если это поможет! У кого-нибудь есть идеи, где моя проблема со структурой?

1 Ответ

1 голос
/ 11 февраля 2020

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

Вы должны восстановить данные с той же формой, поэтому вашему последнему слою нужно вывести форма (batch, 10020, 1), это ваша ошибка, вы применяете Flatten и Dense к своим данным, поэтому у вас есть только 2 измерения в качестве ожидаемого результата.

Вот простой рабочий пример того, что вы можете иметь как Автоэнкодер:

x = Input(shape=(10020, 1), name="input")
h = Conv1D(filters=50, kernel_size=3, activation="relu", padding='same', name='Conv1')(x)
h = MaxPooling1D(pool_size=2, name='Maxpool1')(h)
h = Conv1D(filters=150, kernel_size=3, activation="relu", padding='same', name='Conv2')(h)
h = MaxPooling1D(pool_size=2,  name="Maxpool2")(h)
y = Conv1D(filters=150, kernel_size=3, activation="relu", padding='same', name='conv-decode1')(h)
y = UpSampling1D(size=2, name='upsampling1')(y)
y = Conv1D(filters=50, kernel_size=3, activation="relu", padding='same', name='conv-decode2')(y)
y = UpSampling1D(size=2, name='upsampling2')(y)
y = Conv1D(filters=1, kernel_size=3, activation="relu", padding='same', name='conv-decode3')(y)


autoencoder = Model(x, y)

Вы можете играть с размером ядер и фильтрами, как вы sh, но вам нужно декодировать данные так же, как вы их закодировали.

Более того, здесь ваша модель имеет 129 миллионов параметров из-за вашего последнего плотного слоя, это очень много.

Скажите, если вам нужно больше точности.

...