如何展开Tensorflow变量

如何展开Tensorflow变量,tensorflow,Tensorflow,有没有办法使Tensorflow变量变大?比如说,我想在训练中向神经网络层添加神经元。我该怎么做呢?中的一个答案告诉我如何更改变量的形状,将其展开以适应另一行权重,但我不知道如何初始化这些新权重 我想另一种方法可能涉及组合变量,比如先在第二个变量中初始化权重,然后将其作为第一个变量的新行或新列添加,但我也找不到任何方法可以这样做。有多种方法可以实现这一点 1) 文章()中的第二个答案解释了如何使用validate\u shape=False调用“assign”来更改变量的形状。例如,你可以做如下

有没有办法使Tensorflow变量变大?比如说,我想在训练中向神经网络层添加神经元。我该怎么做呢?中的一个答案告诉我如何更改变量的形状,将其展开以适应另一行权重,但我不知道如何初始化这些新权重


我想另一种方法可能涉及组合变量,比如先在第二个变量中初始化权重,然后将其作为第一个变量的新行或新列添加,但我也找不到任何方法可以这样做。

有多种方法可以实现这一点

1) 文章()中的第二个答案解释了如何使用validate\u shape=False调用“assign”来更改变量的形状。例如,你可以做如下事情

# Assume var is [m, n] 
# Add the new 'data' of shape [1, n] with new values
new_neuron = tf.constant(...)  

# If concatenating to add a row, concat on the first dimension.
# If new_neuron was [m, 1], you would concat on the second dimension.
new_variable_data = tf.concat(0, [var, new_neuron])  # [m+1, n]

resize_var = tf.assign(var, new_variable_data, validate_shape=False)
然后,当您运行resize_var时,“var”指向的数据现在将具有更新的数据


2) 您还可以创建一个较大的初始变量,并随着培训的进行在变量的不同区域调用tf.slice,因为您可以动态更改slice的“begin”和“size”属性。

解决了这个问题。这是一个迂回的过程,但这是我能说的唯一一个真正起作用的过程。您需要首先解压缩变量,然后将新变量追加到末尾,然后将它们打包在一起

如果您沿着第一个维度展开,那么它相当短:只有7行实际代码

#第一个变量是5x3
v1=tf.Variable(tf.zeros([5,3],dtype=tf.float32),“1”)
#第二个变量是1x3
v2=tf.Variable(tf.zeros([1,3],dtype=tf.float32),“2”)
#将第一个变量解压到大小为3的张量列表中
#列表中应该有5个张量
更改形状=tf.拆包(v1)
#将第二个变量解压到一个大小为3的张量列表中
#这个列表中应该有一个张量
更改_形状_2=tf.解包(v2)
#对于第二个列表中的每个张量,将其附加到第一个列表中
对于范围内的i(len(改变形状2)):
更改形状。追加(更改形状\u 2[i])
#将张量列表重新打包为单个张量
#这个合成张量的形状应该是[6,3]
最终=tf.包装(改变形状)
如果你想沿着第二维度展开,它会变得更长一些

#第一个变量,5x3
v3=tf.Variable(tf.zeros([5,3],dtype=tf.float32))
#第二个变量,5x1
v4=tf.Variable(tf.zeros([5,1],dtype=tf.float32))
#将张量解包为大小分别为3和1的张量列表
#两个列表都包含5个张量
更改=tf.解包(v3)
change2=tf.解包(v4)
#对于第一个列表中的每个张量,将其解压缩到自己的列表中
#这应该是一个大小为1张量的2d数组,数组为5x3
changestep2=[]
对于范围内的i(len(change)):
变更步骤2.追加(tf.解包(变更[i]))
#对第二张量做同样的事情
#大小为1张量的2d数组,数组为5x1
change2step2=[]
对于范围内的i(len(change2)):
change2step2.append(tf.unpack(change2[i]))
#对于数组中的每个张量,将其附加到第一个列表中相应的数组中
对于范围内的j(len(change2step2[i]):
change2step2[i].追加(change2step2[i][j])
#将数组中的列表重新打包为张量
changestep2[i]=tf.pack(changestep2[i])
#将张量列表打包成一个张量
#这个合成张量的形状应该是[5,4]
final2=tf.pack(变更步骤2)

我不知道是否有更有效的方法,但就目前而言,这是可行的。如有必要,更改进一步的维度将需要更多的列表层。

只需使用tf.concat展开Tensorflow变量,就可以看到api文档 详细情况

    v1 = tf.Variable(tf.zeros([5,3]),dtype=tf.float32)
    v2 = tf.Variable(tf.zeros([1,3]),dtype=tf.float32)
    v3 = tf.concat(0,[v1, v2])

如果我添加了一个新的形状变量[m,1],最终的形状会是[m,n+1]吗?难道不只是创建一个三维的变量吗?这就是API所说的,我在运行pack时出错,说除非我将维度设置为相同的大小,否则维度不兼容,在这种情况下,它会添加一个大小为2的第三维度。啊,关于pack,你是对的。我想你可以做tf.concat(0,[…张量…])(或者在你想要创建形状的维度上进行连接)我编辑了答案以反映这一点。concat还要求维度大小相同。我目前正在研究一个答案,要求你先解包,然后再打包。我已经完成了一半,但另一半现在给了我错误。一旦它开始工作,我就把它挂起来。注意tf.concat()连接了张量。例如,您的示例1可以是:v1=tf.variable(…[5,3]…)v2=tf.variable(…[1,3]…)final=tf.concat(0,[v1,v2])您的第二个示例可以是:v1=tf.variable(…[5,3]…)v2=tf.variable(…[5,1]…)final=tf.concat(1,[v1,v2]),我认为这是vrv建议的。