要理解深度學習,需要熟悉很多簡單的數學概念:張量,張量運算,微分,梯度下降等。
首先給出一個神經網絡的示例,引出張量和梯度下降的概念。
該示例神經網絡的問題是,將手寫數據的灰度圖像劃分到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屬性。一開始,這些權重矩陣取較小的隨機值。下一步根據反饋信號逐漸調節這些權重,這就是機器學習中的學習。
上述學習的過程一直重復,過程如下:
- 抽取訓練樣本x,和對應的y組成的數據批量。
- 在x上運行網絡(這一步叫前向傳播),得到預測值y_pred
- 計算網絡在這批數據上的損失,用于衡量y_pred和y之間的距離
- 更新網絡的所有權重,使網絡在這批數據上的損失略微下降。
最終得到的網絡在訓練數據上的損失非常小,這里會導致過擬合,一般使用優化器來解決,以后的博客來詳細介紹。
綜上所訴:
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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
