欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

【Python初學】學習神經網絡的數學基礎

系統 1876 0

要理解深度學習,需要熟悉很多簡單的數學概念:張量,張量運算,微分,梯度下降等。
首先給出一個神經網絡的示例,引出張量和梯度下降的概念。
該示例神經網絡的問題是,將手寫數據的灰度圖像劃分到10個類別中,使用MNIST數據集。

            
              from keras.datasets import mnist
from keras import models
from keras import layers
from keras.utils import to_categorical


# train_images, train_labels組成測試集,模型在這些數據中進行學習。test_images, test_labels測試集中對模型進行測試。
#圖像被編碼為Numpy數組,而標簽是數字數組,取值范圍為0-9,圖像和標簽一一對應
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

network = models.Sequential()

# 層(layer)是一種數據處理模塊,進去一些數據,出來的數據變得更加有用。層從輸入數據中提取表示
# 要想訓練網絡,我們需要選擇編譯步驟的三個參數1:損失函數(loss function);2:優化器(optimizer);3:在訓練和測試過程中需要監控的指標(metric)
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))
network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

# 分類之前對數據進行的預處理
train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
network.fit(train_images, train_labels, epochs=5, batch_size=128)
test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)


            
          

神經網絡的數據表示

數據存儲在Numpy數組中,也叫張量(tensor),是數據容器。例:矩陣是二維張量。
標量
僅含一個數字的張量叫做標量,標量有0個軸(ndim == 0)。

向量
數字組成的數組叫做向量(vector)或一維張量(1D張量)

矩陣
向量組成的數組叫作矩陣(matrix)或二維張量

            
              import numpy as np
x = np.array([[5, 4, 6, 8, 9],
                      [45, 87, 22, 5, 96],
                       [98, 12, 23, 56, 43]])
print(x.ndim)
# 得到 2

            
          

關鍵屬性
張量由3個屬性來定義
軸的個數:如3D張量有3個軸,2D張量有2個軸。
形狀:如前面矩陣示例的形狀為(3,5)。向量的形狀值包含一個元素,比如(5,),而標量的形狀為空,即為()。
數據類型(在Python庫中通常叫做detype):張量類型可以是float32,uint8,float64等

            
              from keras.datasets import mnist


(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
print(train_images.ndim) # 軸的個數
print(train_images.shape) # 它的形狀
print(train_images.dtype)
# 輸出
# 3
# (60000, 28, 28)
# uint8

            
          

這里可以看出train_images是一個由8位整數組成的3D張量。更準確的說,它是60000個矩陣組成的數組,每個矩陣由28*28個整數組成。
使用Matplotlib庫來顯示這個3D張量中的第4個數字

            
              from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
print(train_images.ndim) # 軸的個數
print(train_images.shape) # 它的形狀
print(train_images.dtype)

            
          

數據批量的概念
深度學習中所有數據張量的第一軸(0軸)都是樣本軸,深度學習模型不會同時處理整個數據集,而是將數據拆分成小批量
下面代碼是MNIST數據集對的一個批量,批量大小為128。

            
              batch = train_image[:128]  #第一個軸叫批量軸,常出現在keras和其他深度學習庫中
batch = train_image[128*n:128 *(n+1)]

            
          

現實世界的張量
向量數據:2D張量,形狀(samples,features)
時間序列數據或序列數據:3D張量,形狀為(samples,timesteps,features)
圖像:4D張量,形狀為(samples,height,width,channels)
視頻:5D張量,形狀為(samples,frames,height,width,channels)
向量數據
第一個軸是樣本軸,第二個軸是特征軸
例:每個人的信息包括姓名,電話和地址,每個人可以表示包含3個值的向量,整個數據集包含200個,所以可以存儲在形狀為(200,3)的2D張量中。

張量運算

張量變形
張量變形是指改變張量的行和列,一得到想要的形狀,變形后的張量元素總數個數與初始張量相同。以下代碼了解張量變形。

            
              import numpy as np
x = np.array([[0., 1.],
             [2., 3.],
             [4., 5.]])
print(x.shape)
a = x.reshape((6, 1))
print(a)
b = x.reshape((2, 3))
print(b)

            
          

矩陣轉置也是張量變形

            
              c = np.zeros((400, 30))
c = np.transpose(c)
print(c.shape)

            
          

基于梯度的優化

根據上述給的示例,每個神經層都用下述方法對輸入數據進行變換

            
              output = relu(dot(w, input)+b)

            
          

w,b都是張量,均為該層的屬性,他們被稱為該層的權重,分別對應Kernel和bias屬性。一開始,這些權重矩陣取較小的隨機值。下一步根據反饋信號逐漸調節這些權重,這就是機器學習中的學習。
上述學習的過程一直重復,過程如下:

  1. 抽取訓練樣本x,和對應的y組成的數據批量。
  2. 在x上運行網絡(這一步叫前向傳播),得到預測值y_pred
  3. 計算網絡在這批數據上的損失,用于衡量y_pred和y之間的距離
  4. 更新網絡的所有權重,使網絡在這批數據上的損失略微下降。

最終得到的網絡在訓練數據上的損失非常小,這里會導致過擬合,一般使用優化器來解決,以后的博客來詳細介紹。
綜上所訴:

            
              train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

            
          

輸入圖像保存在float32格式的Numpy張量中,形狀分別為(60000,784)【訓練數據】和(10000,784)【測試數據】

            
              network = models.Sequential()

# 層(layer)是一種數據處理模塊,進去一些數據,出來的數據變得更加有用。層從輸入數據中提取表示
# 要想訓練網絡,我們需要選擇編譯步驟的三個參數1:損失函數(loss function);2:優化器(optimizer);3:在訓練和測試過程中需要監控的指標(metric)
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))


            
          

這個網絡包含兩個Dense層,每層對輸入數據進行一些簡單的張量運算,這些運算都包括張量權重

            
              network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

            
          

上述是網絡編譯

            
              network.fit(train_images, train_labels, epochs=5, batch_size=128)

            
          

fit過程中發生:網絡在開始訓練數據上進行迭代(每個小批量包含128個樣本),共迭代5次【在所有訓練數據上迭代一次叫做一個輪次】。在每次迭代過程中,網絡會計算批量損失相對于權重的梯度,并相應的更新權重。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美精品在线免费观看 | 精品国产91乱码一区二区三区 | 桥本有菜免费av一区二区三区 | 久草社区在线 | 一级色毛片 | 午夜影院网站 | 福利免费在线 | 91www在线观看| 狠狠色丁香婷婷综合橹不卡 | 色播开心网 | 国产精品中文字幕在线观看 | 在线看av的网址 | 午夜精品久久久久久久99黑人 | av国语| 欧美特黄a级高清免费看片 欧美精品一二区 | 久久久精品久久视频只有精品 | 九九九九九热 | 欧美一区二区三区视频 | 国产福利在线永久视频 | 波多野结衣全部系列在线观看 | 在线免费毛片 | 免费国产黄频在线观看视频 | 欧美日韩在线播放一区二区三区 | 亚洲福利 | 国产99精品 | 欧美国产日韩在线观看 | 欧美在线一区视频 | 亚洲香蕉久久一区二区三区四区 | 日韩在线精品 | 久草免费小视频 | 香蕉国产成版人视频在线观看 | 欧美日韩网址 | 成人全黄三级视频在线观看 | 久久av高清| 奇米吧| 国产日韩欧美不卡 | 欧美精品国产第一区二区 | 欧美黄色一级片视频 | 国产高清亚洲 | 日韩欧美在线免费观看 | 泰国一级毛片aaa下面毛多 |