【问题标题】:tensorflow theano.tensor.set_subtensor equivalenttensorflow theano.tensor.set_subtensor 等效
【发布时间】:2017-01-06 23:31:50
【问题描述】:

我正在 keras 中实现一个操作,以便它可以在 theano 和 tensorflow 后端上运行。假设操作的输入是:

array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]], dtype=int64)

那么它的输出应该是:

array([[ 0,  1,  2,  3,  4,  5],
       [ 3,  4,  5,  0,  1,  2],
       [ 6,  7,  8,  9,  10, 11],
       [ 9, 10, 11,  6,   7, 8]], dtype=int64)

我的代码如下:

from keras import backend as K
def pairreshape(x,target_dim,input_shape):
    x1, x2 = x[0::2,], x[1::2,]
    x1_concate = K.concatenate((x1,x2), axis=target_dim)
    x2_concate = K.concatenate((x2,x1), axis=target_dim)
    if K.image_dim_ordering() == 'th':
        import theano.tensor as T
        x_new = T.repeat(x,2,axis=target_dim)
        x_new = T.set_subtensor(x_new[0::2], x1_concate)
        x_new = T.set_subtensor(x_new[1::2], x2_concate)
    elif K.image_dim_ordering() == 'tf':
        import tensorflow as tf
        repeats = [1] * len(input_shape)
        repeats[target_dim] = 2
        x_new = tf.tile(x, repeats)
        x_new[0::2] = x1_concate #TypeError: 'Tensor' object does not support item assignment
        x_new[1::2] = x2_concate #TypeError: 'Tensor' object does not support item assignment

我已经通过theano成功实现了它,但是我不知道如何通过tensorflow分配一个张量。 tensorflow中最后两行张量赋值会报错。张量流中是否存在 T.set_subtensor 等价性?或者你能推荐一个更好的操作实施吗?谢谢。

【问题讨论】:

    标签: tensorflow theano keras


    【解决方案1】:

    TensorFlow 张量是只读的。为了修改你需要使用变量和.assign的东西(=不能在Python中被覆盖)

    tensor = tf.Variable(tf.ones((3,3)))
    sess.run(tf.initialize_all_variables())
    sess.run(tensor[1:, 1:].assign(2*tensor[1:,1:]))
    print(tensor.eval())
    

    输出

    [[ 1.  1.  1.]
     [ 1.  2.  2.]
     [ 1.  2.  2.]]
    

    【讨论】:

    • 嗨雅罗斯拉夫。感谢您的回答。恐怕我的问题不清楚。输入 x 是深度神经网络中的训练样本,据我所知,它应该表示为张量。那么有没有解决办法呢?谢谢。
    • 由于张量是只读的,所以set_subtensor的唯一方法是先将其复制到一个变量中,然后修改该变量
    • 你可以做tensor_copy.assign(tensor)做复制,并添加一个控制依赖以确保它在你的set_subtensor模拟之前执行
    【解决方案2】:

    搜索了很多,但最接近theano.tensor.set_subtensor 的函数是gathergather_ndscatterscatter_nd。如果您尝试对变量执行稀疏更新,其他答案可能会起作用。但是,如果您尝试通过索引另一个张量来动态创建一个张量,则可以使用这些函数。

    这些函数的重点是能够从其他东西动态创建张量(不是变量)。我的用例是我正在生成一个平面张量,并且我正在尝试将其重塑为各种三角矩阵。

    gather 是您尝试从大型稀疏矩阵创建更小的矩阵时使用的。 scatter 是您尝试将较小的矩阵嵌入到较大的零矩阵中时使用的。

    gatherscatter 和加法和乘法的某种组合可以重新创建 theano.tensor.set_subtensor

    https://www.tensorflow.org/api_docs/python/tf/scatter_nd https://www.tensorflow.org/api_guides/python/array_ops#Slicing_and_Joining

    您也可以使用一组非常复杂的切片和连接,但首选收集和分散。

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2018-09-20
      • 2020-10-30
      • 1970-01-01
      • 2021-08-01
      • 2020-09-26
      • 2016-05-23
      相关资源
      最近更新 更多