Matrix 如何更改TensorFlow中变量的形状?

Matrix 如何更改TensorFlow中变量的形状?,matrix,reshape,tensorflow,Matrix,Reshape,Tensorflow,表示在创建时,我们需要指定张量的形状。该形状自动成为张量的形状。它还说TensorFlow提供了重塑变量的高级机制。我该怎么做?有代码示例吗?请查看TensorFlow文档。它描述了可用的不同形状变换 最常见的函数可能是,它类似于它的numpy等价函数。它允许您指定所需的任何形状,只要元素数保持不变。文档中提供了一些示例。重塑方法。它们是: 重塑 挤压(从张量形状中删除大小为1的尺寸) 展开尺寸标注(添加尺寸为1的尺寸标注) 以及获取张量的形状,大小,等级的一系列方法。可能最常用的是重塑,下

表示在创建时,我们需要指定张量的形状。该形状自动成为张量的形状。它还说TensorFlow提供了重塑变量的高级机制。我该怎么做?有代码示例吗?

请查看TensorFlow文档。它描述了可用的不同形状变换

最常见的函数可能是,它类似于它的numpy等价函数。它允许您指定所需的任何形状,只要元素数保持不变。文档中提供了一些示例。

重塑方法。它们是:

  • 重塑
  • 挤压(从张量形状中删除大小为1的尺寸)
  • 展开尺寸标注(添加尺寸为1的尺寸标注)
以及获取张量的
形状
大小
等级
的一系列方法。可能最常用的是
重塑
,下面是一个代码示例,其中包含两个边缘情况(-1):

类是创建变量的推荐方法,但它限制了您在创建变量后更改其形状的能力

如果需要更改变量的形状,可以执行以下操作(例如,对于32位浮点张量):

请注意,此功能不在有文档记录的公共API中,因此可能会发生更改。如果您确实发现自己需要使用此功能,请告诉我们,我们可以研究一种支持它向前发展的方法

tf.Variable(tf.placeholder(tf.float32))
在tensorflow 1.2.1中无效

在python shell中:

import tensorflow as tf
tf.Variable(tf.placeholder(tf.float32))
您将获得:

ValueError: initial_value must have a shape specified: Tensor("Placeholder:0", dtype=float32)
更新:如果添加
validate\u shape=False
,则不会出现错误

tf.Variable(tf.placeholder(tf.float32), validate_shape=False)
如果
tf.py_func
符合您的要求:

def init():
    return numpy.random.rand(2,3)
a = tf.pyfun(init, [], tf.float32)
通过传递自己的init函数,可以创建具有任何形状的变量

另一种方式:

var = tf.get_varible('my-name', initializer=init, shape=(1,1))

您可以传递
tf.constant
或任何返回numpy数组的
init
函数。将不会验证提供的形状。输出形状是真实的数据形状。

tf.Variable
:将
shape
参数与
None

1.14中的一个函数,允许指定未知形状

如果
shape
None
,则使用初始形状值

如果指定了
形状
,则该形状将用作形状,并允许使用

例如:

var = tf.Variable(array, shape=(None, 10))
这允许以后使用与上述形状匹配的形状指定值(例如,轴0中的任意形状)


var.assign(new_value)

正如Mayou36所说,您现在可以在首次声明变量形状后更改它。以下是一个工作示例:

v = tf.Variable([1], shape=tf.TensorShape(None), dtype=tf.int32) 
tf.print(v)
v.assign([1, 1, 1])
tf.print(v)
这就产生了:

[1]
[1 1 1]

这种方法的问题是
var.shape
没有相应地更新。当存储检查点时,这种情况会持续存在,从而防止再次加载检查点,因为变量形状与权重形状不匹配。有没有办法强制
var.shape
更新?我应该创建一个GitHub问题吗?我发现了这个线程,正在讨论这个问题:但是,我想知道是否有办法扩展现有网络的权重现在行为已经改变了,如果将
shape
指定为参数,则形状不再自动成为变量的形状。下面是我的答案。这不会改变变量的形状,但会返回一个张量,该张量具有变量的值,但具有新的形状。
v = tf.Variable([1], shape=tf.TensorShape(None), dtype=tf.int32) 
tf.print(v)
v.assign([1, 1, 1])
tf.print(v)
[1]
[1 1 1]