> For the complete documentation index, see [llms.txt](https://hecongqing.gitbook.io/tfnotes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hecongqing.gitbook.io/tfnotes/di-er-zhang-tensorflow-ji-chu-pian-i/san-zhong-jian-mo-fang-shi.md).

# 2.2 三种定义模型方式

## 常用模型层

## Sequential model

第一种：

```python
from tensorflow.keras import layers
import tensorflow as tf
model = tf.keras.Sequential()
model.add(layers.Dense(64, activation='relu'))#第一层
model.add(layers.Dense(64, activation='relu'))#第二层
model.add(layers.Dense(10))#第三层
```

第二种：

```python
model = tf.keras.Sequential([
layers.Dense(64, activation='relu', input_shape=(32,)),#第一层
layers.Dense(64, activation='relu'),#第二层
layers.Dense(10)#第三层
])
```

```python
model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
```

```python
import numpy as np

data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

model.fit(data, labels, epochs=10, batch_size=32)
```

## Functional model

函数式模型是一种创建模型的方法，该模型比tf.keras.Sequential更灵活。函数式模型可以处理具有非线性拓扑的模型，具有共享层的模型以及具有多个输入或输出的模型等等

```
举个例子：
"""
(input: 32-dimensional vectors) 
       ↧
[Dense (64 units, relu activation)] 
       ↧
[Dense (64 units, relu activation)] 
       ↧
[Dense (10 units, softmax activation)] 
       ↧
(output: logits of a probability distribution over 10 classes)
"""
```

利用Functional方式构建模型，如下所示：

```python
inputs = tf.keras.Input(shape=(32,))  
x = layers.Dense(64, activation='relu')(inputs) #第一层
x = layers.Dense(64, activation='relu')(x) #第二层
predictions = layers.Dense(10)(x) #第三层
```

模型训练：

```python
model = tf.keras.Model(inputs=inputs, outputs=predictions)


model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

import numpy as np
data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))
model.fit(data, labels, batch_size=32, epochs=5)
```

## Subclassing model

通过子类化tf.keras.Model和定义自己的前向传播模型来构建完全可定制的模型，和eager execution模式相辅相成。

```python
class MyModel(tf.keras.Model):

    def __init__(self, num_classes=10):
        super(MyModel, self).__init__(name='my_model')
        self.num_classes = num_classes
        # 定义自己需要的层
        self.dense_1 = layers.Dense(32, activation='relu') #
        self.dense_2 = layers.Dense(num_classes)

    def call(self, inputs):
        #定义前向传播
        # 使用在 (in `__init__`)定义的层
        x = self.dense_1(inputs)
        x = self.dense_2(x)
        return x
```

```python
model = MyModel(num_classes=10)

model.compile(optimizer=tf.keras.optimizers.RMSprop(0.001),
              loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

import numpy as np

data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))
# Trains for 5 epochs.
model.fit(data, labels, batch_size=32, epochs=5)
```

## 三种构建模型的区别

| **模型**             | **使用场景**                                                  |
| ------------------ | --------------------------------------------------------- |
| Sequential  model  | 对于顺序结构的模型，优先使用Sequential方法构建。                             |
| Functional  model  | 如果模型有多输入或者多输出，或者模型需要共享权重，或者模型具有残差连接等非顺序结构，推荐使用函数式API进行创建。 |
| Subclassing  model | 需要自定义层之间的传输、复杂模型。                                         |
