Tensorflow使用Tensorflow索引访问张量

Tensorflow使用Tensorflow索引访问张量,tensorflow,Tensorflow,我有一个形状为(a,?,B,C)的张量T。我还有一个张量索引,我定义为I=tf.argmax(某物)。我想定义T(I,,,:,:)。当索引I不是张量对象而是整数时,操作T(I,:,:,:,:)工作得很好。当我是张量=tf.argmax时,该怎么办 切片一个张量,T(I,:,:,:)使用I作为一个张量和一个整数,在Tensorflow版本2.1中似乎可以正常工作 下面提到的代码使用了形状为(a,?,B,C)的张量,它使用tf.argmax的张量值和tf.argmax的整数值对T(I,:,:,:,:

我有一个形状为(a,?,B,C)的张量T。我还有一个张量索引,我定义为I=tf.argmax(某物)。我想定义T(I,,,:,:)。当索引I不是张量对象而是整数时,操作T(I,:,:,:,:)工作得很好。当我是张量=tf.argmax时,该怎么办

切片一个张量,
T(I,:,:,:)
使用
I
作为一个张量和一个整数,在
Tensorflow版本2.1
中似乎可以正常工作

下面提到的代码使用了形状为
(a,?,B,C)
的张量,它使用
tf.argmax的张量值和
tf.argmax的整数值对
T(I,:,:,:,:)
进行切片

%tensorflow_version 2.x
import tensorflow as tf
import numpy as np

b = np.ones(shape = (2,3,3,4))

a = tf.Variable(b, shape = (2,None, 3,4), dtype = tf.int32)

l = [166.32, 10, 26.9, 2.8, 1, 62.3]
b = tf.math.argmax(input = l)
c = tf.keras.backend.eval(b)
print('b = {} and c = {}'.format(b,c))

a = tf.ones(shape = (2,5,3,4))

Arg_Max_Tensor_Val = a[b,:,:,:]
Arg_Max_Int_Val = a[c,:,:,:]

print(Arg_Max_Int_Val)
print(Arg_Max_Tensor_Val)
以下是输出:

tf.Tensor(
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

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

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

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

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]], shape=(5, 3, 4), dtype=float32)

tf.Tensor(
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

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

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

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

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]], shape=(5, 3, 4), dtype=float32)
请让我知道此代码是否解决了您的问题。如果没有,请共享您正在使用的代码,以便我们进一步调查。谢谢

切片一个张量,
T(I,:,:,:)
使用
I
作为一个张量和一个整数,在
Tensorflow版本2.1
中似乎可以正常工作

下面提到的代码使用了形状为
(a,?,B,C)
的张量,它使用
tf.argmax的张量值和
tf.argmax的整数值对
T(I,:,:,:,:)
进行切片

%tensorflow_version 2.x
import tensorflow as tf
import numpy as np

b = np.ones(shape = (2,3,3,4))

a = tf.Variable(b, shape = (2,None, 3,4), dtype = tf.int32)

l = [166.32, 10, 26.9, 2.8, 1, 62.3]
b = tf.math.argmax(input = l)
c = tf.keras.backend.eval(b)
print('b = {} and c = {}'.format(b,c))

a = tf.ones(shape = (2,5,3,4))

Arg_Max_Tensor_Val = a[b,:,:,:]
Arg_Max_Int_Val = a[c,:,:,:]

print(Arg_Max_Int_Val)
print(Arg_Max_Tensor_Val)
以下是输出:

tf.Tensor(
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

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

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

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

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]], shape=(5, 3, 4), dtype=float32)

tf.Tensor(
[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

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

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

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

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]], shape=(5, 3, 4), dtype=float32)

请让我知道此代码是否解决了您的问题。如果没有,请共享您正在使用的代码,以便我们进一步调查。谢谢

Tensorflow参数实际上是建立在彼此之上的命令链,要获得实际值,需要调用
compute
方法(或者不管它叫什么,已经有一段时间了)来获得实际值。我找不到compute方法。我尝试了这种简单的方法,但它不起作用:对于xrange中的m(…):如果tf.equal(I,m):my_sub_tensor=T(m,,,,:,:)tensor flow也有一个称为常量或变量的东西,也许其中一个会适合您的用例TensorFlow参数实际上是建立在彼此之上的命令链,以获得实际值,你需要调用
compute
方法(或者不管调用什么,已经有一段时间了)来获得实际值。我找不到compute方法。我尝试了这种简单的方法,但它不起作用:对于xrange中的m(…):如果tf.equal(I,m):my_sub_tensor=T(m,?,,:,:,:)张量流也有一个称为常量或变量的东西,也许其中一个适合您的使用case@Max-如果答案回答了您的问题,请您接受并投票表决。谢谢。@Max-如果答案回答了你的问题,你能接受并投票吗。非常感谢。