keras错误:"属性错误:无法设置属性"在定义图层时

时间:2018-01-20 07:11:39

标签: python keras

我试图在keras中创建自己的图层,但是我收到错误。我的简单代码如下:

class MyLayer(Layer):

def __init__(self, output_dim, **kwargs):
    self.output_dim = output_dim

    self.updates = []

    super(MyLayer, self).__init__(**kwargs)

def build(self, input_shape):
    # Create a trainable weight variable for this layer.
    self.kernel = self.add_weight(name='kernel', 
                                  shape=(input_shape[1], self.output_dim),
                                  initializer='uniform',
                                  trainable=True)
    super(MyLayer, self).build(input_shape)  # Be sure to call this somewhere!

def call(self, x):
    return K.dot(x, self.kernel)

def compute_output_shape(self, input_shape):
    return (input_shape[0], self.output_dim)

,错误是:

AttributeError Traceback(最近一次调用最后一次)  in() ----> 1 MyLayer(output_dim = 10)

init 中的

(self,output_dim,** kwargs)

8 self.output_dim = output_dim

9

---> 10 self.updates = []

11

12 super(MyLayer,self)。 init (** kwargs)

AttributeError:无法设置属性

你可以帮忙解决这个问题吗? 感谢

2 个答案:

答案 0 :(得分:0)

这看起来类似于here中的问题。

在那种情况下,OP使用了变量名称​​ weights 而不是似乎已经使用的 kernal 。如果查看Tensroflow guide Layer 的定义,您会看到 update weights 是类< strong>图层。

答案 1 :(得分:0)

这在Tensorflow 2.0中有效。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Layer

class MyLayer(Layer):
  def __init__(self, output_dim, **kwargs):
    self.output_dim = output_dim

    self.update = []

    super(MyLayer, self).__init__(**kwargs)

  def build(self, input_shape):
      # Create a trainable weight variable for this layer.
      self.my_kernel = self.add_weight(name='my_kernel', 
                                    shape=(input_shape[1], self.output_dim),
                                    initializer='uniform',
                                    trainable=True)
      super(MyLayer, self).build(input_shape)  # Be sure to call this somewhere!

  def call(self, x):
      return K.dot(x, self.kernel)

  def compute_output_shape(self, input_shape):
      return (input_shape[0], self.output_dim)

my_layer = MyLayer((1))