Python Keras变分自动编码器停止工作,尽管有干净的模型摘要?
我已经使用下面的可变自动编码器有一段时间了,但在最近的环境重置后,它刚刚停止工作。我已经搜索了tensorflow的文档和最近的更改日志(但我似乎找不到一个月前发布的良好历史记录),但在这些函数的基本定义中没有发现任何更改。此外,我得到的是非常枯燥的错误代码,这不是很有描述性或帮助Python Keras变分自动编码器停止工作,尽管有干净的模型摘要?,python,pandas,tensorflow,machine-learning,keras,Python,Pandas,Tensorflow,Machine Learning,Keras,我已经使用下面的可变自动编码器有一段时间了,但在最近的环境重置后,它刚刚停止工作。我已经搜索了tensorflow的文档和最近的更改日志(但我似乎找不到一个月前发布的良好历史记录),但在这些函数的基本定义中没有发现任何更改。此外,我得到的是非常枯燥的错误代码,这不是很有描述性或帮助 AssertionError: in user code: AssertionError: Could not compute output Tensor("sequential/dense_1/Sigm
AssertionError: in user code:
AssertionError: Could not compute output Tensor("sequential/dense_1/Sigmoid:0", shape=(None, 110), dtype=float32)
错误似乎只是指向最后一行,因为它实际上无法更具描述性。然而,当查看模型摘要时,模型似乎识别了所有层和相关的构建
vae.summary()
Model: "functional_1"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 110)] 0
__________________________________________________________________________________________________
dense_2 (Dense) (None, 64) 7104 input_1[0][0]
__________________________________________________________________________________________________
dense_3 (Dense) (None, 2) 130 dense_2[0][0]
__________________________________________________________________________________________________
dense_4 (Dense) (None, 2) 130 dense_2[0][0]
__________________________________________________________________________________________________
kl_divergence_layer (KLDivergen [(None, 2), (None, 2 0 dense_3[0][0]
dense_4[0][0]
__________________________________________________________________________________________________
lambda (Lambda) (None, 2) 0 kl_divergence_layer[0][1]
__________________________________________________________________________________________________
input_2 (InputLayer) [(None, 2)] 0
__________________________________________________________________________________________________
multiply (Multiply) (None, 2) 0 lambda[0][0]
input_2[0][0]
__________________________________________________________________________________________________
add (Add) (None, 2) 0 kl_divergence_layer[0][0]
multiply[0][0]
__________________________________________________________________________________________________
sequential (Sequential) (None, 110) 7342 add[0][0]
==================================================================================================
Total params: 14,706
Trainable params: 14,706
Non-trainable params: 0
__________________________________________________________________________________________________
结果,我不知道出了什么问题。有什么想法吗?下面是Vae的样本数据
import pandas as pd
from sklearn.datasets import make_blobs
from sklearn.preprocessing import MinMaxScaler
import keras.backend as K
import tensorflow as tf
from keras.layers import Input, Dense, Lambda, Layer, Add, Multiply
from keras.models import Model, Sequential
from keras.callbacks import EarlyStopping, LearningRateScheduler
from keras.objectives import binary_crossentropy
x, labels = make_blobs(n_samples=150000, n_features=110, centers=16, cluster_std=4.0)
scaler = MinMaxScaler()
x = scaler.fit_transform(x)
x = pd.DataFrame(x)
train = x.sample(frac = 0.8)
train_indexs = train.index.values
test = x[~x.index.isin(train_indexs)]
print(train.shape, test.shape)
def nll(y_true, y_pred):
""" Negative log likelihood (Bernoulli). """
return K.sum(K.binary_crossentropy(y_true, y_pred), axis = -1)
class KLDivergenceLayer(Layer):
""" Identity transform layer that adds KL divergence
to the final model loss.
"""
def __init__(self, *args, **kwargs):
self.is_placeholder = True
super(KLDivergenceLayer, self).__init__(*args, **kwargs)
def call(self, inputs):
mu, log_var = inputs
#changing form sum to mean
kl_batch = - .5 * K.sum(1 + log_var -
K.square(mu) -
K.exp(log_var), axis=-1)
self.add_loss(K.mean(kl_batch), inputs=inputs)
return inputs
#################### VAE ##############
latent_dim = 2
decoder = Sequential([
Dense(64, input_dim=latent_dim, activation='relu'),
Dense(x.shape[1], activation='sigmoid')
])
data = Input(shape=(x.shape[1],))
h = Dense(64, activation='relu')(data)
z_mu = Dense(latent_dim)(h)
z_log_var = Dense(latent_dim)(h)
#applies KLDivergence here?
z_mu, z_log_var = KLDivergenceLayer()([z_mu, z_log_var])
#generates random samples
z_sigma = Lambda(lambda t: K.exp(.5*t))(z_log_var)
eps = Input(tensor=K.random_normal(stddev=1.0,
shape=(K.shape(data)[0], latent_dim)))
z_eps = Multiply()([z_sigma, eps])
z = Add()([z_mu, z_eps])
#apply decoder
x_pred = decoder(z)
# defines final model
vae = Model(inputs=[data, eps], outputs=x_pred)
vae.compile(optimizer='rmsprop', loss=nll)
#runs model
vae.fit(train, train, shuffle = True, epochs = 1000,
batch_size = 512, validation_data = (test, test),
callbacks = [EarlyStopping(patience=50)])
问题在于你的eps层。这不是一个模型输入 您可以将其替换为以下简单图层:
eps = Lambda(lambda t: K.random_normal(stddev=1.0, shape=(K.shape(t)[0], latent_dim)))(z_log_var)
你可以在这里找到跑步笔记本: