import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
01 简单的函数API构建模型实例
1.1 建立模型
inputs = keras.Input(shape=(784,))
# 输入层,给定输入形状,忽略批次大小,样本大小为784,因此接受的输入形状为[None,784]
dense = layers.Dense(64, activation="relu")
# 线性堆叠层(全连接),参数个数为64×784+64=50240 每一行为一批样本
x = dense(inputs)
x = layers.Dense(64, activation="relu")(x)
outputs = layers.Dense(10)(x)
model = keras.Model(inputs=inputs, outputs=outputs, name="mnist_model")
# 关键字参数,输入inputs,输出outputs
model.summary()
Model: "mnist_model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 784)] 0
dense (Dense) (None, 64) 50240
dense_1 (Dense) (None, 64) 4160
dense_2 (Dense) (None, 10) 650
=================================================================
Total params: 55,050
Trainable params: 55,050
Non-trainable params: 0
_________________________________________________________________
1.2 绘制模型计算层图
keras.utils.plot_model(model, "my_first_model.png",show_shapes=True)
# show_shapes=True 绘制计算层图显示输入输出形状
![image]()
1.3 训练、评估、推断
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data(path='mnist.npz')
# 载入数据,返回Tuple of NumPy arrays: (x_train, y_train), (x_test, y_test).
# 数据集60000×28×28 测试集10000×28×28
x_train = x_train.reshape(60000, 784).astype("float32") / 255 #归一化[0,1]
x_test = x_test.reshape(10000, 784).astype("float32") / 255
print(y_train.dtype)
#编译模型
model.compile(
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
optimizer=keras.optimizers.RMSprop(),
metrics=["accuracy"],
)
# 这里为什么采用SpareCategoricalCrossentropy,这里的标签并非采用的独热编码(one-hot),label为整形
history = model.fit(x_train, y_train, batch_size=64, epochs=2, validation_split=0.2)
test_scores = model.evaluate(x_test, y_test, verbose=2)
print("Test loss:", test_scores[0])
print("Test accuracy:", test_scores[1])
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11490434/11490434 [==============================] - 2s 0us/step
uint8
Epoch 1/2
750/750 [==============================] - 1s 1ms/step - loss: 0.3449 - accuracy: 0.9018 - val_loss: 0.1955 - val_accuracy: 0.9438
Epoch 2/2
750/750 [==============================] - 1s 1ms/step - loss: 0.1616 - accuracy: 0.9518 - val_loss: 0.1354 - val_accuracy: 0.9602
313/313 - 0s - loss: 0.1313 - accuracy: 0.9600 - 186ms/epoch - 595us/step
Test loss: 0.131303071975708
Test accuracy: 0.9599999785423279
02 处理复杂的计算拓扑图
2.1 具有多个输入和输出的模型