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

时间:2015-11-11 16:08:49

标签: matrix reshape tensorflow

TensorFlow tutorial说在创作时我们需要指定张量的形状。那个形状自动变成张量的形状。它还说TensorFlow提供了重塑变量的高级机制。我怎样才能做到这一点?任何代码示例?

6 个答案:

答案 0 :(得分:18)

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

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

var = tf.Variable(tf.placeholder(tf.float32))
# ...
new_value = ...  # Tensor or numpy array.
change_shape_op = tf.assign(var, new_value, validate_shape=False)
# ...
sess.run(change_shape_op)  # Changes the shape of `var` to new_value's shape.

请注意,此功能不在文档化的公共API中,因此可能会发生变化。如果您确实发现需要使用此功能,请告诉我们,我们可以调查一种方法来支持它向前发展。

答案 1 :(得分:6)

从TensorFlow文档中查看shapes-and-shaping。它描述了可用的不同形状变换。

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

答案 2 :(得分:4)

Documentation shows重塑方法。他们是:

  • 重塑
  • 挤压(从张量的形状中移除尺寸1的尺寸)
  • expand_dims(添加尺寸为1的尺寸)

以及一系列获得张量的shapesizerank的方法。可能最常用的是reshape,这里是一个带有几个边缘情况(-1)的代码示例:

import tensorflow as tf

v1 = tf.Variable([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
])
v2 = tf.reshape(v1, [2, 6])
v3 = tf.reshape(v1, [2, 2, -1])
v4 = tf.reshape(v1, [-1])
# v5 = tf.reshape(v1, [2, 4, -1]) will fail, because you can not find such an integer for -1
v6 = tf.reshape(v1, [1, 4, 1, 3, 1])
v6_shape = tf.shape(v6)
v6_squeezed = tf.squeeze(v6)
v6_squeezed_shape = tf.shape(v6_squeezed)

init = tf.initialize_all_variables()

sess = tf.Session()
sess.run(init)
a, b, c, d, e, f, g = sess.run([v2, v3, v4, v6, v6_shape, v6_squeezed, v6_squeezed_shape])
# print all variables to see what is there
print e # shape of v6
print g # shape of v6_squeezed

答案 3 :(得分:2)

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_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)

您可以通过传递自己的初始化函数来创建任何形状的变量。

另一种方式:

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

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

答案 4 :(得分:0)

tf.Variable:将shape参数与None一起使用

1.14中的feature was added,可以指定未知形状。

如果shapeNone,则使用初始形状值。

如果指定了shape,则将其用作形状并允许具有None

示例:

var = tf.Variable(array, shape=(None, 10))

这允许以后分配形状与上面的形状匹配的值(例如,轴0中的任意形状)

var.assign(new_value)

答案 5 :(得分:0)

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

.choices__list.choices__list--dropdown.is-active {
  z-index: 3;
}

这将输出:

<link rel="stylesheet" href="https://res.cloudinary.com/dxfq3iotg/raw/upload/v1569006288/BBBootstrap/choices.min.css?version=7.0.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://res.cloudinary.com/dxfq3iotg/raw/upload/v1569006273/BBBootstrap/choices.min.js?version=7.0.0"></script>

<div class="col-md-10">
  <select id="multiple-state" placeholder="Select state" multiple>
    <option value="al" />Alabama</option>
    <option value="ak" />Alaska</option>
    <option value="az" />Arizona</option>
  </select>
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <button class="btn btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Display</button>
      <div class="dropdown-menu">
        <ul id="list" class="list-group list-group-flush"></ul>
      </div>
    </div>
    <input type="text" class="form-control" placeholder="Input city and press Enter" id="city">
  </div>
</div>
</div>