Python 建立LSTM VAE模型时存在不兼容问题
我尝试用Python 建立LSTM VAE模型时存在不兼容问题,python,keras,lstm,autoencoder,Python,Keras,Lstm,Autoencoder,我尝试用keras构建VAELSTM模型。输入形状为(样本编号,20,31) 然而,有一些不相容的问题正在发生 我不确定我的代码的哪一部分是错误的,请原谅我发布了所有代码 我的进口: from keras.models import Sequential, Model from keras.objectives import mse from keras.layers import Dense, Dropout, Activation, Flatten, LSTM, TimeDistribute
keras
构建VAE
LSTM
模型。输入形状为(样本编号,20,31)
然而,有一些不相容的问题正在发生
我不确定我的代码的哪一部分是错误的,请原谅我发布了所有代码
我的进口:
from keras.models import Sequential, Model
from keras.objectives import mse
from keras.layers import Dense, Dropout, Activation, Flatten, LSTM, TimeDistributed, RepeatVector, Input, Lambda
from keras.layers.normalization import BatchNormalization
首先,我创建了一个正态分布采样函数
def sampling(args):
z_mean, z_log_var = args
batch = K.shape(z_mean)[0]
dim = K.int_shape(z_mean)[1]
epsilon = K.random_normal(shape=(batch,dim))
return z_mean + K.exp(0.5 * z_log_var) * epsilon
然后构建编码器和解码器
"======Encoer====="
inputs = Input(shape=(20,31,), 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 = Lambda(sampling, output_shape=(60,), name='z')([z_mean, z_log_var])
z = RepeatVector(20)(z)
encoder = Model(inputs, [z_mean, z_log_var, z], name='encoder')
"=====Decoder======="
latent_inputs = Input(shape=(20,60), name='z_sampling')
x_2 = LSTM(60, activation='relu',return_sequences= True)(latent_inputs)
x_2 = LSTM(31, activation='relu')(x_2)
decoder = Model(latent_inputs, x_2, name='decoder')
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.sum(kl_loss, axis=-1)
kl_loss *= -0.5
vae_loss = K.mean(reconstruction_loss + kl_loss)
vae.add_loss(vae_loss)
vae.compile(optimizer='adam')
vae.fit(train,validation_data=(val,None),epochs=100)
它将得到这个错误,但我找不到任何地方的形状
[32,31]
或[32,20,31]
:
InvalidArgumentError Traceback (most recent call last)
~\Anaconda3\lib\site-packages\tensorflow\python\client\session.py in _do_call(self, fn, *args)
1326 try:
-> 1327 return fn(*args)
1328 except errors.OpError as e:
~\Anaconda3\lib\site-packages\tensorflow\python\client\session.py in _run_fn(session, feed_dict, fetch_list, target_list, options, run_metadata)
1305 feed_dict, fetch_list, target_list,
-> 1306 status, run_metadata)
1307
~\Anaconda3\lib\contextlib.py in __exit__(self, type, value, traceback)
87 try:
---> 88 next(self.gen)
89 except StopIteration:
~\Anaconda3\lib\site-packages\tensorflow\python\framework\errors_impl.py in raise_exception_on_not_ok_status()
465 compat.as_text(pywrap_tensorflow.TF_Message(status)),
--> 466 pywrap_tensorflow.TF_GetCode(status))
467 finally:
InvalidArgumentError: Incompatible shapes: [32,20] vs. [32]
感谢您的回答。编码器的输入形状是
(32,20,31)
这里32
是默认的batch\u size
,解码器的输出是(32,31)
,而mse
函数正在抱怨这两种形状
应通过更换以下部件来解决问题:
x_2=LSTM(31,activation='relu')(x_2)
by
x_2=LSTM(31,activation='relu',return_sequences=True)(x_2)
另外,您还可以尝试运行encoder.summary()
和decoder.summary()
来获得每一层的形状
编辑:
kl\u loss=K.sum(kl\u loss,axis=-1)
tokl\u loss=K.sum(kl\u loss)
它很可能在缺少的返回序列=True
中。谢谢你的回答。但是,当我添加return\u序列时,错误问题变成了不兼容的形状:[32,20]vs[32]。谢谢您的回答。我尝试添加return_序列,但出现了另一个错误,不兼容的形状:[32,20]vs[32]。当Model.summary()时,我找不到任何形状为[32,20]或[32]。这是我的主要问题。您能提供完整的错误堆栈跟踪吗?问题似乎是在重建\u损失
和kl\u损失
之外。我将kl\u loss=K.sum(kl\u loss,axis=-1)
更改为kl\u loss=K.sum(kl\u loss)
,似乎运行在冗余的训练数据上。但是我不确定这个改变是否会影响你的损失功能。@whiteoil,这是有效的!!!由K.sum轴引起的问题。非常感谢你的回答。