Python 变量在循环中转换为正规张量

Python 变量在循环中转换为正规张量,python,tensorflow,keras,Python,Tensorflow,Keras,我在Keras中有一个自定义层,我在其中定义了一些变量,并在call部分为这些变量赋值 class Mine_layer(KL.Layer): def __init__(self,shape): self.block=tf.Variable(tf.constant(1,shape=shape)) def call (self,indeces): self.block=self.block[indeces[0][0],indeces[0][1]].assign(1) 这是

我在Keras中有一个自定义层,我在其中定义了一些变量,并在call部分为这些变量赋值

class Mine_layer(KL.Layer):
  def __init__(self,shape):
    self.block=tf.Variable(tf.constant(1,shape=shape))
  def call (self,indeces):
    self.block=self.block[indeces[0][0],indeces[0][1]].assign(1)
这是可行的,但如果我尝试在所有索引上使用for循环:

for i in tf.range(0,limit=tf.shape(indeces)[0]):
   self.block=self.block[indeces[i][0],indeces[i][1]].assign(1)
这给了我一个错误,即“'Tensor'对象没有属性'assign'”

为什么会发生这种情况?我怎样才能解决它

我试着看了一下文档,但还是不明白


提前感谢所有可能回答的人。

大多数情况下,我们不使用self.block=。。。再次在init之后执行,因为这可能会使self.block指向另一个不需要的对象,例如在您的情况下的张量,从而产生错误消息

i、 e


更新:两种解决方案都有效

谢谢,但当我尝试使用assing时,它没有解决问题。它仍然告诉我,尽管self.block应该是一个Variable@Bomps您使用的是什么版本的tensorflow?我正在使用tf2.5.0,可以毫无问题地执行此操作。由于这种奇特的索引是一种新功能,在以前,使用了分散更新。与您相同的版本我没有提到的一件事是,在图形创建时输入形状是无的这就是我使用此
tf.range(0,limit=tf.shape(indeces)[0]的原因
与“无”一样,它应该将限制设置为0感谢您的时间和努力我认为我发现了问题,我将接受您的回答,因为这是错误的根源,尽管初始化过程中出现了另一个我没有注意到的错误(TensorFlow奇怪地没有抱怨)
class my_layer(keras.Layer):
  def __init__(self,shape):
    self.block = tf.Variable(tf.ones(shape)) #use tf.ones instead of tf.constant

  def call(self,inputs):
    self.block.scatter_nd_update(inputs,tf.ones(tf.shape(inputs)[0]))
    #remove the self.block= assignment and use scatter_nd_update

class my_layer2(keras.Layer):
  def __init__(self,shape):
    self.var = tf.Variable(tf.ones(shape)) 

  def call(self,inputs):
     for i in tf.range(tf.shape(inputs)[0]):
        self.var[inputs[i,0],inputs[i,1]].assign(1)