【问题标题】:What is the difference between a model and a bunch of stacked layers in TF 2.0?TF 2.0 中的模型和一堆堆叠层有什么区别?
【发布时间】:2023-03-06 15:43:01
【问题描述】:

所以,我可以通过继承 Keras 层和模型来创建我的模型,如下所示:

class CNN(tf.keras.models.Model):
    def __init__(self, **kwargs):
        super(CNN, self).__init__(**kwargs)
        self.l1 = tf.keras.layers.Conv2D(64, (4, 4), padding='same')
        self.l2 = tf.keras.layers.Dense(10, activation='softmax')

    def call(self, ip):
        x = self.l1(ip)
        op = self.l2(x)
        return op

这与

有何不同
mymodel = Model(input = inputs, output= outputs)

我的意思是,我知道一些差异,例如上面的模型具有属性 mymodel.input 但是当我为通过子类化定义的模型请求此属性时,它会引发此错误:

AttributeError: Layer cnn is not connected, no input to return.

这只是一个区别,那么,是什么让它们不同,以及如何充实第一个模型以使其具有以经典方式定义的模型的所有属性?更准确地说,如标题所示:一堆堆叠的层和一个模型有什么区别?

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    从软件的角度来看,Model 是一个独特的 python 类,就像各个层一样(https://www.tensorflow.org/api_docs/python/tf/keras/models/Model 来自 TF 1.13 文档)。与任何 python 类一样,都有独特的方法,Model 也是如此。

    Model 类如何在逻辑上 集成各个层在 https://github.com/tensorflow/tensorflow/blob/r1.13/tensorflow/python/keras/engine/training.py 中的 Model 类的源代码中(对于 TF 1.13,TF 2.0 的源代码很可能相似, 以便在文件中使用 Ctrl+F 更轻松地找到搜索 class Model )

    【讨论】:

    • 为什么使用子类化构造的模型在询问其输入或输出属性时会抛出错误?
    • 当模型设置不准确时,通常会抛出类似的错误,参见即github.com/keras-team/keras/issues/2060
    • 即使指定输入,我也会得到同样的错误。我通常在构建之后的构建方法中这样做。此外,model.output 会引发相同的错误。而且,模型无法序列化和保存。定制神经网络存在很多问题。
    • 错误可能是由于您没有创建子类模型的实例,请参阅tensorflow.org/beta/guide/keras/saving_and_serializing 保存子类模型一章,仍然存在模型设置中可能存在错误,因此模型甚至无法构建
    • 重要的部分是首先,一个从未使用过的子类模型不能保存。也没有输入和输出等。阅读章节保存子类模型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2016-08-18
    • 1970-01-01
    • 2021-05-10
    • 2012-09-24
    • 2013-09-19
    • 2020-10-24
    相关资源
    最近更新 更多