企業(yè)做門戶網(wǎng)站的重要性google搜索優(yōu)化方法
?深度學(xué)習(xí)初級(jí)課程
- 1.單一神經(jīng)元
- 2.深度神經(jīng)網(wǎng)絡(luò)
- 3.隨機(jī)梯度下降法
- 4.過(guò)擬合和欠擬合
- 5.剪枝、批量標(biāo)準(zhǔn)化
- 6.二分類
?
前言
本套課程仍為 kaggle 課程《Intro to Deep Learning》,仍按之前《機(jī)器學(xué)習(xí)》系列課程模式進(jìn)行。前一系列《Keras入門教程》內(nèi)容,與本系列有部分重復(fù)內(nèi)容,但重點(diǎn)在于快速入門深度學(xué)習(xí)中的keras 使用,即從代碼入手,快速掌握代碼的使用,原理講得很少。
從原理入手,一步一代碼,如果進(jìn)行建模型的整個(gè)過(guò)程。
內(nèi)容
歡迎來(lái)到深度學(xué)習(xí)!
歡迎來(lái)到 kaggle 的深度學(xué)習(xí)課程介紹!你就要學(xué)會(huì)開始構(gòu)建自己的深度神經(jīng)網(wǎng)絡(luò)所需的一切。使用Keras和Tensorflow,您將學(xué)習(xí)如何:
- 創(chuàng)建一個(gè)完全連接的神經(jīng)網(wǎng)絡(luò)架構(gòu)
- 將神經(jīng)網(wǎng)絡(luò)應(yīng)用于兩個(gè)經(jīng)典的機(jī)器學(xué)習(xí)問(wèn)題:回歸和分類
- 用隨機(jī)梯度下降法訓(xùn)練神經(jīng)網(wǎng)絡(luò),以及
- 通過(guò)剪枝、批量標(biāo)準(zhǔn)化和其他技術(shù)提高性能
什么是深度學(xué)習(xí)?
近年來(lái),人工智能領(lǐng)域最令人印象深刻的一些進(jìn)展是在深度學(xué)習(xí)領(lǐng)域。自然語(yǔ)言翻譯、圖像識(shí)別和游戲都是深度學(xué)習(xí)模型接近甚至超過(guò)人類水平的任務(wù)。
那么什么是深度學(xué)習(xí)呢?深度學(xué)習(xí)是一種機(jī)器學(xué)習(xí)方法,其特點(diǎn)是計(jì)算量大。這種計(jì)算深度使深度學(xué)習(xí)模型能夠解開在最具挑戰(zhàn)性的現(xiàn)實(shí)世界數(shù)據(jù)集中發(fā)現(xiàn)的各種復(fù)雜和分層模式。
神經(jīng)網(wǎng)絡(luò)憑借其強(qiáng)大的功能和可擴(kuò)展性,已經(jīng)成為深度學(xué)習(xí)的定義模型。神經(jīng)網(wǎng)絡(luò)由神經(jīng)元組成,每個(gè)神經(jīng)元單獨(dú)執(zhí)行一個(gè)簡(jiǎn)單的計(jì)算。神經(jīng)網(wǎng)絡(luò)的力量來(lái)自于這些神經(jīng)元所能形成的復(fù)雜連接。
線性單位
讓我們從神經(jīng)網(wǎng)絡(luò)的基本組成部分開始:單個(gè)神經(jīng)元。如圖所示,只有一個(gè)輸入的神經(jīng)元(或單元)如下所示:
線性單位:y = w x + b
輸入是 x ,它與神經(jīng)元的連接有一個(gè)權(quán)重(weight),即w 。每當(dāng)一個(gè)值流經(jīng)一個(gè)連接時(shí),你就用該連接的權(quán)重乘以該值。對(duì)于輸入x ,到達(dá)神經(jīng)元的是w ? x 。神經(jīng)網(wǎng)絡(luò)通過(guò)修改其權(quán)重來(lái)“學(xué)習(xí)”。
b 是一種特殊的權(quán)重,我們稱之為偏差(bias)。偏差沒(méi)有任何與之相關(guān)的輸入數(shù)據(jù);相反,我們把1 放在圖中,這樣到達(dá)神經(jīng)元的值就是b (因?yàn)? ? b = b )。偏壓使神經(jīng)元能夠獨(dú)立于輸入修改輸出。
y是神經(jīng)元最終輸出的值。為了得到輸出,神經(jīng)元將通過(guò)其連接接收到的所有值相加。這個(gè)神經(jīng)元的激活是y = w ? x + b ,或者用公式y(tǒng) = w x + b 。
公式 y = w x + b 看起來(lái)熟悉嗎?
這是一個(gè)直線方程,這是斜率截距方程,其中w 是斜率,b 是y截距。
示例-線性單元作為模型
雖然單個(gè)神經(jīng)元通常只作為更大網(wǎng)絡(luò)的一部分發(fā)揮作用,但從單個(gè)神經(jīng)元模型開始作為基線通常是有用的。單神經(jīng)元模型就是線性模型。
讓我們思考一下,這在80種谷物這樣的數(shù)據(jù)集上是如何工作的。訓(xùn)練一個(gè)以“糖”(每份糖的克數(shù))為輸入,以“卡路里”(每份卡路里)為輸出的模型,我們可能會(huì)發(fā)現(xiàn)偏差為 b = 90,重量為 w = 2.5。我們可以這樣估計(jì)每餐含5克糖的谷物的卡路里含量:
而且,對(duì)照我們的配方,我們的卡路里 = 2.5 × 5 + 90 = 102.5 ,就像我們預(yù)期的那樣。
多輸入
80 谷物數(shù)據(jù)集的功能遠(yuǎn)不止“糖”。如果我們想把模型擴(kuò)展到包括纖維或蛋白質(zhì)含量這樣的東西呢?這很容易。我們可以給神經(jīng)元增加更多的輸入連接,每增加一個(gè)功能就增加一個(gè)。為了找到輸出,我們將每個(gè)輸入乘以其連接權(quán)重,然后將它們相加。
三個(gè)輸入連接:x 0 、x 1 和 x 2 ,以及偏置b。
有三個(gè)輸入的線性單元。
這個(gè)神經(jīng)元的公式是y = w 0 x 0 + w 1 x 1 + w 2 x 2 + b 具有兩個(gè)輸入的線性單元將適合一個(gè)平面,而具有更多輸入的單元將適合一個(gè)超平面。
Keras中的線性單位
在Keras中創(chuàng)建模型的最簡(jiǎn)單方法是通過(guò)Keras的?Sequential
,它創(chuàng)建一個(gè)神經(jīng)網(wǎng)絡(luò)作為一個(gè)層堆棧。我們可以使用密集層(我們將在下一節(jié)中了解更多)創(chuàng)建類似上述模型的模型。
我們可以定義一個(gè)線性模型,接受三個(gè)輸入特征(“糖sugars
”、“纖維fiber
”和“蛋白質(zhì)protein
”),并產(chǎn)生單一輸出(“卡路里calories
”),如下所示:
from tensorflow import keras
from tensorflow.keras import layers# Create a network with 1 linear unit
model = keras.Sequential([layers.Dense(units=1, input_shape=[3])
])
通過(guò)第一個(gè)參數(shù)units,我們定義了需要多少輸出。在這種情況下,我們只是預(yù)測(cè)“卡路calories”,所以我們將使用units=1。對(duì)于第二個(gè)參數(shù)input_shape,我們告訴Keras輸入的維度。設(shè)置input_shape=[3]可確保模型將接受三個(gè)特征作為輸入(“糖”、“纖維”和“蛋白質(zhì)”)。
這個(gè)模型現(xiàn)在可以適應(yīng)訓(xùn)練數(shù)據(jù)了!
為什么input_shape是Python列表?
我們將在本課程中使用的數(shù)據(jù)是表格數(shù)據(jù),比如熊貓數(shù)據(jù)框。對(duì)于數(shù)據(jù)集中的每個(gè)功能,我們將有一個(gè)輸入。這些特性是按列排列的,所以我們總是有input_shape=[num_columns]。Keras在這里使用列表的原因是允許使用更復(fù)雜的數(shù)據(jù)集。例如,圖像數(shù)據(jù)可能需要三個(gè)維度:[高度、寬度、通道]。
輪到你了
為紅酒質(zhì)量數(shù)據(jù)集定義一個(gè)線性模型。
練習(xí)部分
介紹
在教程中,我們學(xué)習(xí)了神經(jīng)網(wǎng)絡(luò)的構(gòu)建模塊:線性單元。我們看到,只有一個(gè)線性單元的模型將線性函數(shù)擬合到數(shù)據(jù)集(相當(dāng)于線性回歸)。在本練習(xí)中,您將構(gòu)建一個(gè)線性模型,并在Keras中練習(xí)使用模型。
在開始之前,運(yùn)行下面的代碼單元來(lái)設(shè)置所有內(nèi)容。
# Setup plotting
import matplotlib.pyplot as pltplt.style.use('seaborn-whitegrid')
# Set Matplotlib defaults
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',titleweight='bold', titlesize=18, titlepad=10)# Setup feedback system
from learntools.core import binder
binder.bind(globals())
from learntools.deep_learning_intro.ex1 import *
紅酒質(zhì)量數(shù)據(jù)集由大約1600種葡萄牙紅酒的理化測(cè)量數(shù)據(jù)組成。此外,還包括盲品測(cè)試中每種葡萄酒的質(zhì)量評(píng)級(jí)。
首先,運(yùn)行下一個(gè)單元格以顯示此數(shù)據(jù)集的前幾行。
import pandas as pd
?
red_wine = pd.read_csv('../input/dl-course-data/red-wine.csv')
red_wine.head()
可以使用shape屬性獲取數(shù)據(jù)幀(或Numpy數(shù)組)的行數(shù)和列數(shù)。
red_wine.shape # (rows, columns)
(1599, 12)
1) 輸入維度
通過(guò)理化測(cè)量,我們能很好地預(yù)測(cè)葡萄酒的感知質(zhì)量嗎?
目標(biāo)是“質(zhì)量”,剩下的列是特性。在這項(xiàng)任務(wù)中,如何設(shè)置Keras模型的input_shape
參數(shù)?
# YOUR CODE HERE
input_shape = ____# Check your answer
q_1.check()
2) 定義一個(gè)線性模型
現(xiàn)在定義一個(gè)適合此任務(wù)的線性模型。注意模型應(yīng)該有多少輸入和輸出。
from tensorflow import keras
from tensorflow.keras import layers# YOUR CODE HERE
model = ____# Check your answer
q_2.check()
3) 查看權(quán)重
在內(nèi)部,Keras用張量表示神經(jīng)網(wǎng)絡(luò)的權(quán)重。張量基本上是TensorFlow版本的Numpy數(shù)組,有一些差異使它們更適合深度學(xué)習(xí)。其中最重要的一點(diǎn)是張量與GPU(GPU)和TPU(TPU)加速器兼容。事實(shí)上,TPU是專門為張量計(jì)算而設(shè)計(jì)的。
模型的權(quán)重作為張量列表保存在其權(quán)重屬性中。獲取上面定義的模型的權(quán)重。
# YOUR CODE HERE
w, b = w, b = _____
?
# Check your answer
q_3.check()
Weights
<tf.Variable 'dense/kernel:0' shape=(11, 1) dtype=float32, numpy=
array([[ 0.54436415],[-0.14202559],[ 0.6889222 ],[ 0.2318945 ],[-0.6457067 ],[ 0.40594786],[ 0.04871047],[-0.20195675],[ 0.20735556],[ 0.13860786],[-0.18090099]], dtype=float32)>Bias
<tf.Variable 'dense/bias:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>
正確:你看到每個(gè)輸入都有一個(gè)權(quán)重(和一個(gè)偏差)了嗎?但是請(qǐng)注意,權(quán)重值似乎沒(méi)有任何模式。在訓(xùn)練模型之前,權(quán)重設(shè)置為隨機(jī)數(shù)(偏差設(shè)置為0.0)。神經(jīng)網(wǎng)絡(luò)通過(guò)尋找更好的權(quán)值進(jìn)行學(xué)習(xí)。
(順便說(shuō)一句,Keras將權(quán)重表示為張量,但也使用張量表示數(shù)據(jù)。當(dāng)您設(shè)置input_shape參數(shù)時(shí),您告訴Keras它應(yīng)該為訓(xùn)練數(shù)據(jù)中的每個(gè)示例預(yù)期的數(shù)組維度。設(shè)置input_shape=[3]將創(chuàng)建一個(gè)接受長(zhǎng)度為3的向量的網(wǎng)絡(luò),如[0.2,0.4,0.6])
可選:繪制未經(jīng)訓(xùn)練的線性模型的輸出
我們將在第5課中學(xué)習(xí)的這類問(wèn)題是回歸問(wèn)題,目標(biāo)是預(yù)測(cè)一些數(shù)值目標(biāo)?;貧w問(wèn)題就像“曲線擬合”問(wèn)題:我們?cè)噲D找到一條最適合數(shù)據(jù)的曲線。讓我們看看線性模型產(chǎn)生的“曲線”。(你可能已經(jīng)猜到這是一條線了!)
我們提到,在訓(xùn)練之前,模型的權(quán)重是隨機(jī)設(shè)置的。運(yùn)行下面的單元格幾次,查看隨機(jī)初始化生成的不同行。(這個(gè)練習(xí)沒(méi)有編碼——只是一個(gè)演示。)
import tensorflow as tf
import matplotlib.pyplot as pltmodel = keras.Sequential([layers.Dense(1, input_shape=[1]),
])x = tf.linspace(-1.0, 1.0, 100)
y = model.predict(x)plt.figure(dpi=100)
plt.plot(x, y, 'k')
plt.xlim(-1, 1)
plt.ylim(-1, 1)
plt.xlabel("Input: x")
plt.ylabel("Target y")
w, b = model.weights # you could also use model.get_weights() here
plt.title("Weight: {:0.2f}\nBias: {:0.2f}".format(w[0][0], b[0]))
plt.show()
繼續(xù)前進(jìn)
在第2課中添加隱藏層并使模型深入。
答案
# 1)輸入維度
input_shape = [11]
# you could also use a 1-tuple, like input_shape = (11,)
# 也可以輸入元組模式# 2)定義線性模型
from tensorflow import keras
from tensorflow.keras import layersmodel = keras.Sequential([layers.Dense(units=1, input_shape=[11])
])# 3)查看權(quán)重
w, b = model.weights
print("Weights\n{}\n\nBias\n{}".format(w, b))