Tensorflow2.1基礎知識---搭建神經網絡八股以及小案例實戰

本片文章的目的是:利用Tensorflow API tf.keras搭建網絡八股(六步法)

六步法:
  1. 導入相關的模塊,也就是 import
  2. 加載訓練集和測試集,也就是加載train(x_train數據、y_train標籤)、test(x_test數據、y_test標籤)數據
  3. 前向傳播(搭建神經網絡結構,逐層描述每層網絡),也就是model = tf.keras.models.Sequential
  4. 配置訓練時所用的方法(也就是優化器,損失函數,評測指標的選擇),也就是model.compile
  5. 進行數據的訓練(告訴訓練集和測試集的輸入特徵和標籤,batch的值,以及迭代多少次數據集),也即是model.fit
  6. 利用summary()函數打印出網絡的結構和參數統計
對上述用到的tf.keras模塊中的函數進行進一步的介紹
  1. model = tf.keras.models.Sequential([網絡結構]) #描述各層網絡
    網絡結構舉例:
    1. 拉直層:tf.keras.layers.Flatten()
    2. 全連接層:tf.keras.layers.Dense(神經元個數,activation=“激活函數”,kernel_regularizer=“正則化函數”)
      activation可選的字符串:“relu”、“softmax”、“sigmoid”、“tanh”
      kernel_regularizer可選:tf.keras.regularizers.l1()、tf.keras.regularizers.l2()
    3. 卷積層:tf.keras.layers.Conv2D(filters = 卷積核個數,kernel_size = 卷積核尺寸,strides = 卷積步長,padding = “valid”or“same”)
    4. LSTM層:tf.keras.layers.LSTM()
  2. model.compile(optimizer=優化器,loss=損失函數,metrics=[“準確率”])
    1. Optimizer可選:
      i. ‘sgd’ or tf.keras.optimizers.SGD(lr=學習率,momentum=動量參數)
      ii. 'adagrad’or tf.keras.optimizers.Adagrad(lr=學習率)
      iii. 'adadelta’or tf.keras.optimizers.Adadelta(lr=學習率)
      iv. 'adam’or tf.keras.optimizers.Adam(lr=學習率,beta_1=0.9,beta_1=0.999)
    2. loss可選:
      i. ‘mse’ or tf.keras.losses.MeanSquaredError()
      ii. ‘sparse_categorical_crossentropy’ or tf.keras.losses.SparseCategoricalCrossentropy(from_logots=False)
    3. Metrics可選:
      i. ‘accuracy’:y_和y都是數值,如y_=[1] y=[1]
      ii. ‘categorical_accuracy’:y_和y都是獨熱碼(概率分佈),如y_=[0,1,0] y=[0.256,0.695,0.048]
      iii. ‘sparse_categorical_accuracy’:y_是數值,y是獨熱碼(概率分佈),y_=[1] y=[0.256,0.695,0.048]
  3. model.fit(訓練集的輸入特徵,訓練集的標籤,batch_size=,epochs=,validation_data=(測試集的輸入特徵,測試集的標籤),validation_split=從訓練集劃分多少比例給測試集,validation_freq=多少次epoch測試一次)
  4. model.summary() 打印出網絡的結構和參數統計
案例實戰
  • 案例1:利用tf.keras實現鳶尾花分類

    import tensorflow as tf
    from sklearn import datasets
    import numpy as np
    
    x_train = datasets.load_iris().data
    y_train = datasets.load_iris().target
    
    np.random.seed(116)
    np.random.shuffle(x_train)
    np.random.seed(116)
    np.random.shuffle(y_train)
    tf.random.set_seed(116)
    
    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(3,activation = 'softmax',kernel_regularizer = tf.keras.regularizers.l2())
    ])
    
    model.compile(optimizer = tf.keras.optimizers.SGD(lr = 0.1),
                 loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = False),
                 metrics = ['sparse_categorical_accuracy'])
    
    model.fit(x_train,y_train,batch_size = 32,epochs = 500,validation_split = 0.2,validation_freq = 20)
    
    model.summary()
    

    將上述代碼封裝成class

    import tensorflow as tf
    from tensorflow.keras.layers import Dense
    from tensorflow.keras import Model
    from sklearn import datasets
    import numpy as np
    
    x_train = datasets.load_iris().data
    y_train = datasets.load_iris().target
    
    np.random.seed(116)
    np.random.shuffle(x_train)
    np.random.seed(116)
    np.random.shuffle(y_train)
    tf.random.set_seed(116)
    
    class IrisModel(Model):
        def __init__(self):
            super(IrisModel,self).__init__()
            self.dl = Dense(3,activation = 'sigmoid',kernel_regularizer = tf.keras.regularizers.l2())
        def call(self,x):
            y = self.dl(x)
            return y
        
    model = IrisModel()
    
    model.compile(optimizer = tf.keras.optimizers.SGD(lr = 0.1),
                 loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = False),
                 metrics = ['sparse_categorical_accuracy'])
    
    model.fit(x_train,y_train,batch_size = 32,epochs = 500,validation_split = 0.2,validation_freq = 20)
    
    model.summary()
    
  • 案例2:利用tf.keras實現mnist手寫數字識別

    import tensorflow as tf
    
    mnist = tf.keras.datasets.mnist
    (x_train,y_train),(x_test,y_test) = mnist.load_data()
    x_train,x_test = x_train / 255.0,x_test / 255.0
    
    model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(128,activation = 'relu'),
        tf.keras.layers.Dense(10,activation = 'softmax')
    ])
    
    model.compile(optimizer = 'adam',
                 loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = False),
                 metrics = ['sparse_categorical_accuracy'])
    
    model.fit(x_train,y_train,batch_size = 32,epochs = 5,validation_data = (x_test,y_test),validation_freq=1)
    model.summary()
    

    將上述代碼封裝成class

    import tensorflow as tf
    from tensorflow.keras.layers import Dense,Flatten
    from tensorflow.keras import Model
    
    mnist = tf.keras.datasets.mnist
    (x_train,y_train),(x_test,y_test) = mnist.load_data()
    x_train,x_test = x_train / 255.0,x_test / 255.0
    
    class MnistModel(Model):
        def __init__(self):
            super(MnistModel,self).__init__()
            self.flatten = Flatten()
            self.d1 = Dense(128,activation = 'relu')
            self.d2 = Dense(10,activation = 'softmax')
        def call(self,x):
            x = self.flatten(x)
            x = self.d1(x)
            y = self.d2(x)
            return y
        
    model = MnistModel()
    
    model.compile(optimizer = 'adam',
                 loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = False),
                 metrics = ['sparse_categorical_accuracy'])
    
    model.fit(x_train,y_train,batch_size = 32,epochs = 5,validation_data = (x_test,y_test),validation_freq=1)
    model.summary()
    
下面的是筆者的微信公衆號,歡迎關注,會持續更新c++、python、tensorflow、機器學習、深度學習等系列文章

                      在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章