首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变分自动编码器-警告:tensorflow:当损失最小化时变量[]不存在渐变

变分自动编码器-警告:tensorflow:当损失最小化时变量[]不存在渐变
EN

Stack Overflow用户
提问于 2021-02-02 23:33:20
回答 1查看 1.4K关注 0票数 0

我正在尝试实现一个变分自动编码器,使用官方角光角页的最后一部分,输入它是mnist数据集的规范化和扁平:

代码语言:javascript
复制
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))

模式:

代码语言:javascript
复制
original_dim = 28 * 28
intermediate_dim = 64
latent_dim = 2

inputs = keras.Input(shape=(original_dim,))
h = layers.Dense(intermediate_dim, activation='relu')(inputs)
z_mean = layers.Dense(latent_dim)(h)
z_log_sigma = layers.Dense(latent_dim)(h)

from keras import backend as K

def sampling(args):
    z_mean, z_log_sigma = args
    epsilon = K.random_normal(shape=(K.shape(z_mean)[0], latent_dim),
                              mean=0., stddev=0.1)
    return z_mean + K.exp(z_log_sigma) * epsilon

z = layers.Lambda(sampling)([z_mean, z_log_sigma])

# Create encoder
encoder = keras.Model(inputs, [z_mean, z_log_sigma, z], name='encoder')

# Create decoder
latent_inputs = keras.Input(shape=(latent_dim,), name='z_sampling')
x = layers.Dense(intermediate_dim, activation='relu')(latent_inputs)
outputs = layers.Dense(original_dim, activation='sigmoid')(x)
decoder = keras.Model(latent_inputs, outputs, name='decoder')

# instantiate VAE model
outputs = decoder(encoder(inputs)[2])
vae = keras.Model(inputs, outputs, name='vae_mlp')


reconstruction_loss = keras.losses.binary_crossentropy(inputs, outputs)
reconstruction_loss *= original_dim
kl_loss = 1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma)
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(x_train, x_train,
        epochs=100,
        batch_size=32,
        validation_data=(x_test, x_test))

但是当我训练模型的时候,我在第一个时代得到了这个警告4次,然后火车显然没有问题地继续前进。

代码语言:javascript
复制
Epoch 1/100
WARNING:tensorflow:Gradients do not exist for variables ['dense_4/kernel:0', 'dense_4/bias:0'] when minimizing the loss.
WARNING:tensorflow:Gradients do not exist for variables ['dense_4/kernel:0', 'dense_4/bias:0'] when minimizing the loss.
WARNING:tensorflow:Gradients do not exist for variables ['dense_4/kernel:0', 'dense_4/bias:0'] when minimizing the loss.
WARNING:tensorflow:Gradients do not exist for variables ['dense_4/kernel:0', 'dense_4/bias:0'] when minimizing the loss.
2021-02-03 00:03:40.37: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10
1875/1875 [==============================] - 2s 1ms/step - loss: 536.7903 - val_loss: 534.6534
Epoch 2/100
1875/1875 [==============================] - 2s 1ms/step - loss: 533.1923 - val_loss: 532.5651
Epoch 3/100
....

我的问题是为什么有这些警告,这是一个问题,我如何解决它?因为我认为这个模型需要改进这些梯度。

我试图在colab上复制这些警告,但是这些警告没有出现,我不知道是否因为它们自动隐藏在设置中(可能是cause_error = False)。

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2021-02-06 20:21:32

不识别译码器层(dense_layer_4等)的梯度的事实表明,问题在于重建损失。换句话说,它是从KL丢失中识别编码器的梯度,这就是它运行的原因。我想说的是,使用vae来获得输出,例如:

代码语言:javascript
复制
vae = keras.Model(inputs, [coding_means, codings_log_var, outputs], name='vae_mlp')
coding_means, codings_log_var, outputs = vae(x_train)

从这个例子来看,我也很奇怪,再加上这样的重建损失。我会试着用

代码语言:javascript
复制
vae_loss = K.mean(reconstruction_loss + kl_loss)
vae.add_loss(vae_loss)
vae.compile(optimizer='adam')

代码语言:javascript
复制
vae.add_loss(K.mean(kl_loss))
vae.compile(loss="binary_crossentropy", optimizer="adam")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66019116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档