开发者学堂课程【Tensorflow2.0入门与实战:函数式API】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/664/detail/11112
函数式API
内容介绍:
一、 什么是函数式 API
二、 函数式 API 的写法
一、什么是函数式API
函数是什么样子的呢?
当我们定义一个函数之后,然后调用这个函数,直接在这个函数后面添加一个参数来调用它。
函数式 API 类似于函数的调用,我们把每一层看成一个函数来调用这一层,这样的写法相对于前面的只有一个输入,只有一个输出,中间都是顺序连接的单一结构的模型,函数式 API 可以实现引入残差或者输入直接连接输出。
学习完函数式 API,我们可以自己 diy 网络的结构。
二、函数式API的写法
首先引入 tensorflow :
import tensorflow as tf
然后从 tensorflow 引入 keras,引入 matplotlib
from tensorflow import keras
import matplotlib. pyplot as plt
%matplotlib inline
导入 fashion,把 fashion 归一化
fashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels)=fashion_mnist.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0
写模型
函数式 API 的核心思想就在于可以进行调用,对于每一层都可以调用每一层,需要哪一层就直接去调用它。
设置一个输入,keras 为我们提供 keras.Input 这种方法,shape 只需要添加图片的形状,不需要添加第一维度:
input = keras.Input(shape=(28,28))
输入的第一层通过哪里呢,实际上是一个函数调用的过程,输出为x,y,调用结束叫x,比如调用 Flatten,把 Flatten 这一层看成是一个函数,再调用一个 Dense层,输出32个隐藏单元数,activation='relu',把每一层看成一个函数;添加一个Dropout 层,比例是0.5;再调用一个 Dense 层,输出64个隐藏单元数:
x=keras.layers.Flatten()(input)
x= keras.layers.Dense(32,activation='relu')(x)
x = keras.layers. Dropout(0.5)(x)
x= keras. layers.Dense(64,activation='relu')(x)
最后,做一个输出,输出10个隐藏单元数,relu 换成 softmax,调用x:
output = keras.layers.Dense(10,activation='softmax')(x)
这样就建立好了 input 和 output,在他们之间就是这个网络。
如何建立 model,keras.Model 这个方法,写好 inputs 和 outputs,inputs=input,outputs=output:
model = keras.Model(inputs=input,outputs=output)
根据输入、输出初始化好这个模型,看一下这个模型的样子:
model. summary()
模型的输入层[(None,28,28)]
None,这个维度是一个个数,一个代表个数的维度,一般来说不需要关心它,意思是任意一个
第二层是 flatten 层,第三层是 dense 层,第四层是 dropout 层,第五层是 dense层,第六层是输出层。这样就建立好这个 model,这就是函数式API来完成这个模型。
重点是建立好 input,一层一层地调用,最后建立 output,初始化 model,需要注意的是 input 和 output 之间应该是关联的,中间某一层关系的断连都会产生错误。
函数式 API 有哪些好处呢?
可以建立多输入或者说多输出的模型,可以建立两个input:input1、input2,使用两个 input 提取信息,建立一个模型,例如:
input1 =keras.Input (shape=(28,28))
input2 = keras.Input(shape=(28,28))
x1=keras.layers.Flatten()(input1)
x2= keras.layers.Flatten()(input2)
x=keras. layers.concatenate([x1, x2])
x=keras.layers. Dense (32,activation='relu')(x)
output = keras.layers. Dense(1,activation='sigmoid')(x)
model =keras.Model(inputs=[input1,input2],outputs=output)
model. Summary()
得到两个 input 之后,把两个x1、x2合并起来叫做x,判断两个图片是否为同一类型,是一个逻辑回归问题(是和否的问题),所以合并在一起之后,添加一个dense 层,最后添加输出层,output 输出一个概率值,输出一个值,且为逻辑回归,这样就建立好这个模型,有两个输入和一个输出,所以 inputs=[input1,input2],outputs=output。
这个 model 中间产生分叉,有两个输入,两个 flatten,有个 concatenate 合并在一起,随后变成一个 Dense,得到一个概率输出,这就是整个模型。
