这是我的第一篇CSDN博客:)
最近在写DDPG的时候发现action网络输出有问题,action网络输出层建立如下:
self.a_net = tf.layers.dense(self.net, self.a_dim,
activation=tf.nn.sigmoid,
name='a',
kernel_initializer=tf.truncated_normal_initializer(0,0.1),
bias_initializer=tf.constant_initializer(0.1),
trainable=trainable)
师兄建议把网络权重调出来看一下变化趋势,而我的action网络是用tf.layers.dense()构建的,所以查了一下如何保存tf.layers.dense()的网络的权重。
有如下两种方式:
在tf.layers.dense()中权重会被命名为 name + /kernel:0,其中 name 是你对 构建的layer 的命名
所以我的调用方法是:
weights = tf.get_default_graph().get_tensor_by_name(
os.path.split(self.a_net.name)[0] + '/kernel:0'))
其中,
os.path.split(self.a_net.name)[0]
是取得layer的命名路径,我的里面是'Actor_1/a'。加上'kernel:0'就表示权重的name
顺利的话,就取用成功了。
但是!有可能会出现以下报错
KeyError: "The name 'Actor_1/a/kernel:0' refers to a Tensor which does not exist. The operation, 'Actor_1/a/kernel', does not exist in the graph."
这是因为有可能weight存在了'Actor/a/kernel:0'里面,而自动获取的name是'Actor_1/'...
解决办法:1)手动更改name路径 2)如下
with tf.variable_scope('Actor',reuse=True):
self.a_weights = self.sess.run(tf.get_variable('a/kernel')
这种方法可行意味着权重在TF里面也是以variable的形式保存,可以通过tf.get_variable来取用。
PS:正好第二种方式可以直接保存成变量打印出来,我就用第二种方式matplotlib把权重的变化画出来了。
参考资料:
https://stackoverflow.com/questions/45372291/how-to-get-weights-in-tf-layers-dense
https://www.zhihu.com/question/274742206
希望能帮助到你