关于深度学习的一点理解
生活随笔
收集整理的這篇文章主要介紹了
关于深度学习的一点理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考大神的文章https://www.zybuluo.com/hanbingtao/note/476663
感覺逐漸入門了深度學習,在這寫點現階段自己關于對神經網絡和反向傳播算法的理解。簡單的神經網絡通常有三層:輸入層,隱藏層,輸出層。如果不考慮復雜的數學公式推導的話,其實沒有多少東西,只要弄清每層的輸入輸出,每層的連接方式,其實并沒有多困難,輸入輸出比較容易弄清楚,輸入層的輸出就是隱藏層的輸入,以此推,很容易理解。連接方式,無非是每一層是全連接還是連接一部分,連接的時候每一個神經元的權重是多少的問題。最難的部分在于根據一定的誤差準則去確定權重,這個時候需要復雜的數學公式進行推導,一般是鏈式求導。在求導的時候會根據一定的算法,比如反向傳播算法等,求導完成之后又會進一步去優化,優化的算法又會有很多種,有隨機梯度下降算法等(自己還沒掌握那么多算法,暫且寫自己掌握的)最后得到我們求更新權重的公式,然后根據公式,用python或者c++等等其他任何一種語言去敲出來,大功告成。貼上大神的代碼基于python2.7。方便以后進一步學習。
import random import numpy as np from activators import SigmoidActivator, IdentityActivator# 全連接層實現類 class FullConnectedLayer(object):def __init__(self, input_size, output_size, activator):'''構造函數input_size: 本層輸入向量的維度output_size: 本層輸出向量的維度activator: 激活函數'''self.input_size = input_sizeself.output_size = output_sizeself.activator = activator# 權重數組Wself.W = np.random.uniform(-0.1, 0.1,(output_size, input_size))# 偏置項bself.b = np.zeros((output_size, 1))# 輸出向量self.output = np.zeros((output_size, 1))def forward(self, input_array):'''前向計算input_array: 輸入向量,維度必須等于input_size'''# 式2self.input = input_arrayself.output = self.activator.forward(np.dot(self.W, input_array) + self.b)def backward(self, delta_array):'''反向計算W和b的梯度delta_array: 從上一層傳遞過來的誤差項'''# 式8self.delta = self.activator.backward(self.input) * np.dot(self.W.T, delta_array)self.W_grad = np.dot(delta_array, self.input.T)self.b_grad = delta_arraydef update(self, learning_rate):'''使用梯度下降算法更新權重'''self.W += learning_rate * self.W_gradself.b += learning_rate * self.b_graddef dump(self):print 'W: %s\nb:%s' % (self.W, self.b)# 神經網絡類 class Network(object):def __init__(self, layers):'''構造函數'''self.layers = []for i in range(len(layers) - 1):self.layers.append(FullConnectedLayer(layers[i], layers[i+1],SigmoidActivator()))def predict(self, sample):'''使用神經網絡實現預測sample: 輸入樣本'''output = samplefor layer in self.layers:layer.forward(output)output = layer.outputreturn outputdef train(self, labels, data_set, rate, epoch):'''訓練函數labels: 樣本標簽data_set: 輸入樣本rate: 學習速率epoch: 訓練輪數'''for i in range(epoch):for d in range(len(data_set)):self.train_one_sample(labels[d], data_set[d], rate)def train_one_sample(self, label, sample, rate):self.predict(sample)self.calc_gradient(label)self.update_weight(rate)def calc_gradient(self, label):delta = self.layers[-1].activator.backward(self.layers[-1].output) * (label - self.layers[-1].output)for layer in self.layers[::-1]:layer.backward(delta)delta = layer.deltareturn deltadef update_weight(self, rate):for layer in self.layers:layer.update(rate)def dump(self):for layer in self.layers:layer.dump()def loss(self, output, label):return 0.5 * ((label - output) * (label - output)).sum()def gradient_check(self, sample_feature, sample_label):'''梯度檢查network: 神經網絡對象sample_feature: 樣本的特征sample_label: 樣本的標簽'''# 獲取網絡在當前樣本下每個連接的梯度self.predict(sample_feature)self.calc_gradient(sample_label)# 檢查梯度epsilon = 10e-4for fc in self.layers:for i in range(fc.W.shape[0]):for j in range(fc.W.shape[1]):fc.W[i,j] += epsilonoutput = self.predict(sample_feature)err1 = self.loss(sample_label, output)fc.W[i,j] -= 2*epsilonoutput = self.predict(sample_feature)err2 = self.loss(sample_label, output)expect_grad = (err1 - err2) / (2 * epsilon)fc.W[i,j] += epsilonprint 'weights(%d,%d): expected - actural %.4e - %.4e' % (i, j, expect_grad, fc.W_grad[i,j])from bp import train_data_setdef transpose(args):return map(lambda arg: map(lambda line: np.array(line).reshape(len(line), 1), arg), args)class Normalizer(object):def __init__(self):self.mask = [0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80]def norm(self, number):data = map(lambda m: 0.9 if number & m else 0.1, self.mask)return np.array(data).reshape(8, 1)def denorm(self, vec):binary = map(lambda i: 1 if i > 0.5 else 0, vec[:,0])for i in range(len(self.mask)):binary[i] = binary[i] * self.mask[i]return reduce(lambda x,y: x + y, binary)def train_data_set():normalizer = Normalizer()data_set = []labels = []for i in range(0, 256):n = normalizer.norm(i)data_set.append(n)labels.append(n)return labels, data_setdef correct_ratio(network):normalizer = Normalizer()correct = 0.0;for i in range(256):if normalizer.denorm(network.predict(normalizer.norm(i))) == i:correct += 1.0print 'correct_ratio: %.2f%%' % (correct / 256 * 100)def test():labels, data_set = transpose(train_data_set())net = Network([8, 3, 8])rate = 0.5mini_batch = 20epoch = 10for i in range(epoch):net.train(labels, data_set, rate, mini_batch)print 'after epoch %d loss: %f' % ((i + 1),net.loss(labels[-1], net.predict(data_set[-1])))rate /= 2correct_ratio(net)def gradient_check():'''梯度檢查'''labels, data_set = transpose(train_data_set())net = Network([8, 3, 8])net.gradient_check(data_set[0], labels[0])return net?
?
總結
以上是生活随笔為你收集整理的关于深度学习的一点理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地产相继入局智能家居,LifeSmart
- 下一篇: java二叉树算法_JAVA 二叉树算法