深度學習入門(三)構建簡單的兩層神經網路

2021-09-08 07:38:25 字數 4080 閱讀 8166

25天看完了吳恩達的機器學習以及《深度學習入門》和《tensorflow實戰》兩本書,吳恩達的學習課程只學了理論知識,另外兩本書的**自己敲了一遍,感覺過的太快,趁著跑cgan的時間把兩本書的知識點總結下,然後繼續深度學習的課程。歡迎小夥伴一起學習~

另外,本文先把框架搭好,後續會一直補充細節和知識點。

最後,本文參考的書是《深度學習入門》齋藤康毅著,十分推薦初學者使用。

本文的**位址

從訓練資料隨機抽取一部分資料

帶入模型計算梯度

根據梯度更新引數

重複步驟1,2,3

首先定義兩層神經網路的類並初始化變數,類中包含了計算損失、準確率、梯度更新等函式。

這裡儲存引數使用的字典形式,構建的神經層使用的orderdict,目的是儲存神經層的順序

class

twolayernet

:def

__init__

(self, input_size, hidden_size, output_size, weight_init_std =

0.01):

#初始化權重

self.params =

self.params[

'w1'

]= weight_init_std * np.random.randn(input_size, hidden_size)

self.params[

'b1'

]= np.zeros(hidden_size)

self.params[

'w2'

]= weight_init_std * np.random.randn(hidden_size, output_size)

self.params[

'b2'

]= np.zeros(output_size)

#生成層

self.layers = ordereddict(

) self.layers[

'affinel1'

]= affine(self.params[

'w1'

], self.params[

'b1'])

self.layers[

'relu'

]= relu(

) self.layers[

'affinel2'

]= affine(self.params[

'w2'

], self.params[

'b2'])

self.lastlayer = softmaxwithloss(

)

定義了**函式、計算損失和準確率,前面提到,我們把每一神經層模組化為乙個類,類中主要包含了前向傳播forward()和反向傳播backward()

這裡主要用到全連線層和relu層兩個類,在文末給出**

def

predict

(self, x)

:for layer in self.layers.values():

#values需要有括號

x = layer.forward(x)

# 呼叫forward計算前向傳播結果

return x

defloss

(self, x, t)

: y = self.predict(x)

return self.lastlayer.forward(y, t)

defaccuracy

(self, x, t)

: y = self.predict(x)

y = np.argmax(y, axis=1)

if t.ndim !=1:

t = np.argmax(t, axis=1)

accuracy = np.

sum(y==t)

/float

(t.shape[0]

)return accuracy

接下來是根據損失來計算梯度,反向傳播backward()

def

gradient

(self, x, t)

:# forward

self.loss(x, t)

# backward

dout =

1 dout = self.lastlayer.backward(dout)

layers =

list

(self.layers.values())

layers.reverse(

)for layer in layers:

dout = layer.backward(dout)

grads =

grads[

'w1'

], grads[

'b1'

]= self.layers[

'affine1'

].dw, self.layers[

'affine1'

].db

grads[

'w2'

], grads[

'b2'

]= self.layers[

'affine2'

].dw, self.layers[

'affine2'

].db

return grads

最後,匯入資料,定義訓練

(x_train, t_train)

,(x_test, t_test)

= load_mnist(normalize=

true

, one_hot_label=

true

)# 這裡的load_mnist是匯入資料的指令碼

network = twolayernet(input_size=

784, hidden_size=

50, output_size=10)

# 定義模型

iters_num =

1000

# 迭代的最大數目

train_size = x_train.shape[0]

# 訓練集的大小

batch_size =

100# 每乙個batch的大小

learning_rate =

0.1#學習率

train_loss_list =

train_acc_list =

test_acc_list =

iter_per_epoch =

max(train_size / batch_size,1)

#乙個epoch(紀元)的迭代次數

for i in

range

(iters_num)

: batch_mask = np.random.choice(train_size, batch_size)

#隨機抽取batch_size個資料的編號

x_batch = x_train[batch_mask]

t_batch = t_train[batch_mask]

grad = network.gradient(x_batch, t_batch)

# 呼叫梯度計算函式

for key in

('w1'

,'b1'

,'w2'

,'b2'):

# 梯度更新

network.params[key]

-= learning_rate * grad[key]

loss = network.loss(x_batch, t_batch)

if i % iter_per_epoch:

# 乙個epoch後,計算訓練集和測試集的準確率

train_acc = network.accuracy(x_train, t_train)

test_acc = network.accuracy(x_test, t_test)

print

(train_acc, test_acc)

至此,我們的簡易的使用反向傳播演算法的兩層神經網路搭建和訓練就完成啦~

兩層網路 三層網路的理解

對於搞it的同行而言,大部分人都不會直接和網路打交道,因此除非從事網路開發,否則對網路內部機制也不會太關心,但是明白網路資料是怎麼走的,這對每個it工程師應該是很重要的基礎知識。網路資料報如何在網路上遊蕩,長久以來也困擾了我很長時間,現在把這部分內容總結分享一下。說起網路,大家不約而同會想起大學課本...

兩層網路,三層網路的理解

對於搞it的同行而言,大部分人都不會直接和網路打交道,因此除非從事網路開發,否則對網路內部機制也不會太關心,但是明白網路資料是怎麼走的,這對每個it工程師應該是很重要的基礎知識。網路資料報如何在網路上遊蕩,長久以來也困擾了我很長時間,現在把這部分內容總結分享一下。說起網路,大家不約而同會想起大學課本...

JDBC的兩層模型與三層模型(多層)

jdbc訪問資料庫的模型多種多樣,主要是兩層和三層 多層 模型。一 兩層模型 在這種結構模型下,應用程式 客戶端 直接與資料庫伺服器相連,如圖 客戶端直接向資料庫伺服器傳送sql請求,伺服器端返回相應的結果,客戶端負責資料的格式化。這種模型存在以下侷限 1 受資料庫廠商的限制,更換資料庫是需要改寫大...