【问题标题】:Custom layer in sequential model tensorflow顺序模型张量流中的自定义层
【发布时间】:2021-02-04 16:31:55
【问题描述】:

我正在尝试为我的模型创建一个自定义层,可以使用 Keras 的经典 Dense 层。这是我的自定义层:

class MyDenseLayer(tf.keras.layers.Layer):
    def __init__(self, num_outputs):
        super(MyDenseLayer, self).__init__()
        self.num_outputs = num_outputs
    def build(self, input_shape):
        self.kernel = self.add_weight("kernel", 
                                      shape=[int(input_shape[-1]),
                                      self.num_outputs])
    def call(self, input):
        return tf.matmul(input, self.kernel)

它现在不做任何“自定义”。

但是当我将它添加到我的模型时

def build_model():
    model = keras.Sequential([
        MyDenseLayer(10)(normed_x_train),
        layers.Activation(tf.nn.relu),
        layers.Dense(1, activation=tf.nn.relu)
        ])
    return model

我明白了:

The added layer must be an instance of class Layer. Found: tf.Tensor(
[....])

因为可能我正在直接创建自定义层类的对象。但我在 tf 文档中没有找到如何添加其他属性以使其作为普通层工作,即像 layers.Dense(100, activation=tf.nn.relu)

有没有办法让它像那样工作?

【问题讨论】:

  • 如果你通过 MyDenseLayer(10) 而不是 MyDenseLayer(10)(normed_x_train) ?
  • 我明白了:这个模型还没有建成。首先调用 `build() 构建模型
  • 尝试用你的模型做点什么:预测/拟合...例如:model(np.random.uniform(0,1, (10,30)).astype('float32') )
  • 在实施 Marco 的建议后对我有用。你能提供一个完全可复制粘贴的例子吗?否则我们无能为力
  • 那我肯定在做一些愚蠢的事情。明天我再试一次,让你知道,谢谢!

标签: python tensorflow machine-learning keras neural-network


【解决方案1】:

正如他们在 cmets 中所说,在定义模型时不要引入输入。那就是:

def build_model():
    model = keras.Sequential([
        MyDenseLayer(10),
        keras.layers.Activation(tf.nn.relu),
        keras.layers.Dense(1, activation=tf.nn.relu)
        ])
    return model

然后你可以试试:

model = build_model()
model(tf.random.uniform((100, 100)))

P.S:这个问题已经问了好几天了,但是@Marco Cerliani 解决了这个问题(无论如何我都可以删除它)

【讨论】:

    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多