深度學(xué)習(xí)初體驗(yàn)
第1關(guān):什么是神經(jīng)網(wǎng)絡(luò)
第一題
神經(jīng)網(wǎng)絡(luò)中也有神經(jīng)元,這些神經(jīng)元也會與其他神經(jīng)元相連接,這樣就形成了神經(jīng)網(wǎng)絡(luò),而且這種網(wǎng)絡(luò)我們稱之為全連接網(wǎng)絡(luò)。如下圖所示(方塊表示神經(jīng)元):
從圖可以看出,神經(jīng)網(wǎng)絡(luò)由一層一層的神經(jīng)元所構(gòu)成的,并且不同的層有不同的名字。其中輸入層表示用來接收數(shù)據(jù)輸入的一組神經(jīng)元。輸出層表示用來輸出的一組神經(jīng)元。隱藏層表示介于輸入層與輸出層之間的一組神經(jīng)元。
第二題
如果我們搭積木搭得很高就變成了高樓大廈,同樣,如果我們神經(jīng)網(wǎng)絡(luò)的層數(shù)比較多,我們就成為這樣的神經(jīng)網(wǎng)絡(luò)為深層神經(jīng)網(wǎng)絡(luò)。如果我們用深層神經(jīng)網(wǎng)絡(luò)來完成我們想要的功能,我們就叫它為深度學(xué)習(xí)。
第三題
ReLU(11)=max(0,11)=11
第四題
如果我們神經(jīng)網(wǎng)絡(luò)的層數(shù)比較多,我們就成為這樣的神經(jīng)網(wǎng)絡(luò)為深層神經(jīng)網(wǎng)絡(luò)。如果我們用深層神經(jīng)網(wǎng)絡(luò)來完成我們想要的功能,我們就叫它為深度學(xué)習(xí)。
含有1層隱藏層的神經(jīng)網(wǎng)絡(luò)層數(shù)太少,并不是深層神經(jīng)網(wǎng)絡(luò)。
第2關(guān):反向傳播
第一,二題
神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程就是不斷地尋找合適的 W 和 b 來讓預(yù)測輸出與真實(shí)標(biāo)簽之間差異最小的過程。那么我們可以將訓(xùn)練過程拆開來看,首先我們需要能夠衡量預(yù)測輸出和真實(shí)標(biāo)簽之間的差異,其次我們需要能夠不斷地優(yōu)化 W 和 b 使得預(yù)測輸出與真實(shí)標(biāo)簽之間地差異變小。
首先,想要衡量差異,我們可以將預(yù)測輸出和真實(shí)標(biāo)簽輸入到一個函數(shù)中,然后通過這個函數(shù)的計(jì)算來量化差異的大小。像這種函數(shù)我們稱之為損失函數(shù)。損失函數(shù)的種類有很多,比如面對分類問題時,通常使用交叉熵?fù)p失、面對回歸問題時通常使用均方誤差等。總之可以看成是一個能夠量化差異的黑盒子,而且量化出的差異值越小,代表我們的神經(jīng)網(wǎng)絡(luò)的預(yù)測輸出越準(zhǔn)確。
其次,我們需要找出 W 和 b 來讓差異最小,這個時候我們會使用梯度下降算法來迭代更新 W 和 b 。梯度下降算法的思想是,讓 W 和 b 朝著讓差異值變小的大體方向來更新,而大體方向怎樣獲取,就需要計(jì)算 W 和 b 對于損失函數(shù)的偏導(dǎo)(梯度)。但由于計(jì)算 W 和 b 對于損失函數(shù)的偏導(dǎo)需要知道 W 和 b 對于神經(jīng)元中線性計(jì)算部分的偏導(dǎo)和線性計(jì)算部分對于損失函數(shù)的偏導(dǎo)。所以就有了反向傳播算法。
第三題
神經(jīng)網(wǎng)絡(luò)和其他機(jī)器學(xué)習(xí)算法一樣,同樣有訓(xùn)練和預(yù)測的過程。如果用一句話來概括的話就是預(yù)測過程為前向傳播的過程,訓(xùn)練過程為重復(fù)前向傳播加反向傳播的過程。
第3關(guān):動手實(shí)現(xiàn)CNN識別手寫數(shù)字
想要 add 一層卷積層,代碼如下:
from keras.layers import Conv2D
model = Sequential()
'''
16表示該卷積層有16個卷積核
kernel_size=3表示卷積核的大小為3*3
activation='relu'表示卷積層的激活函數(shù)是relu
input_shape=[IMAGE_HEIGHT, IMAGE_WIDTH, 3]表示待卷積圖像為32*32的3通道圖像
'''
model.add(Conv2D(16, kernel_size=3, activation='relu', input_shape=[32, 32, 3]))
想要 add 一層最大池化層,代碼如下:
from keras.layers import Conv2D
model = Sequential()
'''
pool_size=2表示池化窗口的大小為2*2
'''
model.add(MaxPooling2D(pool_size=2))
想要 add 一層扁平層,代碼如下:
from keras.layers import Conv2D
model = Sequential()
'''
卷積或者池化后想要接上全連接層之前需要接入扁平層
'''
model.add(Flatten())
所以,如果想要構(gòu)建如下結(jié)構(gòu)的卷積神經(jīng)網(wǎng)絡(luò),可以編寫如下代碼:
# 1.有32個5*5的神經(jīng)元的卷積層,激活函數(shù)為relu,輸入的數(shù)據(jù)為寬28高28的灰度圖像
# 2.有64個5*5的神經(jīng)元的卷積層,激活函數(shù)為relu
# 3.最大池化層,池化核大小為2*2
# 4.扁平
# 5.有128個神經(jīng)元的全連接層,激活函數(shù)為relu
# 6.有10個神經(jīng)元的全連接層,激活函數(shù)為softmax
model = Sequential()
model.add(Conv2D(32, (5, 5), activation='relu', input_shape=[28, 28, 1]))
model.add(Conv2D(64, (5, 5), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
完整代碼和運(yùn)行結(jié)果如下:
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Flatten, Dense
import numpy as np
# 設(shè)置隨機(jī)種子
np.random.seed(1447)
def build_model():
'''
在Begin-End段中構(gòu)建出如下結(jié)構(gòu)的卷積神經(jīng)網(wǎng)絡(luò)
1.64個5*5的卷積核組成的卷積層,激活函數(shù)為relu
2.最大池化層,池化核大小為2*2
3.扁平
4.128個神經(jīng)元的全連接層,激活函數(shù)為relu
5.10個神經(jīng)元的全連接層,激活函數(shù)為softmax
:return: 構(gòu)建好的模型
'''
model = Sequential()
model.add(Conv2D(32, (5, 5), activation='relu', input_shape=[28, 28, 1]))
#********* Begin *********#
model.add(Conv2D(64, (5, 5), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))
#********* End *********#
return model
第4關(guān):動手實(shí)現(xiàn)RNN分析影評情感
使用 Keras 構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)
在 Keras 中想要添加 RNN 的結(jié)構(gòu)非常簡單,代碼如下:
from keras.layers import Embedding, SimpleRNN, Dense
from keras import Sequential
model = Sequential()
# 對輸入的影評進(jìn)行word embedding,一般對于自然語言處理問題需要進(jìn)行word embedding
model.add(Embedding(1000, 64))
# 構(gòu)建一層有40個神經(jīng)元的RNN層
model.add(SimpleRNN(40))
# 將RNN層的輸出接到只有一個神經(jīng)元全連接層
model.add(Dense(1, activation='sigmoid'))
編程要求
填寫 python 代碼,在 Begin-End 段中構(gòu)建出如下結(jié)構(gòu)的循環(huán)神經(jīng)網(wǎng)絡(luò):
? 有 30 個神經(jīng)元的 SimpleRNN 層;
? 有 16 個神經(jīng)元的全連接層,激活函數(shù)為 relu;
? 有 1 個神經(jīng)元的全連接層,激活函數(shù)為 sigmoid
代碼如下:
from keras.models import Sequential
from keras.layers import Embedding, SimpleRNN, Dense
def build_model():
'''
在Begin-End段中構(gòu)建如下結(jié)構(gòu)的循環(huán)神經(jīng)網(wǎng)絡(luò)
1.有30個神經(jīng)元的SimpleRNN層
2.有16個神經(jīng)元的全連接層,激活函數(shù)為relu
3.有1個神經(jīng)元的全連接層,激活函數(shù)為sigmoid
:return: 構(gòu)建好的模型
'''
model = Sequential()
model.add(Embedding(1000, 64))
#********* Begin *********#
model.add(SimpleRNN(30))
model.add(Dense(units=16, activation='relu'))
model.add(Dense(units=1, activation='sigmoid'))
#********* End *********#
return model
完整代碼和運(yùn)行結(jié)果如下:
from keras.models import Sequential
from keras.layers import Embedding, SimpleRNN, Dense
def build_model():
'''
在Begin-End段中構(gòu)建如下結(jié)構(gòu)的循環(huán)神經(jīng)網(wǎng)絡(luò)
1.有30個神經(jīng)元的SimpleRNN層
2.有16個神經(jīng)元的全連接層,激活函數(shù)為relu
3.有1個神經(jīng)元的全連接層,激活函數(shù)為sigmoid
:return: 構(gòu)建好的模型
'''
model = Sequential()
model.add(Embedding(1000, 64))
#********* Begin *********#
model.add(SimpleRNN(30))
model.add(Dense(units=16, activation='relu'))
model.add(Dense(units=1, activation='sigmoid'))
#********* End *********#
return model
第5關(guān):動手實(shí)現(xiàn)貓狗大戰(zhàn)
讀取圖片
讀取圖片可以使用 OpenCV( OpenCV 是一個開源的計(jì)算機(jī)視覺庫,許多功能都有 python 接口)的 API 來實(shí)現(xiàn)。
想要在 python 中使用 opencv ,首先需要導(dǎo)入 cv2 。
import cv2
導(dǎo)入了 cv2 之后,可以使用 imread 函數(shù)來讀取圖片,其中 filename 是想要讀取的圖片路徑。
img = cv2.imread(filename)
由于訓(xùn)練集中的圖片大小不一,所以需要將讀取到的圖片強(qiáng)制縮放到固定的寬和高。所以需要使用 resize 函數(shù),其中 (32, 32) 的意思是將源圖像縮放成寬和高都是 32 個像素的圖像。
resized_image = cv2.resize(img, (32, 32))
圖像歸一化
由于卷積神經(jīng)網(wǎng)絡(luò)中的參數(shù)是通過梯度下降的方式訓(xùn)練出來的,而圖像中的每個像素都可以看成是一個特征,因此對圖像中的像素值進(jìn)行歸一化能夠提高卷積神經(jīng)網(wǎng)絡(luò)在梯度下降時的速度,減少損失的震蕩程度。想要對圖像進(jìn)行歸一化非常簡單,因?yàn)?opencv 讀取后的圖像是使用 numpy 的 ndarray 這一數(shù)據(jù)結(jié)構(gòu)來表示的,所以歸一化只需要使用如下代碼即可:
img = img / 255.0
onehot編碼
在遍歷 train_data 目錄中的圖片時可以根據(jù)圖片的名字來確定圖片所對應(yīng)的真實(shí)標(biāo)簽( 0 (貓),1 (狗))。但是在使用神經(jīng)網(wǎng)絡(luò)訓(xùn)練前,需要對標(biāo)簽進(jìn)行 onehot 編碼處理。
onehot 編碼是分類變量作為二進(jìn)制向量的表示。這首先要求將分類值映射到整數(shù)值。然后,每個整數(shù)值被表示為二進(jìn)制向量,除了整數(shù)的索引之外,它都是零值,它被標(biāo)記為 1。
在本次實(shí)訓(xùn)中,onehot 編碼可以看成把左表轉(zhuǎn)換成右表:
從上圖可以看出, onehot 編碼是把真實(shí)標(biāo)簽中所有可能的結(jié)果作為列(數(shù)據(jù)集中只有貓和狗,所以貓和狗作為列),然后把對應(yīng)的列填上 1 和 0。比如表格中的第 1 行的圖片名是 cat.1.jpg (肯定是貓),所以就在貓那一列填成 1,狗那一列填成 0 。第 3 行的圖片名是 dog.1.jpg (肯定是狗),所以就在狗那一列填 1,貓那一列填 0。
想要實(shí)現(xiàn) onehot 編碼也很簡單,只需要先用 numpy 的 zeros 函數(shù)分配好空間( row 指的是有多少張訓(xùn)練集圖片,col 指的是有多少種標(biāo)簽)。
onehot = np.zeros((row, col))
然后根據(jù)圖片名字在對應(yīng)的列上填 1 即可(在這里假設(shè) onehot 的第 1 列是貓,第 2 列是狗)。
綜上可完成題目中g(shù)et_train_data(data_path)函數(shù)的代碼:
def get_train_data(data_path):
'''
讀取并處理數(shù)據(jù)
:return:處理好的圖像和對應(yīng)的one-hot編碼
'''
images = []
onehot = np.zeros((500, 2))
#********* Begin *********#
for i, img_name in enumerate(os.listdir(data_path)):
if 'cat' in img_name:
onehot[i, 0] = 1
else:
onehot[i, 1] = 1
img = cv2.imread(os.path.join(data_path, img_name))
img = cv2.resize(img, (IMAGE_HEIGHT, IMAGE_WIDTH))
images.append(np.array(img, "float32") / 255.0)
#********* End *********#
return np.array(images), onehot
通過查找img_name里是否出現(xiàn)’cat’來判斷圖片種類,并進(jìn)行onehot編碼
利用os.path.join(data_path, img_name) 將路徑連接起來
利用np.array(img, “float32”) / 255.0將img轉(zhuǎn)為float再除以255.0
實(shí)現(xiàn)貓狗分類
處理好數(shù)據(jù)之后,就可以著手構(gòu)建模型并訓(xùn)練模型了,如:
model = keras.Sequential()
model.add(Conv2D(32, kernel_size=3, activation='relu', input_shape=[IMAGE_HEIGHT, IMAGE_WIDTH, 3]))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(32, kernel_size=3, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Flatten())
model.add(Dense(96, activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.0001),
metrics=['accu\fracy'])
model.fit(images, onehot, epochs=20, batch_size=32, verbose=0)
綜上完成build_model()函數(shù)代碼
def build_model():
'''
構(gòu)建模型
:return:構(gòu)建好的模型
'''
model = keras.Sequential()
#********* Begin *********#
model.add(Conv2D(32, kernel_size=3, activation='relu', input_shape=[IMAGE_HEIGHT, IMAGE_WIDTH, 3]))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(32, kernel_size=3, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Flatten())
model.add(Dense(96, activation='relu'))
model.add(Dense(2, activation='softmax'))
#********* End *********#
return model
完成編譯模型代碼
#********* Begin *********#
# 編譯模型
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.0001), metrics=['accuracy'])
#********* End *********#
完整代碼和運(yùn)行結(jié)果如下:
一遍過不了可以多交幾遍就能過了。文章來源:http://www.zghlxwxcb.cn/news/detail-473433.html
from keras.layers import Dense, Activation, Flatten, Dropout, Conv2D, MaxPooling2D
import keras
import os
import numpy as np
import cv2
# 設(shè)置隨機(jī)種子
np.random.seed(1447)
IMAGE_HEIGHT = 128
IMAGE_WIDTH = 128
def get_train_data(data_path):
'''
讀取并處理數(shù)據(jù)
:return:處理好的圖像和對應(yīng)的one-hot編碼
'''
images = []
onehot = np.zeros((500, 2))
#********* Begin *********#
for i, img_name in enumerate(os.listdir(data_path)):
if 'cat' in img_name:
onehot[i, 0] = 1
else:
onehot[i, 1] = 1
img = cv2.imread(os.path.join(data_path, img_name))
img = cv2.resize(img, (IMAGE_HEIGHT, IMAGE_WIDTH))
images.append(np.array(img, "float32") / 255.0)
#********* End *********#
return np.array(images), onehot
def build_model():
'''
構(gòu)建模型
:return:構(gòu)建好的模型
'''
model = keras.Sequential()
#********* Begin *********#
model.add(Conv2D(32, kernel_size=3, activation='relu', input_shape=[IMAGE_HEIGHT, IMAGE_WIDTH, 3]))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(32, kernel_size=3, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Flatten())
model.add(Dense(96, activation='relu'))
model.add(Dense(2, activation='softmax'))
#********* End *********#
return model
def fit_and_predict(model, train_images, onehot, test_images):
'''
訓(xùn)練模型,并對測試圖像進(jìn)行預(yù)測
:param model: 訓(xùn)練好的模型
:param train_images: 訓(xùn)練集圖像
:param onehot: 訓(xùn)練集的one-hot編碼
:param test_images: 測試集圖像
:return: 預(yù)測結(jié)果
'''
#********* Begin *********#
# 編譯模型
model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.0001), metrics=['accuracy'])
#********* End *********#
model.fit(train_images, onehot, epochs=20, batch_size=32, verbose=0)
result = model.predict(test_images, batch_size=10)
predict_idx = np.argmax(result, axis=1)
return predict_idx
文章來源地址http://www.zghlxwxcb.cn/news/detail-473433.html
到了這里,關(guān)于【頭歌平臺】人工智能-深度學(xué)習(xí)初體驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!