Notes
怀疑模型梯度爆炸,想打印模型 loss 对各权重的导数看看。如果如果fit来训练的话,可以用keras.callbacks.TensorBoard实现。
但此次使用train_on_batch来训练的,用K.gradients和K.function实现。
Codes
以一份 VAE 代码为例
# -*- coding: utf8 -*- import keras from keras.models import Model from keras.layers import Input, Lambda, Conv2D, MaxPooling2D, Flatten, Dense, Reshape from keras.losses import binary_crossentropy from keras.datasets import mnist, fashion_mnist import keras.backend as K from scipy.stats import norm import numpy as np import matplotlib.pyplot as plt BATCH = 128 N_CLASS = 10 EPOCH = 5 IN_DIM = 28 * 28 H_DIM = 128 Z_DIM = 2 (x_train, y_train), (x_test, y_test) = fashion_mnist.load_data() x_train = x_train.reshape(len(x_train), -1).astype('float32') / 255. x_test = x_test.reshape(len(x_test), -1).astype('float32') / 255. def sampleing(args): """reparameterize""" mu, logvar = args eps = K.random_normal([K.shape(mu)[0], Z_DIM], mean=0.0, stddev=1.0) return mu + eps * K.exp(logvar / 2.) # encode x_in = Input([IN_DIM]) h = Dense(H_DIM, activation='relu')(x_in) z_mu = Dense(Z_DIM)(h) # mean,不用激活 z_logvar = Dense(Z_DIM)(h) # log variance,不用激活 z = Lambda(sampleing, output_shape=[Z_DIM])([z_mu, z_logvar]) # 只能有一个参数 encoder = Model(x_in, [z_mu, z_logvar, z], name='encoder') # decode z_in = Input([Z_DIM]) h_hat = Dense(H_DIM, activation='relu')(z_in) x_hat = Dense(IN_DIM, activation='sigmoid')(h_hat) decoder = Model(z_in, x_hat, name='decoder') # VAE x_in = Input([IN_DIM]) x = x_in z_mu, z_logvar, z = encoder(x) x = decoder(z) out = x vae = Model(x_in, [out, out], name='vae') # loss_kl = 0.5 * K.sum(K.square(z_mu) + K.exp(z_logvar) - 1. - z_logvar, axis=1) # loss_recon = binary_crossentropy(K.reshape(vae_in, [-1, IN_DIM]), vae_out) * IN_DIM # loss_vae = K.mean(loss_kl + loss_recon) def loss_kl(y_true, y_pred): return 0.5 * K.sum(K.square(z_mu) + K.exp(z_logvar) - 1. - z_logvar, axis=1) # vae.add_loss(loss_vae) vae.compile(optimizer='rmsprop', loss=[loss_kl, 'binary_crossentropy'], loss_weights=[1, IN_DIM]) vae.summary() # 获取模型权重 variable w = vae.trainable_weights print(w) # 打印 KL 对权重的导数 # KL 要是 Tensor,不能是上面的函数 `loss_kl` grad = K.gradients(0.5 * K.sum(K.square(z_mu) + K.exp(z_logvar) - 1. - z_logvar, axis=1), w) print(grad) # 有些是 None 的 grad = grad[grad is not None] # 去掉 None,不然报错 # 打印梯度的函数 # K.function 的输入和输出必要是 list!就算只有一个 show_grad = K.function([vae.input], [grad]) # vae.fit(x_train, # y_train, # 不能传 y_train # batch_size=BATCH, # epochs=EPOCH, # verbose=1, # validation_data=(x_test, None)) ''' 以 train_on_batch 方式训练 ''' for epoch in range(EPOCH): for b in range(x_train.shape[0] // BATCH): idx = np.random.choice(x_train.shape[0], BATCH) x = x_train[idx] l = vae.train_on_batch([x], [x, x]) # 计算梯度 gd = show_grad([x]) # 打印梯度 print(gd) # show manifold PIXEL = 28 N_PICT = 30 grid_x = norm.ppf(np.linspace(0.05, 0.95, N_PICT)) grid_y = grid_x figure = np.zeros([N_PICT * PIXEL, N_PICT * PIXEL]) for i, xi in enumerate(grid_x): for j, yj in enumerate(grid_y): noise = np.array([[xi, yj]]) # 必须秩为 2,两层中括号 x_gen = decoder.predict(noise) # print('x_gen shape:', x_gen.shape) x_gen = x_gen[0].reshape([PIXEL, PIXEL]) figure[i * PIXEL: (i+1) * PIXEL, j * PIXEL: (j+1) * PIXEL] = x_gen fig = plt.figure(figsize=(10, 10)) plt.imshow(figure, cmap='Greys_r') fig.savefig('./variational_autoencoder.png') plt.show()
补充知识:keras 自定义损失 自动求导时出现None
问题记录,keras 自定义损失 自动求导时出现None,后来想到是因为传入的变量没有使用,所以keras无法求出偏导,修改后问题解决。就是不愿使用的变量×0,求导后还是0就可以了。
def my_complex_loss_graph(y_label, emb_uid, lstm_out,y_true_1,y_true_2,y_true_3,out_1,out_2,out_3): mse_out_1 = mean_squared_error(y_true_1, out_1) mse_out_2 = mean_squared_error(y_true_2, out_2) mse_out_3 = mean_squared_error(y_true_3, out_3) # emb_uid= K.reshape(emb_uid, [-1, 32]) cosine_sim = tf.reduce_sum(0.5*tf.square(emb_uid-lstm_out)) cost=0*cosine_sim+K.sum([0.5*mse_out_1 , 0.25*mse_out_2,0.25*mse_out_3],axis=1,keepdims=True) # print(mse_out_1) final_loss = cost return K.mean(final_loss)
以上这篇keras打印loss对权重的导数方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]