一、數據集與模型的介紹
數據集的來源是Fashion MNIST數據集,Fashion MNIST是衣物圖數據,該數據集包含 10 個類別的 70,000 個灰度圖像。我們用這個數據構建一個神經網絡模型,並訓練它,模型的結構為input=784,layer1=128,output=10。
數據集的圖像以低分辨率(28x28 像素)展示了單件衣物,如下所示:

二、Sequential序列化模型
1、網絡結構的構建
tensorflow中構建網絡結構的方法之一就是利用Sequential序列化模型,Sequential可以認為是一個序列容器,里面封裝了神經網絡的結構。下面來看一下實例代碼:
# 用keras.Sequential構建神經網絡的結構,方法一,用列表直接構建 model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), # 輸入圖片的像素是28*28,將其轉化為1維作為輸入 tf.keras.layers.Dense(128, activation='relu'), # 隱藏層128個神經元 tf.keras.layers.Dense(10) # 輸出為10個類別,這里不用激活函數,是為了后續計算損失時用softmax與 ]) # 用keras.Sequential構建神經網絡的結構,方法二,用add()方法加入神經網絡層 model=tf.keras.Sequential() model.add(tf.keras.layers.Flatten(input_shape=(28, 28))) model.add(tf.keras.layers.Dense(128, activation='relu')) model.add(tf.keras.layers.Dense(10))
上面就是用tf.keras.Sequential封裝,用tf.keras.layers構建網絡層,下面介紹一下這兩個函數:
1)、tf.keras.Sequential(layers=None,name=None)
- layers:一個tf.keras.layers的list或者tuple。
用來創建一個Sequential的模型。可以用add()方法加入層結構,summary()方法查看模型結構。
2)、tf.keras.layers.Flatten(input_shape)
- input_shape:輸入的形狀。
用來將多維數據轉化為一位數據,相當於numpy的np.reval()函數。
3)、tf.keras.layers.Dense(units,activation)
- units:隱藏層神經元的個數
- activation:激活函數
用來構建隱藏層、輸出層的內部結構,還有其他詳細參數可以查看官方說明。
2、查看模型結構
當我們創建好模型之后,最好能查看模型的網絡結構是怎么樣子的,這時候就有一個方法tf.keras.Sequential().summary()就可以查看我們模型的結構。
現在用代碼構建一個模型並查看他的結構:
# 用keras.Sequential構建神經網絡的結構,方法二,用add()方法加入神經網絡層 model=tf.keras.Sequential(layers=None,name=None) model.add(tf.keras.layers.Flatten(input_shape=(28, 28))) model.add(tf.keras.layers.Dense(128, activation='relu')) model.add(tf.keras.layers.Dense(10)) # 輸出網絡結果情況 model.summary()
輸出結果:
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= flatten (Flatten) (None, 784) 0 _________________________________________________________________ dense (Dense) (None, 128) 100480 _________________________________________________________________ dense_1 (Dense) (None, 10) 1290 ================================================================= Total params: 101,770 Trainable params: 101,770 Non-trainable params: 0 _________________________________________________________________
3、編譯模型
模型的結構構建好之后,我們還需要構建模型的訓練內容,如:優化器、損失函數、評估准則,這時候可以用complie()方法來編譯
# 用sequential類的compile方法編譯模型:優化器為adam, model.compile( optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), # from_logits=True表示損失是經過softmax函數的 metrics=['accuracy'] # 評價方法為准確度 )
4、傳入訓練數據訓練模型
模型編譯好之后就可以對模型進行訓練,模型訓練的使用的是fit()方法。fit()方法可以對模型訓練時的epoch、batch、validation_data進行調整。
# 訓練模型,通過fit方法傳入數據進行訓練,訓練10代,每代批次大小為200,每批次取訓練集0.1的數據做驗證集 model.fit(x=train_images, y=train_labels, epochs=10,batch_size=200,validation_split=0.1)
三、Sequential構建模型總結
下面對Sequential構建神經網絡機構進行一個步驟總結:
- model=tf.keras.Sequential()封裝一個神經網絡結構,model.summary()用來查看模型結構。
- .compile()方法編譯模型。
- .fit()方法對模型進行訓練。
四、函數式API
1、什么是函數式API
函數式API構建模型是一種比較推薦的方法,相較於Sequential方法來說更加靈活,Sequential方法只有一個輸入一個輸出,且隱藏層的輸入必須是要順序的,當我們有多輸出多輸出,或者引入殘差網絡的時候,這個方法就不好實現了,為此tensorflow提供了函數式API。
為什么稱之為函數式API呢?首先python里面有一個功能叫類的調用,就是定義一個類的時候,我們定義這個類內的函數__call__(),當我們聲明這個類的時候,就可以像函數一樣調用這個類。如下:
class can_call: def __init__(self,name='can_call'): self.name=name def __call__(self): print('my name is %s'%self.name) myclass=can_call() myclass() # 輸出結果為 : my name is can_call
我們在Sequential中頂一個各個層,如tf.keras.layers.Dense()是一個類,同樣可以實現類的調用,相當於函數的調用,這就是所謂的函數式API。
2、函數式API的實現
函數式API需要定義一個輸入類tf.keras.Input(),主要其參數如下:
tf.keras.Input( shape=None, batch_size=None, name=None, dtype=None, sparse=False, tensor=None, **kwargs )
- shape:形狀元組(整數),不包括批量大小.例如,shape=(32,),表示預期的輸入將是32維向量的批次
- batch_size:可選的靜態批量大小(整數)
- name:圖層的可選名稱字符串.在模型中應該是唯一的(不要重復使用相同的名稱兩次).如果未提供,它將自動生成
- dtype:數據類型由輸入預期的,作為字符串(float32,float64,int32...)
- sparse:一個布爾值,指定是否創建占位符是稀疏的
- tensor:可選的現有張量包裹到Input圖層中.如果設置,圖層將不會創建占位符張量
- **kwargs:不支持的參數
函數式API的流程:
- 定義輸入net_input=tf.keras.Input()類,設定輸入的shape。
- 用函數式API構建網絡結構,如l1=tf.keras.layers.Flatten()(net_input),最后得到輸出層net_output
- 創建Model類,並傳入輸出與輸出,如tf.keras.Model(inputs=net_input,outputs=net_output)
import tensorflow as tf import os import numpy as np # 讀取數據集 (train_images,train_labels),(test_images,test_labels)=tf.keras.datasets.fashion_mnist.load_data() # 定義一個模型的輸入,shape輸入為元祖,不包含批次數,向量的輸入形狀為(n,),矩陣的輸入為(n,m) net_input=tf.keras.Input(shape=(28,28),) # 所謂的函數式API就是我們把每一層layer類都當層一個函數,可以調用,如下面的代碼就調用了tf.keras.layers.Flatten() # 建立模型結構,這里只是建立結構,不創建模型類,在L2層實現一個droupout x=tf.keras.layers.Flatten()(net_input) # 將圖片數據由二維平整化為一維 l1=tf.keras.layers.Dense(64,activation='relu',name='layer1')(x) l2_dropout=tf.keras.layers.Dropout(0.5)(l1) l2=tf.keras.layers.Dense(32,activation='relu',name='layer2')(l2_dropout) net_output=tf.keras.layers.Dense(10,activation='softmax',name='net_output')(l2) # 創建模型類 model=tf.keras.Model(inputs=net_input,outputs=net_output) # 查看模型的結構 model.summary()
