Керас показывает ошибку формы в конце первой эпохи

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

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

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) 

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


person Jacky Tsai    schedule 13.12.2018    source источник
comment
Не могли бы вы предоставить воспроизводимый код? Как вы определяете sampling?   -  person rvinas    schedule 13.12.2018
comment
Это полное сообщение об ошибке? Я не вижу Op и Tensor.   -  person Geeocode    schedule 13.12.2018


Ответы (1)


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

632276 - 632256 = 20

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

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

используйте параметр steps_per_epoch метода fit ():

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

steps_per_epoch = total_samples // batch_size

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

person Geeocode    schedule 13.12.2018
comment
О, это работает. Кидаю последние 20 образцов вручную. Но я не могу понять, почему это произошло. На мой взгляд, функция fit () сама обнаружит batch_size. Почему на этот раз остался остаток. Тем не менее, спасибо. - person Jacky Tsai; 14.12.2018
comment
@JackyTsai На самом деле fit() обнаруживает batchsize, но не проверяет его, например. keras make_batches создает пакеты, такие как размер пакета = 32, количество образцов = 74: [(0, 32), (32, 64), (64, 74)]. - person Geeocode; 14.12.2018
comment
Ваш код не будет работать. np.ceil(33/32) получает 2.0. Он не сбрасывает ни 1, ни int. Пробовал total_samples//batch_size, что правильно. На этот раз он терпит неудачу в начале 2-й эпохи. 34240/34247 [==== ›.] Xxxx Epoch 2/15 71/34247 [....] ValueError: операнды не могут транслироваться вместе с формами (7,) (64,) (7,) - person Meow Cat 2012; 17.10.2020
comment
@ MeowCat2012 Я действительно не знаю, почему я использовал ceil, поскольку на практике я всегда использую //. Так что спасибо за улов. Что касается ошибки значения, это связано с другой проблемой. - person Geeocode; 17.10.2020