保存tf.layers.dense()网络的权重weights及失败原因

这是我的第一篇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()的网络的权重。

有如下两种方式:


1.保存成张量Tensor

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)如下

2.保存成变量Variable


        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



希望能帮助到你


你可能感兴趣的:(Tensorflow用法)