理解Tensorflow中的变量范围示例

理解Tensorflow中的变量范围示例,tensorflow,Tensorflow,我在看Tensorflow的力学部分,特别是关于。在“问题”一节中,他们正在处理卷积神经网络,并提供以下代码(通过模型运行图像): #第一次调用创建一组变量。 结果1=我的图像过滤器(图像1) #在第二次调用中创建另一个集合。 结果2=我的图像过滤器(图像2) 如果模型是以这种方式实现的,那么是否不可能学习/更新参数,因为我的训练集中每个图像都有一组新的参数 编辑: 我还尝试了简单线性回归的“问题”方法,这种实现方法似乎没有任何问题。培训似乎工作得很好,代码的最后一行也显示了这一点。所以我想知

我在看Tensorflow的力学部分,特别是关于。在“问题”一节中,他们正在处理卷积神经网络,并提供以下代码(通过模型运行图像):

#第一次调用创建一组变量。
结果1=我的图像过滤器(图像1)
#在第二次调用中创建另一个集合。
结果2=我的图像过滤器(图像2)
如果模型是以这种方式实现的,那么是否不可能学习/更新参数,因为我的训练集中每个图像都有一组新的参数

编辑: 我还尝试了简单线性回归的“问题”方法,这种实现方法似乎没有任何问题。培训似乎工作得很好,代码的最后一行也显示了这一点。所以我想知道tensorflow文档和我正在做的工作是否存在细微的差异:

将tensorflow导入为tf
将numpy作为np导入
trX=np.linspace(-1,1101)
trY=2*trX+np.random.randn(*trX.shape)*0.33#创建一个近似线性但带有一些随机噪声的y值
X=tf.placeholder(“float”)#创建符号变量
Y=tf.占位符(“浮动”)
def型号(X):
使用tf.variable_scope(“param”):
w=tf.Variable(0.0,name=“weights”)#为权重矩阵创建一个共享变量(如theano.shared)
return tf.mul(X,w)#lr只是X*w,所以这个模型线非常简单
y_模型=模型(X)
成本=(tf.pow(Y-Y_模型,2))#成本函数使用sqr误差
train_op=tf.train.GradientDescentOptimizer(0.01).最小化(成本)#构造一个优化程序,以最小化成本并使线路适合我的数据
sess=tf.Session()
init=tf.initialize_all_variables()#您需要初始化变量(在本例中,只需初始化变量W)
sess.run(初始化)
带tf.可变_范围(“列车”):
对于范围(100)内的i:
对于拉链中的(x,y)(trX,trY):
sess.run(train_op,feed_dict={X:X,Y:Y})
print sess.run(y_模型,feed_dict={X:np.array([1,2,3]))

每个完整的培训(和测试)集只需创建一次变量集。可变范围的目标是允许参数子集的模块化,例如属于层的参数子集(例如,当层的架构重复时,可以在每个层范围内使用相同的名称)

在您的示例中,仅在
模型
函数中创建参数。您可以打印出变量名称,以查看是否已将其分配给指定的范围:

from\uuuuu future\uuuuu导入打印功能
X=tf.placeholder(“float”)#创建符号变量
Y=tf.占位符(“浮动”)
打印(“X:,X.name)
打印(“Y:,Y.名称)
def型号(X):
使用tf.variable_scope(“param”):
w=tf.Variable(0.0,name=“weights”)#为权重矩阵创建一个共享变量(如theano.shared)
打印(“w:,w.名称)
返回tf.mul(X,w)
调用
sess.run(train_op,feed_dict={X:X,Y:Y})
仅在给定
X
Y
的值的情况下计算
train_op
的值。没有创建新的变量(包括参数);因此,它没有效果。通过再次打印变量名,可以确保变量名保持不变:

带tf.变量范围(“列车”):
打印(“X:,X.name)
打印(“Y:,Y.名称)
对于范围(100)内的i:
对于拉链中的(x,y)(trX,trY):
sess.run(train_op,feed_dict={X:X,Y:Y})
您将看到变量名保持不变,因为它们已经初始化

如果要使用变量的作用域检索变量,则需要在
tf.variable\u scope
附件中使用
get\u variable

带有tf.variable_scope(“param”):
w=tf.get_变量(“权重”[1])
打印(“w:,w.名称)

因此tf.get_变量实际上是“创建”变量,而不是简单地“检索”变量,是吗?参考此--->您对变量范围有了清晰的认识