我正在运行一维卷积 VAE。输入数据有 200 个训练样本,有 100 个时间步长和 1 个维度。我将批量大小设置为 50。代码附在下面。我得到的错误是:
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [200,2] vs. [50,2]
[[{{node training/Adam/gradients/gradients/lambda/mul_grad/BroadcastGradientArgs}}]]
我相信这个错误与定义 vae_loss 函数有关。有人可以给我一些关于如何解决它的建议吗?顺便说一句,当我将输入更改为 50 个训练样本(而不是 200 个)时,我没有遇到此错误。
import numpy as np
import tensorflow as tf
import keras
import keras.backend as K
from keras.models import Model
from keras.layers import Conv1D
from keras.objectives import binary_crossentropy
from keras.callbacks import LearningRateScheduler
from tensorflow.python.framework.ops import disable_eager_execution
disable_eager_execution()
# execfile('main.py')
m=50
n_z = 2 #Num_latent dimensions
n_epoch = 3
input_shape = (200, 100, 1)
x = np.random.normal(size=input_shape)
inputs = keras.layers.Input(shape=(100, 1)) #input shape not including batch axis
down_1 = tf.keras.layers.Conv1D(filters=4, kernel_size=8, activation='relu')(inputs) # ut_shape = (None, 93, 4)
down_2 = tf.keras.layers.Conv1D(filters=1, kernel_size=16, activation='relu')(down_1) # output_shape = (None, 78, 1)
flat = tf.keras.layers.Flatten()(down_2),
h_q = tf.keras.layers.Dense(512, activation='relu')(flat[0])
mu = tf.keras.layers.Dense(n_z, activation='linear')(h_q)
log_sigma = tf.keras.layers.Dense(n_z, activation='linear')(h_q)
def sample_z(args):
mu, log_sigma = args
eps = K.random_normal(shape=(m, n_z), mean = 0., stddev = 1.)
return mu + K.exp(log_sigma/2)*eps
z = keras.layers.Lambda(sample_z)([mu, log_sigma])
h_p = tf.keras.layers.Dense(units=78 * 1, activation=tf.nn.relu)(z)
reshape = tf.keras.layers.Reshape(target_shape=(78, 1))(h_p)
up_1 = tf.keras.layers.Conv1DTranspose(filters=1, kernel_size=16, activation='relu')(reshape)
# output_shape = (None, 3, 4)
up_2 = tf.keras.layers.Conv1DTranspose(filters=4, kernel_size=8, activation='relu')(up_1)
outputs = tf.keras.layers.Conv1DTranspose(filters=1, kernel_size=8)(up_1)
def vae_loss(y_true, y_pred):
global recon, kl
""" Calculate loss = reconstruction loss + KL loss for each data in minibatch """
# E[log P(X|z)]
recon = K.sum(K.binary_crossentropy(y_pred, y_true), axis=1)
# D_KL(Q(z|X) || P(z|X)); calculate in closed form as both dist. are Gaussian
kl = 0.5 * K.sum(K.exp(log_sigma) + K.square(mu) - 1. - log_sigma, axis=1)
return kl + recon
vae = Model(inputs, outputs)
vae.compile(optimizer='adam', loss=vae_loss)
vae.fit(x, x, batch_size=m, epochs=n_epoch, steps_per_epoch=input_shape[0]//m)