Керас показывает ошибку формы в конце первой эпохи - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь создать автокодер LSTM с керасом

. В то же время он показывает ошибку значения в конце первой эпохи

ValueError: operands could not be broadcast together with shapes (32,20) (20,20) (32,20) 

Форма ввода модели (sample_size, 20, 31), а далее - модель

Функция выборки:

def sampling(args):

    z_mean, z_log_var = args
    batch = K.shape(z_mean)[0]
    dim = K.int_shape(z_mean)[1]
    # by default, random_normal has mean=0 and std=1.0
    epsilon = K.random_normal(shape=(batch,dim))
    return z_mean + K.exp(0.5 * z_log_var) * epsilon 

Часть кодера:

inputs = Input(shape=(lag,data.shape[1],), name='encoder_input')
x = LSTM(30,activation='relu',return_sequences=True) (inputs)
x = LSTM(60,activation='relu') (x)
z_mean = Dense(60, name='z_mean')(x)
z_log_var = Dense(60, name='z_log_var')(x)
z_temp = Lambda(sampling, output_shape=(60,), name='z')([z_mean, z_log_var])
z = RepeatVector(lag)(z_temp)
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')

Часть декодера:

latent_inputs = Input(shape=(lag,60), name='z_sampling')
x_2 = LSTM(60, activation='relu',return_sequences= True)(latent_inputs)
x_2 = LSTM(data.shape[1], activation='relu',return_sequences= True)(x_2)
decoder = Model(latent_inputs, x_2, name='decoder')
outputs = decoder(encoder(inputs)[2])
vae = Model(inputs, outputs)

А часть потери и подгонки:

outputs = decoder(encoder(inputs)[2])
vae = Model(inputs, outputs)
reconstruction_loss = mse(inputs, outputs)
kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
kl_loss = K.mean(kl_loss)
kl_loss *= -0.1
vae_loss = reconstruction_loss + kl_loss
vae.add_loss(vae_loss) 
vae.compile(optimizer='adam')
vae.fit(train,epochs=100)

Это приведет к этой ошибке:

Epoch 1/100
632256/632276 [============================>.] - ETA: 0s - loss: 0.0372
ValueError: operands could not be broadcast together with shapes (32,20) (20,20) (32,20) 

Если есть ошибка формы, как работает модель дозы на предыдущем шаге.Это моя главная проблема, спасибо за ваш ответ

1 Ответ

0 голосов
/ 13 декабря 2018

Вы работаете с размером пакета 32 , но в самом конце ваш операнд получает тензор только с 20 элементами, потому что это количество остается после 632256 из 632276:

632276 - 632256 = 20

По сути, это сообщение об ошибке, и именно поэтому предыдущие шаги работали.

Самое простое решение:

использование fit () опция метода steps_per_epoch опция:

steps_per_epoch: Integer или None.
Общее количество шагов (пакетов сэмплов) до объявления одной эпохи законченной и начала следующей.При обучении с использованием входных тензоров, таких как тензоры данных TensorFlow, значение по умолчанию None равно числу выборок в вашем наборе данных, деленному на размер пакета, или 1, если это невозможно определить.

steps_per_epoch = np.ceil(total_samples / batch_size)

В этом случае вы отбрасываете последние 20 сэмплов.

...