概述
函数式(Functional) api 用来构造 比较复杂的模型 ,如:
- 多个输入模型
- 多个输出模型
- 有向非循环图
- 有共享层的模型
使用函数式api,一般使用 tf.keras.Model
感性认识
本例使用函数式api实现Fashion MNIST图像识别
导入模块
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
加载数据
(train_image,train_label),(test_image,test_label)=tf.keras.datasets.fashion_mnist.load_data()
归一化
# 归一化
train_image=train_image/255
test_image=test_image/255
建立模型
函数式api在建立模型时有些不同:
通过
tf.keras.Input()向模型中输入数据,并指定数据的 形状。 详情点击将 类对象 作为 函数调用,并 传入上一层的对象
inp=tf.keras.Input(shape=(28,28))
flt=tf.keras.layers.Flatten()(inp)
den1=tf.keras.layers.Dense(128,activation='relu')(flt)
out=tf.keras.layers.Dense(10,activation='softmax')(den1)
# 建立模型
model=tf.keras.Model(inputs=[inp],outputs=[out])
model.summary()
思考
将 实例对象 作为 函数调用 的实现原理:
参见 python面向对象-类的内置方法(补充) 的__call__()
编译
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['acc'])
训练
model.fit(train_image,train_label,epochs=5)
评估模型
model.evaluate(test_image,test_label)
预测
prd_label=model.predict(test_image)
prd_label.shape
prd_label[0]
计算预测准确率
error_num=0
for item in range(10000):
label_num=tf.argmax(prd_label[item])
label_num=int(label_num)
# print(label_num,test_label[item])
if label_num!=test_label[item]:
error_num+=1
print('错误总数:',error_num)
print('正确率:',1-error_num/10000)