如何在TensorFlow中更改模型参数?
我在TensorFrlow中实现了一个逻辑回归模型(如何在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])
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])