Tensorflow Keras LSTM-VAE(变分自动编码器)用于时间序列anamoly检测

Tensorflow Keras LSTM-VAE(变分自动编码器)用于时间序列anamoly检测,tensorflow,keras,time-series,lstm,autoencoder,Tensorflow,Keras,Time Series,Lstm,Autoencoder,我正在尝试使用Keras为时间序列重建的LSTM-VAE建模 我已经参考并创建了LSTM-VAE体系结构 我在训练网络时遇到问题,在急切执行模式下训练时出现以下错误: InvalidArgumentError:不兼容的形状:[8,1]与[32,1][Op:Mul] 输入形状为(7752,30,1)此处为30个时间步和1个特征 型号编码器: 编码器 潜在_dim=1 内部尺寸=32 #示例、时间步、功能 input_x=keras.layers.input(shape=(x_train.shap

我正在尝试使用Keras为时间序列重建的LSTM-VAE建模

我已经参考并创建了LSTM-VAE体系结构

我在训练网络时遇到问题,在急切执行模式下训练时出现以下错误:

InvalidArgumentError:不兼容的形状:[8,1]与[32,1][Op:Mul]
输入形状为
(7752,30,1)
此处为30个时间步和1个特征

型号编码器:

编码器 潜在_dim=1 内部尺寸=32 #示例、时间步、功能 input_x=keras.layers.input(shape=(x_train.shape[1],x_train.shape[2])) #中间尺寸 h=keras.layers.LSTM(内部尺寸)(输入x) #z_层 z_平均值=keras.层密(潜在尺寸)(h) z_log_sigma=keras.层密(潜在尺寸)(h) z=λ(抽样)([z_平均值,z_对数_σ]) 型号解码器:

重建解码器 decoder1=重复向量(X_列形状[1])(z) decoder1=keras.layers.LSTM(100,activation='relu',return_sequences=True)(decoder1) decoder1=keras.layers.TimeDistributed(密集(1))(decoder1) 采样功能:

batch\u size=32
def采样(args):
z_平均值,z_log_sigma=args
ε=K.随机性正常(形状=(批次大小,潜在尺寸),平均值=0,标准差=1。)
返回z_平均值+z_log_sigma*epsilon
VAE损失函数:

def vae_loss2(输入x,解码1):
“”“计算损失=重建损失+小批量中每个数据的KL损失”“”
#E[对数P(X | z)]
侦察=K.sum(K.binary\u交叉熵(输入x,解码器1),轴=1)
#D|KL(Q(z | X)| P(z | X));以闭合形式计算,因为两个距离均为高斯分布
kl=0.5*K.sum(K.exp(z_log_sigma)+K.square(z_均值)-1.-z_log_sigma,轴=1)
返回侦察+kl


有什么建议可以让模型工作吗?

您需要推断采样函数中的批次,并且需要注意您的损失。。。损失函数使用前一层的输出,因此需要注意这一点。我使用
模型来实现这一点。添加损失(…)

编码器 潜在_dim=1 内部尺寸=32 时间步长,特征=100,1 def采样(args): z_平均值,z_log_sigma=args
批次大小=tf.shape(z_平均值)[0]#谢谢@Marco Cerliani!,它在TF版本2.3中工作!时间序列的VAE LSTM:
# encoder
latent_dim = 1
inter_dim = 32
timesteps, features = 100, 1

def sampling(args):
    z_mean, z_log_sigma = args
    batch_size = tf.shape(z_mean)[0] # <================
    epsilon = K.random_normal(shape=(batch_size, latent_dim), mean=0., stddev=1.)
    return z_mean + z_log_sigma * epsilon

# timesteps, features
input_x = Input(shape= (timesteps, features)) 

#intermediate dimension 
h = LSTM(inter_dim, activation='relu')(input_x)

#z_layer
z_mean = Dense(latent_dim)(h)
z_log_sigma = Dense(latent_dim)(h)
z = Lambda(sampling)([z_mean, z_log_sigma])

# Reconstruction decoder
decoder1 = RepeatVector(timesteps)(z)
decoder1 = LSTM(inter_dim, activation='relu', return_sequences=True)(decoder1)
decoder1 = TimeDistributed(Dense(features))(decoder1)

def vae_loss2(input_x, decoder1, z_log_sigma, z_mean):
    """ Calculate loss = reconstruction loss + KL loss for each data in minibatch """
    # E[log P(X|z)]
    recon = K.sum(K.binary_crossentropy(input_x, decoder1))
    # D_KL(Q(z|X) || P(z|X)); calculate in closed form as both dist. are Gaussian
    kl = 0.5 * K.sum(K.exp(z_log_sigma) + K.square(z_mean) - 1. - z_log_sigma)

    return recon + kl

m = Model(input_x, decoder1)
m.add_loss(vae_loss2(input_x, decoder1, z_log_sigma, z_mean)) #<===========
m.compile(loss=None, optimizer='adam')