如何从tensorflowfully_connected获取权重 [英] How to get weights from tensorflow fully_connected
问题描述
我试图在训练后从模型中提取权重.这是一个玩具示例
I'm trying to extract the weights from a model after training it. Here's a toy example
import tensorflow as tf
import numpy as np
X_ = tf.placeholder(tf.float64, [None, 5], name="Input")
Y_ = tf.placeholder(tf.float64, [None, 1], name="Output")
X = ...
Y = ...
with tf.name_scope("LogReg"):
pred = fully_connected(X_, 1, activation_fn=tf.nn.sigmoid)
loss = tf.losses.mean_squared_error(labels=Y_, predictions=pred)
training_ops = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(200):
sess.run(training_ops, feed_dict={
X_: X,
Y_: Y
})
if (i + 1) % 100 == 0:
print("Accuracy: ", sess.run(accuracy, feed_dict={
X_: X,
Y_: Y
}))
# Get weights of *pred* here
我看过从张量流模型中获取权重 和 docs 但找不到方法检索权重的值.
I've looked at Get weights from tensorflow model and at the docs but can't find a way to retrieve the value of the weights.
所以在玩具示例的情况下,假设 X_ 的形状为 (1000, 5),如何在
So in the toy example case, suppose that X_ has shape (1000, 5), how can I get the 5 values in the 1-layer weights after
推荐答案
您的代码中有一些问题需要修复:
There are some issues in your code that needs to be fixed:
1- 您需要在下一行使用 variable_scope
而不是 name_scope
(请参阅 TensorFlow 文档以了解它们之间的区别):
1- You need to use variable_scope
instead of name_scope
at the following line (please refer to the TensorFlow documentation for difference between them):
with tf.name_scope("LogReg"):
2- 为了能够稍后在代码中检索变量,您需要知道它的名称.因此,您需要为感兴趣的变量分配一个名称(如果您不支持,则会分配一个默认名称,但您需要弄清楚它是什么!):
2- To be able to retrieve a variable later in code, you need to know it's name. So, you need to assign a name to the variable of interest (if you don't support one, there will be a default one assigned, but then you need to figure out what it is!):
pred = tf.contrib.layers.fully_connected(X_, 1, activation_fn=tf.nn.sigmoid, scope = 'fc1')
现在让我们看看上述修复如何帮助我们获取变量的值.每层都有两种类型的变量:权重和偏差.在以下代码片段(您的修改版本)中,我将仅展示如何检索全连接层的权重:
Now let's see how the above fixes can help us to get a variable's value. Each layer has two types of variables: weights and biases. In the following code snippet (a modified version of yours) I will only show how to retrieve the weights for the fully connected layer:
X_ = tf.placeholder(tf.float64, [None, 5], name="Input")
Y_ = tf.placeholder(tf.float64, [None, 1], name="Output")
X = np.random.randint(1,10,[10,5])
Y = np.random.randint(0,2,[10,1])
with tf.variable_scope("LogReg"):
pred = tf.fully_connected(X_, 1, activation_fn=tf.nn.sigmoid, scope = 'fc1')
loss = tf.losses.mean_squared_error(labels=Y_, predictions=pred)
training_ops = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
with tf.Session() as sess:
all_vars= tf.global_variables()
def get_var(name):
for i in range(len(all_vars)):
if all_vars[i].name.startswith(name):
return all_vars[i]
return None
fc1_var = get_var('LogReg/fc1/weights')
sess.run(tf.global_variables_initializer())
for i in range(200):
_,fc1_var_np = sess.run([training_ops,fc1_var], feed_dict={
X_: X,
Y_: Y
})
print fc1_var_np
这篇关于如何从tensorflowfully_connected获取权重的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!