如何在TensorFlow中更改模型参数?

如何在TensorFlow中更改模型参数?,tensorflow,Tensorflow,我在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])

我在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]})
令人惊讶的是,我得到的值与更改模型参数之前相同。因此,看起来我没有设法更改模型参数

有人知道我做错了什么吗

已添加

我可能需要提供更多关于我的“架构”的细节。这是我对逻辑回归的实现:

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”的计算图不是被限制在
lr.w
lr.b
的范围内吗?要重新定义“preds”,我只需要更改
w
b
的值。

在分配参数的新值时,你做了一些奇怪的事情

为什么不定义类的方法来重新分配它们:

def assign_parameters(self, param, new_val):
    self.param = tf.Variable(w_val, tf.float64)

类似这样的原因是,当您执行
lr.get\u model\u graph(x)时,我看不到更新您的类使用的变量的代码

所描述的问题行为是由于在定义预测的计算图之前,对模型参数进行了第一次赋值

更详细地说,以下代码将“阻止”模型参数的任何进一步重新分配(因此不可能更改模型参数):

相反,以下代码可防止“阻塞”:

两个代码块之间的唯一区别是定义“preds”的行的位置


对所描述的行为进行了更详细的解释。

我尝试更新我的类在这里使用的变量:
lr.w=tf.assign(lr.w,np.random.uniform(size=(inp\u dim,out\u dim)))lr.b=tf.assign(lr.b,np.random.uniform(size=(out\u dim,))
而不是
lr.w=tf.assign.assign(lr.w,w,w\u val)
我试图使用
lr.w=tf.Variable(w_val,tf.float64)
。结果,我收到一条错误消息:“正在尝试使用未初始化的值”。
# 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])