TensorFlow tutorial说在创作时我们需要指定张量的形状。那个形状自动变成张量的形状。它还说TensorFlow提供了重塑变量的高级机制。我怎样才能做到这一点?任何代码示例?
答案 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重塑方法。他们是:
以及一系列获得张量的shape
,size
,rank
的方法。可能最常用的是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,可以指定未知形状。
如果shape
为None
,则使用初始形状值。
如果指定了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>