深度學(xué)習(xí)的核心是算法的設(shè)計(jì)思想第献,深度學(xué)習(xí)框架只是我們實(shí)現(xiàn)算法的工具庸毫。下面我來介紹一下三大核心功能
- 加速計(jì)算
神經(jīng)網(wǎng)絡(luò)本質(zhì)上由大量的矩陣相乘衫樊、矩陣相加等基本數(shù)學(xué)運(yùn)算構(gòu)成,Tensorflow等重要功能就是利用GPU方便地實(shí)現(xiàn)并行計(jì)算加速功能橡伞。為了演示GPU的加速效果晋被,我將通過完成多次矩陣A和矩陣B的矩陣相乘運(yùn)算,并測量其平均運(yùn)算時間來比對挂脑。其中矩陣A的shape為[1,n],矩陣B的shape為[n,1],通過調(diào)節(jié)n即可控制矩陣的大小崭闲。
首先我們分別創(chuàng)建使用CPU和GPU環(huán)境運(yùn)算的2個矩陣
#創(chuàng)建在CPU環(huán)境上運(yùn)算的2個矩陣
with tf.device('/cpu:0')
cpu_a = tf.random.normal([1,n])
cpu_b = tf.random.normal([n,1])
print(cpu_a.device,cpu_b.device)
#創(chuàng)建使用GPU環(huán)境運(yùn)算的2個矩陣
with tf.device('/gpu:0')
gpu_a = tf.random.normal([1,n])
gpu_b = tf.random.normal([n,1])
print(gpu_a.device,gpu_b.device)
接下來實(shí)現(xiàn)CPU和GPU運(yùn)算的函數(shù)刁俭,并通過timeit.timeit()函數(shù)來測量兩個函數(shù)的運(yùn)算時間。需要注意的是牍戚,第一次計(jì)算時一般需要完成額外的環(huán)境初始化工作,因此這段時間不能計(jì)算在內(nèi)宪哩。我們通過熱身環(huán)節(jié)將這段時間去除第晰,再測量預(yù)算時間
def cpu_run():
with tf.device('/cpu:0')
c = tf.matmul(cpu_a,cpu_b)
return c
def gpu_run():
with tf.device('/gpu:0')
c = tf.matmul(gpu_a,gpu_b)
return c
#第一次計(jì)算需要熱身,避免將初始化時間結(jié)算在內(nèi)
cpu_time = timeit.timeit(cpu_run,number=10)
gpu_time = timeit.timeit(gpu_run,number=10)
print('warmup:',cpu_time,gpu_time)
#正式計(jì)算10次品抽,取平均時間
cpu_time = timeit.timeit(cpu_run(),number=10)
gpu_time = timeit.timeit(gpu_run(),number=10)
print('run time:',cpu_time,gpu_time)
我們將不同大小n下的cpu和gpu環(huán)境的運(yùn)算時間繪制為曲線甜熔。
- 自動梯度
在使用Tensorflow構(gòu)建前向計(jì)算過程的時候,除了能夠獲得數(shù)值結(jié)果哑了,Tensorflow還會自動構(gòu)建計(jì)算圖烧颖,通過Tensorflow提供的自動求導(dǎo)的功能,可以不需要手動推導(dǎo)炕淮,即可計(jì)算輸出對網(wǎng)絡(luò)參數(shù)的偏導(dǎo)數(shù)∶蔷担考慮如下表達(dá)式:
y = aw^2 + bw +c, 輸出y對于變量w的導(dǎo)數(shù)關(guān)系為:dy/dw = 2aw+b润歉,考慮在(a,b,c,w) = (1,2,3,4)處的導(dǎo)數(shù),代入上面的式子可得:dy/dw = 214 + 2 = 10.
通過Tensorflow方式嚼鹉,可以不需要手動推導(dǎo)導(dǎo)數(shù)的表達(dá)式,直接給出函數(shù)的表達(dá)式锚赤,即可由Tensorflow自動求導(dǎo)
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' #忽略CPU與tensorflow版本問題
import tensorflow as tf
#創(chuàng)建4個張量,并賦值
a = tf.constant(1.)
b = tf.constant(2.)
c = tf.constant(3.)
w = tf.constant(4.)
with tf.GradientTape()as tape:#構(gòu)建梯度環(huán)境
tape.watch([w])#將w加入梯度跟蹤列表
#構(gòu)建計(jì)算過程赐稽,即函數(shù)表達(dá)式
y = a * w**2 + b * w +c
#自動求導(dǎo)
[dy_dw] = tape.gradient(y,[w])
print(dy_dw)
- 常用神經(jīng)網(wǎng)絡(luò)接口
TensorFlow 除了提供底層的矩陣相乘浑侥、相加等數(shù)學(xué)函數(shù),還內(nèi)建了常用神經(jīng)網(wǎng)絡(luò)運(yùn)算 函數(shù)蠢莺、常用網(wǎng)絡(luò)層零如、網(wǎng)絡(luò)訓(xùn)練、模型保存與加載考蕾、網(wǎng)絡(luò)部署等一系列深度學(xué)習(xí)系統(tǒng)的便捷 功能。使用 TensorFlow 開發(fā)蚯窥,可以方便地利用這些功能完成常用業(yè)務(wù)流程塞帐,高效穩(wěn)定。