因此,我可以通过对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:图层cnn未连接,没有输入可返回。
那只是一个差异,那么,是什么使它们与众不同,又如何充实第一个模型以使其具有以经典方式定义的模型的所有属性呢?更准确地说,如标题中所示:一堆堆叠的层和模型之间有什么区别?
答案 0 :(得分: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