TensorFlow2.0——Sequential模型與函數式API構建神經網絡結構


一、數據集與模型的介紹

  數據集的來源是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構建神經網絡機構進行一個步驟總結:

  1. model=tf.keras.Sequential()封裝一個神經網絡結構,model.summary()用來查看模型結構。
  2. .compile()方法編譯模型。
  3. .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的流程:

  1. 定義輸入net_input=tf.keras.Input()類,設定輸入的shape。
  2. 用函數式API構建網絡結構,如l1=tf.keras.layers.Flatten()(net_input),最后得到輸出層net_output
  3. 創建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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM