python - 分配给 TensorFlow 中变量的扁平视图的切片
问题描述
在 TensorFlow 中,我错过了一种直接将某些内容分配给变量扁平视图的切片的方法。
这是一个以迂回方式实现相同结果的示例:
var = tf.Variable(tf.reshape(tf.range(12), [4,3]))
# <tf.Variable 'Variable:0' shape=(4, 3) dtype=int32, numpy=
# array([[ 0, 1, 2],
# [ 3, 4, 5],
# [ 6, 7, 8],
# [ 9, 10, 11]], dtype=int32)>
flat_indices = tf.range(4, 8)
multi_dim_indices = tf.transpose(tf.unravel_index(flat_indices, dims=[4,3]))
# <tf.Tensor: shape=(4, 2), dtype=int32, numpy=
# array([[1, 1],
# [1, 2],
# [2, 0],
# [2, 1]], dtype=int32)>
update = [40, 50, 60, 70]
var.scatter_nd_update(multi_dim_indices, update)
# <tf.Variable 'UnreadVariable' shape=(4, 3) dtype=int32, numpy=
# array([[ 0, 1, 2],
# [ 3, 40, 50],
# [60, 70, 8],
# [ 9, 10, 11]], dtype=int32)>
但这不是大张量的有效解决方案。建筑multi_dim_indices
应该是不必要的。scatter_nd_update
是一个稀疏操作,但我正在寻找的是对连续内存的密集分配。
使用类似 numpy 的 API,我可以编写:
var.flat[4:8] = update
有没有一种有效的方法可以在 TensorFlow 中实现相同的结果,也许使用更丑的 API?
解决方案
你可以在tensorflow中做类似的操作,如下:
var = tf.Variable(tf.reshape(tf.range(12), [4,3]))
var = tf.Variable(tf.reshape(var, [-1])) # flatten the vector
var[4:8].assign([40, 50, 60, 70]) # update / assign item in particular indices
var = tf.Variable(tf.reshape(var, [4,3])) # reshape back to original shape
var
<tf.Variable 'Variable:0' shape=(4, 3) dtype=int32, numpy=
array([[ 0, 1, 2],
[ 3, 40, 50],
[60, 70, 8],
[ 9, 10, 11]], dtype=int32)>
推荐阅读
- arrays - VBA Word 如何将数组的一部分传递给子程序?
- pandas - “ValueError:数组的长度必须相同”
- python - 有没有办法从终端关闭使用 matplotlib 创建的绘图(无需用鼠标关闭窗口)
- c++ - 为什么使用可变参数调用 DLL 检索到错误的结果,并且使用额外未使用的参数解决了问题
- php - 登录功能执行期间 PHP REST API 中的错误?
- qt - Unexpected loop when binding property to delegate index via function
- swift - 使用 Swift Package Manager 将 Google Firebase Admob 添加到 iOS 项目
- php - 通过发送标头不会将 Php 会话发送到其他页面
- python - 两个 Pandas 数据框:基于日期,为数据框添加价值
- reactjs - 为什么我收到 TypeError: Cannot read property 'done' of undefined in todoapp?