<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【TensorFlow】筆記:模型-使用keras建立多層感知機(jī)

          共 4747字,需瀏覽 10分鐘

           ·

          2021-02-28 20:55

          點(diǎn)擊上方“公眾號(hào)”可訂閱哦!


          我們建立一個(gè)簡單的多層感知機(jī)模型來完成MNIST手寫數(shù)字圖片數(shù)據(jù)集的分類任務(wù)。


          01

          加載數(shù)據(jù)


          MNIST是一個(gè)非常有名的手寫體數(shù)字識(shí)別數(shù)據(jù)集,在很多資料中,這個(gè)數(shù)據(jù)集都會(huì)被用作深度學(xué)習(xí)的入門樣例。

          MNIST數(shù)據(jù)集共有訓(xùn)練數(shù)據(jù)60000項(xiàng)、測(cè)試數(shù)據(jù)10000項(xiàng)。每張圖像的大小為28*28(像素),每張圖像都為灰度圖像,位深度為8(灰度圖像是0-255)。


          先進(jìn)行預(yù)備工作,實(shí)現(xiàn)一個(gè)簡單的 MNISTLoader 類來讀取 MNIST 數(shù)據(jù)集數(shù)據(jù)。這里使用了 tf.keras.datasets 快速載入 MNIST 數(shù)據(jù)集。

          class MNISTLoader():    def __init__(self):        mnist = tf.keras.datasets.mnist        (self.train_data, self.train_label), (self.test_data, self.test_label) = mnist.load_data()        # MNIST中的圖像默認(rèn)為uint8(0-255的數(shù)字)。以下代碼將其歸一化到0-1之間的浮點(diǎn)數(shù),并在最后增加一維作為顏色通道        self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0, axis=-1)      # [60000, 28, 28, 1]        self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1)        # [10000, 28, 28, 1]        self.train_label = self.train_label.astype(np.int32)    # [60000]        self.test_label = self.test_label.astype(np.int32)      # [10000]        self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]
          def get_batch(self, batch_size): # 從數(shù)據(jù)集中隨機(jī)取出batch_size個(gè)元素并返回 index = np.random.randint(0, self.num_train_data, batch_size) return self.train_data[index, :], self.train_label[index]


          下圖是訓(xùn)練數(shù)據(jù)前三張:

          使用 plt.imshow() 方法進(jìn)行畫圖,該方法有個(gè)非常實(shí)用的功能,可以將灰度圖像按照灰度值的高低映射成彩色圖像,所以灰度圖看起來是彩色的。


          TensorFlow中的圖像表示:

          在 TensorFlow 中,圖像數(shù)據(jù)集的一種典型表示是 [圖像數(shù)目,長,寬,色彩通道數(shù)] 的四維張量。在上面的 DataLoader 類中, self.train_data 和 self.test_data 分別載入了 60,000 和 10,000 張大小為 28*28 的手寫體數(shù)字圖片。由于這里讀入的是灰度圖片,色彩通道數(shù)為 1(彩色 RGB 圖像色彩通道數(shù)為 3),所以我們使用 np.expand_dims() 函數(shù)為圖像數(shù)據(jù)手動(dòng)在最后添加一維通道。




          02

          建立模型


          多層感知機(jī)的模型類實(shí)現(xiàn)與上面的線性模型類似,使用 tf.keras.Model 和 tf.keras.layers 構(gòu)建,所不同的地方在于層數(shù)增加了(顧名思義,“多層” 感知機(jī)),以及引入了非線性激活函數(shù)(這里使用了 ReLU 函數(shù) , 即下方的 activation=tf.nn.relu )。該模型輸入一個(gè)向量(比如這里是拉直的 1×784 手寫體數(shù)字圖片),輸出 10 維的向量,分別代表這張圖片屬于 0 到 9 的概率。

          class MLP(tf.keras.Model):    def __init__(self):        super().__init__()        self.flatten = tf.keras.layers.Flatten()    # Flatten層將除第一維(batch_size)以外的維度展平        self.dense1 = tf.keras.layers.Dense(units=100, activation=tf.nn.relu)        self.dense2 = tf.keras.layers.Dense(units=10)
          def call(self, inputs): # [batch_size, 28, 28, 1] x = self.flatten(inputs) # [batch_size, 784] x = self.dense1(x) # [batch_size, 100] x = self.dense2(x) # [batch_size, 10] output = tf.nn.softmax(x) return output


          模型結(jié)構(gòu)



          softmax函數(shù):


          這里,因?yàn)槲覀兿M敵?“輸入圖片分別屬于 0 到 9 的概率”,也就是一個(gè) 10 維的離散概率分布,所以我們希望這個(gè) 10 維向量至少滿足兩個(gè)條件:

          • 該向量中的每個(gè)元素均在 [0, 1] 之間;

          • 該向量的所有元素之和為 1。

          為了使得模型的輸出能始終滿足這兩個(gè)條件,我們使用 Softmax 函數(shù) (歸一化指數(shù)函數(shù), tf.nn.softmax )對(duì)模型的原始輸出進(jìn)行歸一化。其形式為  。不僅如此,softmax 函數(shù)能夠凸顯原始向量中最大的值,并抑制遠(yuǎn)低于最大值的其他分量,這也是該函數(shù)被稱作 softmax 函數(shù)的原因(即平滑化的 argmax 函數(shù))。




          03

          模型的訓(xùn)練


          定義一些模型超參數(shù):

          num_epochs = 5          # 訓(xùn)練次數(shù)batch_size = 50         # 一個(gè)批次的訓(xùn)練樣本個(gè)數(shù)learning_rate = 0.001   # 學(xué)習(xí)率


          實(shí)例化模型和數(shù)據(jù)讀取類,并實(shí)例化一個(gè) tf.keras.optimizer 的優(yōu)化器(這里使用常用的 Adam 優(yōu)化器):

          model = MLP()data_loader = MNISTLoader()optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)


          然后迭代進(jìn)行以下步驟:

          • 從 DataLoader 中隨機(jī)取一批訓(xùn)練數(shù)據(jù);

          • 將這批數(shù)據(jù)送入模型,計(jì)算出模型的預(yù)測(cè)值;

          • 將模型預(yù)測(cè)值與真實(shí)值進(jìn)行比較,計(jì)算損失函數(shù)(loss)。這里使用 tf.keras.losses 中的交叉熵函數(shù)作為損失函數(shù);

          • 計(jì)算損失函數(shù)關(guān)于模型變量的導(dǎo)數(shù);

          • 將求出的導(dǎo)數(shù)值傳入優(yōu)化器,使用優(yōu)化器的 apply_gradients 方法更新模型參數(shù)以最小化損失函數(shù)。



          num_batches = int(data_loader.num_train_data // batch_size * num_epochs)for batch_index in range(num_batches):    X, y = data_loader.get_batch(batch_size)    with tf.GradientTape() as tape:        y_pred = model(X)        loss = tf.keras.losses.sparse_categorical_crossentropy(y_true=y, y_pred=y_pred)        loss = tf.reduce_mean(loss)        print("batch %d: loss %f" % (batch_index, loss.numpy()))    grads = tape.gradient(loss, model.variables)    optimizer.apply_gradients(grads_and_vars=zip(grads, model.variables))




          04

          模型的評(píng)估


          最后,我們使用測(cè)試集評(píng)估模型的性能。這里,我們使用 tf.keras.metrics 中的 SparseCategoricalAccuracy 評(píng)估器來評(píng)估模型在測(cè)試集上的性能,該評(píng)估器能夠?qū)δP皖A(yù)測(cè)的結(jié)果與真實(shí)結(jié)果進(jìn)行比較,并輸出預(yù)測(cè)正確的樣本數(shù)占總樣本數(shù)的比例。我們迭代測(cè)試數(shù)據(jù)集,每次通過 update_state() 方法向評(píng)估器輸入兩個(gè)參數(shù):y_pred 和 y_true ,即模型預(yù)測(cè)出的結(jié)果和真實(shí)結(jié)果。評(píng)估器具有內(nèi)部變量來保存當(dāng)前評(píng)估指標(biāo)相關(guān)的參數(shù)數(shù)值(例如當(dāng)前已傳入的累計(jì)樣本數(shù)和當(dāng)前預(yù)測(cè)正確的樣本數(shù))。迭代結(jié)束后,我們使用 result() 方法輸出最終的評(píng)估指標(biāo)值(預(yù)測(cè)正確的樣本數(shù)占總樣本數(shù)的比例)。

          sparse_categorical_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()num_batches = int(data_loader.num_test_data // batch_size)for batch_index in range(num_batches):    start_index, end_index = batch_index * batch_size, (batch_index + 1) * batch_size    y_pred = model.predict(data_loader.test_data[start_index: end_index])    sparse_categorical_accuracy.update_state(y_true=data_loader.test_label[start_index: end_index], y_pred=y_pred)print("test accuracy: %f" % sparse_categorical_accuracy.result())


          輸出結(jié)果:

          test accuracy: 0.973500






           END

          深度學(xué)習(xí)入門筆記

          微信號(hào):sdxx_rmbj

          日常更新學(xué)習(xí)筆記、論文簡述

          瀏覽 51
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲第九十九页 | 免费观看在线视频 | 激情综合自拍偷拍 | 北条麻妃无码91 | 超碰色色 |