我在TensorFrlow中实现了逻辑回归模型(lr
)。我使用这个模型来生成预测:
print s.run(preds, feed_dict = {x:X[:5]})
之后我尝试以下列方式更改模型参数:
lr.w = tf.assign(lr.w, np.random.uniform(size=(inp_dim, out_dim)))
lr.b = tf.assign(lr.b, np.random.uniform(size=(out_dim,)))
s.run([lr.w, lr.b])
之后我以相同的方式生成新的预测:
print s.run(preds, feed_dict = {x:X[:5]})
令人惊讶的是,我获得了与模型参数更改之前相同的值。所以,看起来我没有设法改变模型参数。
有谁知道我做错了什么?
ADDED
我可能需要提供有关我的"架构"的更多详细信息。这是我对逻辑回归的实现:
class logreg:
def __init__(self, inp_dim, out_dim, r = 1.0):
# initialize values of model parameters
w_val = np.random.uniform(-r, r, size = (inp_dim, out_dim))
b_val = np.random.uniform(-r, r, size = (out_dim,))
self.w = tf.Variable(w_val, tf.float64)
self.b = tf.Variable(b_val, tf.float64)
def get_model_graph(self, inp):
return tf.nn.softmax(tf.matmul(inp, self.w) + self.b)
我使用此类的实例来定义预测方法:
x = tf.placeholder(tf.float64, [None, inp_dim])
preds = lr.get_model_graph(x)
我尝试重新定义"通过更改lr.w
和lr.b
的值来预测函数,但它不起作用(如上所述)。
然而,我发现在重新定义预测函数后,模型参数的新值变得可见:
lr.w = tf.assign(lr.w, np.random.uniform(size=(inp_dim, out_dim)))
lr.b = tf.assign(lr.b, np.random.uniform(size=(out_dim,)))
s.run(lr.w)
s.run(lr.b)
preds = lr.get_model_graph(x)
为什么?不是" preds"的计算图表的情况。绑定ot lr.w
和lr.b
并重新定义" preds"我只需要更改w
和b
?
答案 0 :(得分:1)
所描述的问题行为是由于在定义预测的计算图之前完成了对模型参数的值的第一次赋值所致。
更详细地说,以下代码将“阻止”任何进一步重新分配的模型参数(因此无法更改模型参数):
# instantiate the model
lr = logreg_tf(inp_dim = 4, out_dim = 3)
# create the predict function
x = tf.placeholder(tf.float64, [None, inp_dim])
# specify values of the parameters
w = np.array([
[ 1.0, 2.0, 3.0],
[ 4.0, 5.0, 6.0],
[ 7.0, 8.0, 9.0],
[10.0, 11.0, 12.0]
])
b = np.array([13.0, 14.0, 15.0])
# set the values of the model parameters
lr.w = tf.assign(lr.w, w)
lr.b = tf.assign(lr.b, b)
# initialize all the global variables
s = tf.Session()
s.run([lr.w, lr.b])
preds = lr.get_model_graph(x)
相反,以下代码阻止了“阻止”:
# instantiate the model
lr = logreg_tf(inp_dim = 4, out_dim = 3)
# create the predict function
x = tf.placeholder(tf.float64, [None, inp_dim])
preds = lr.get_model_graph(x)
# specify values of the parameters
w = np.array([
[ 1.0, 2.0, 3.0],
[ 4.0, 5.0, 6.0],
[ 7.0, 8.0, 9.0],
[10.0, 11.0, 12.0]
])
b = np.array([13.0, 14.0, 15.0])
# set the values of the model parameters
lr.w = tf.assign(lr.w, w)
lr.b = tf.assign(lr.b, b)
# initialize all the global variables
s = tf.Session()
s.run([lr.w, lr.b])
代码的两个块之间的唯一区别是定义了“preds”的行的位置。
更详细地解释了所描述的行为here。
答案 1 :(得分:0)
在分配参数的新值时,您正在做一些奇怪的事情。
为什么不定义类的方法来重新分配它们:
def assign_parameters(self, param, new_val):
self.param = tf.Variable(w_val, tf.float64)
这样的事情导致我无法看到代码更新您的类在执行lr.get_model_graph(x)
时使用的变量