【问题标题】:Creating a matrix-Tensor of operations创建一个矩阵张量的操作
【发布时间】:2017-06-15 14:51:33
【问题描述】:

我正在尝试在 TensorFlow 中实现一种非线性滤波器,但我在一步实现时遇到了问题。这一步基本上是这样的:

x_update = x.assign(tf.matmul(A, x))

问题在于矩阵A 的结构类似于:

A = [[1, 0.1, 0, 0, 0],
     [0, 1, 0, 0, 0],
     [0, 0, f1(x), f2(x), f3(x)],
     [0, 0, f4(x), f5(x), f6(x)],
     [0, 0, 0, 0, 1]]

每个fn(x) 都是我的状态的非线性函数;类似tf.sin(x[4]) 甚至x[2]**2 * tf.sin(x[4]) + x[3]**2 * tf.cos(x[4])

我不知道如何创建我的A 矩阵以便嵌入这些操作。我首先用一些值初始化它:

A_mat = np.eye(5)
A_mat[0, 1] = 0.1
A = tf.Variable(A_mat, dtype=tf.float32, trainable=False, name='A')

然后我尝试使用tf.scatter_update 进行一些切片更新,例如:

# Define my nonlinear operations.
f1 = tf.cos(...)
f2 = tf.sin(...)
# ...

# Define the part that I want to substitute.
new_part = tf.constant(tf.convert_to_tensor([[f1, f2, f3],
                                             [f4, f5, f6]]))

# Define slice indices and update the matrix.
inds = [vals for vals in zip(np.arange(1, 3), np.arange(2, 5))]
A_update = tf.scatter_update(A, tf.constant(inds), new_part, name='A_update')

这给了我一个错误说明:

ValueError: Shapes must be equal rank, but are 1 and 0

从将形状 1 与其他形状合并。对于“packed/0”(操作:“Pack”),输入形状为:[1]、[1]、[]、[]、[]、[]。

我也尝试将我的矩阵 new_part 分配回 numpy 定义的 A_mat,但我得到了一个不同的错误,我认为这是由于突然分配了一个数值数组的张量元素时出现了意外的数据类型。

那么有谁知道如何定义一个操作矩阵,当这样使用矩阵时会更新?

理想情况下,我想定义矩阵A,以便在A 内更新的所有操作都是对A 的调用的一部分并自动发生。这样我就可以完全避免切片分配,而且感觉更像 TensorFlow。

谢谢!


更新:

我通过将我的操作包装在 tf.reshape(op_name, []) 中并将我的更新更改为:

new_part = tf.convert_to_tensor([[0, 0, f1, f2, f3],
                                 [0, 0, f4, f5, f6]]))
rows = np.arange(start_row, end_row)
A_update = tf.scatter_update(A, rows, new_part, name='A_update')

事实证明,tf.scatter_update 只能在变量的第一个维度上进行操作,因此我必须向它提供完整的行以及我想要放置它们的行索引。这有帮助,但仍然留下我的问题:


我的问题:

定义此A 矩阵的最佳、最 TensorFlow-y 方式是什么,以便那些不变的元素保持不变,而那些在我的图表上是其他张量运算的元素嵌入到 A 中?我想在我的图表上调用A 来完成并运行这些更新,而无需手动执行此操作tf.scatter_update。或者这是正确的方法吗?

【问题讨论】:

  • 问题是当你没有 new_part = tf.constant... tensorflow 试图将所有张量 f1、f2、f2 等堆叠成一个矩阵,但它们的形状并不相同;将它们全部重塑为标量,它应该可以工作。
  • @AlexandrePassos 谢谢!在将操作包装在tf.reshape(..., []) 中之后,它变得越来越近了,但是我现在在实现tf.scatter_update 时遇到了错误。虽然取得了进展!

标签: python numpy tensorflow


【解决方案1】:

更新子矩阵最简单的方法是使用 tensorflow 的 python 切片操作。

import numpy as np
import tensorflow as tf
A = tf.Variable(np.zeros((5, 5), dtype=np.float32), trainable=False)
new_part = tf.ones((2,3))

update_A = A[2:4,2:5].assign(new_part)

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
print(update_A.eval())
# array([[ 0.,  0.,  0.,  0.,  0.],
#        [ 0.,  0.,  0.,  0.,  0.],
#        [ 0.,  0.,  1.,  1.,  1.],
#        [ 0.,  0.,  1.,  1.,  1.],
#        [ 0.,  0.,  0.,  0.,  0.]], dtype=float32)

【讨论】:

    猜你喜欢
    • 2016-06-16
    • 2018-11-16
    • 1970-01-01
    • 2019-04-22
    • 2016-11-13
    • 2019-12-03
    • 1970-01-01
    • 2015-01-30
    • 2021-04-04
    相关资源
    最近更新 更多