我正在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等价?或者你能否推荐一个更好的操作实施?感谢。
答案 0 :(得分: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.]]
答案 1 :(得分:0)
需要进行大量搜索,但与[{1}}最接近的功能是theano.tensor.set_subtensor
,gather
,gather_nd
和scatter
。如果您尝试对变量执行稀疏更新,则其他答案可能有效。但是如果你试图通过索引另一个张量来动态创建一个张量,那就是要使用的函数。
这些函数的要点是能够从其他东西动态创建张量(而不是变量)。我的用例是我生成一个平坦的张量,我试图将其重塑为各种三角矩阵。
如果您尝试从大型稀疏矩阵创建较小的矩阵,则使用 scatter_nd
。如果您尝试将较小的矩阵嵌入到大的零矩阵中,则使用gather
。
scatter
,gather
以及加法和乘法的某种组合可以重新创建scatter
。
https://www.tensorflow.org/api_docs/python/tf/scatter_nd https://www.tensorflow.org/api_guides/python/array_ops#Slicing_and_Joining
您也可以使用一组非常复杂的切片和连接,但首选收集和分散。
干杯