0

我正在阅读TensorFlow 2.0 教程,并且遇到了模型子类化来创建 TensorFlow 2.0 模型。

我找到的代码是:

class MyModel(Model):
  def __init__(self):
    super(MyModel, self).__init__()
    self.conv1 = Conv2D(32, 3, activation='relu')
    self.flatten = Flatten()
    self.d1 = Dense(128, activation='relu')
    self.d2 = Dense(10, activation='softmax')

  def call(self, x):
    x = self.conv1(x)
    x = self.flatten(x)
    x = self.d1(x)
    return self.d2(x)

# Create an instance of the model
model = MyModel()

现在,在这段代码中,我的困惑是,代码的作者没有定义输入?

没有——

self.input_layer = Input(
            shape = (28, 28)
            )

# OR-

self.conv1 = Conv2D(32, 3, activation='relu', input_dim = (28, 28)

然后,定义的模型如何知道从训练数据中期望有多少属性/特征?

谢谢

4

1 回答 1

2

根据 Francois Chollet 的说法,您的问题的答案如下(比较(功能+顺序与模型 API):

您可以在功能或顺序模型中执行所有这些操作(打印输入/输出形状),因为这些模型是层的静态图。

相反,子类模型是一段 Python 代码(调用方法)。这里没有图层图。我们不知道层是如何相互连接的(因为这是在调用主体中定义的,而不是作为明确的数据结构),因此我们无法推断输入/输出形状

此处提供了对这 3 种类型的更详细说明:https ://medium.com/tensorflow/what-are-symbolic-and-imperative-apis-in-tensorflow-2-0-dfccecb01021

这里有一个如何通过混合功能 + 模型子类化 api 来实现这一点的示例(致 GitHub 上的 ixez 的学分):

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

class MyModel(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense = tf.keras.layers.Dense(1)

    def call(self, inputs, **kwargs):
        return self.dense(inputs)

    def model(self):
        x = Input(shape=(1))
        return Model(inputs=[x], outputs=self.call(x))

MyModel().model().summary()
于 2020-02-08T07:37:59.827 回答