【问题标题】:tf.Variable gets converted to normal tensor in looptf.Variable 在循环中转换为正常张量
【发布时间】:2021-06-02 08:41:03
【问题描述】:

我在 Keras 中有一个自定义层,我在其中定义了一些变量,我在调用部分为其分配了一些值。

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'”。

为什么会这样?我该如何解决?

我尝试查看文档,但仍然不明白。

提前感谢任何可能回答的人。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    大多数时候,我们不会在 init 之后再使用 self.block=...,因为这可能会使 self.block 指向另一个不受欢迎的对象,例如您的情况,导致错误消息。

    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)
    

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

    【讨论】:

    • 谢谢,但是当我尝试使用 assing 时它并没有解决问题,它仍然告诉我 Tensor 没有属性“分配”,即使 self.block 应该是一个变量
    • @Bomps 你使用的是什么版本的 tensorflow?我正在使用 tf2.5.0 并且可以毫无问题地做到这一点。由于这种花哨的索引是一项新功能,因此在过去,使用 scatter_nd_update 代替。
    • 和你一样的版本
    • 我没有提到的一件事是在图形创建时输入形状是无的,这就是我使用这个tf.range(0,limit=tf.shape(indeces)[0])的原因,因为它应该设置限制为0
    • 感谢您的时间和精力(而且 TensorFlow 奇怪地没有抱怨)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多