乙個簡單完整的神經網路的實現

2021-10-16 05:02:26 字數 4677 閱讀 1980

# -*- coding: utf-8 -*-

# @filename: 乙個簡單完整的神經網路的實現

# @software: pycharm

# @author : li xu

# @time :2020//01//16

import numpy as np

defsigmoid

(x):

''' 定義乙個啟用函式

:param x: 引數

:return: 計算後的值

'''fun =1/

(1+ np.exp(

-x))

return fun

defderive_sigmoid

(x):

''' 啟用函式的導數

:param x: 引數

:return: 計算後的值

'''fx = sigmoid(x)

derive = fx *(1

- fx)

return derive

defloss

(y_true, y_pred)

:'''

損失函式

:param y_true: 真實值

:param y_pred: **值

:return:

'''result =

((y_true - y_pred)**2

).mean(

)return result

class

nerualnetwork

:'''

定義乙個神經網路的類

a neural network with:

- 2 inputs

- a hidden layer with 2 neurons (h1, h2)

- an output layer with 1 neuron (o1)

'''def__init__

(self)

:'''

初始化權重w和偏置b

'''self.w1 = np.random.normal(

)# np.random.normal()生成高斯分布的概率密度隨機數

self.w2 = np.random.normal(

) self.w3 = np.random.normal(

) self.w4 = np.random.normal(

) self.w5 = np.random.normal(

) self.w6 = np.random.normal(

) self.b1 = np.random.normal(

) self.b2 = np.random.normal(

) self.b3 = np.random.normal(

)def

feedforward

(self, x)

:'''

前向傳播

:param x: 輸入x值,乙個含2個元素的陣列

:return:

'''h1 = sigmoid(self.w1 * x[0]

+ self.w2 * x[1]

+ self.b1)

h2 = sigmoid(self.w3 * x[0]

+ self.w4 * x[1]

+ self.b2)

o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)

return o1

deftrain

(self, dataset, all_y_true)

:'''

訓練函式

:param dataset: 資料集

:param all_y_true: 真實值

:return:

'''enta =

0.1 iteration =

1000

for i in

range

(iteration)

:for x, y_true in

zip(dataset, all_y_true)

: sum_h1 = self.w1 * x[0]

+ self.w2 * x[1]

+ self.b1

h1 = sigmoid(sum_h1)

sum_h2 = self.w3 * x[0]

+ self.w4 * x[1]

+ self.b2

h2 = sigmoid(sum_h2)

sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3

o1 = sigmoid(sum_o1)

y_pred = o1

'''下面計算導數部分

--- 命名: d_l_d_w1 represents "partial l / partial w1"

'''d_l_d_ypred =-2

*(y_true - y_pred)

# 神經元o1

d_ypred_d_w5 = h1 * derive_sigmoid(sum_o1)

d_ypred_d_w6 = h2 * derive_sigmoid(sum_o1)

d_ypred_d_b3 = derive_sigmoid(sum_o1)

d_ypred_d_h1 = self.w5 * derive_sigmoid(sum_o1)

d_ypred_d_h2 = self.w6 * derive_sigmoid(sum_o1)

# 神經元h1

d_h1_d_w1 = x[0]

* derive_sigmoid(sum_h1)

d_h1_d_w2 = x[1]

* derive_sigmoid(sum_h1)

d_h1_d_b1 = derive_sigmoid(sum_h1)

# 神經元h2

d_h2_d_w3 = x[0]

* derive_sigmoid(sum_h2)

d_h2_d_w4 = x[1]

* derive_sigmoid(sum_h2)

d_h2_d_b2 = derive_sigmoid(sum_h2)

''' 更新權重和偏置

'''# 神經元h1

self.w1 -= enta * d_l_d_ypred * d_ypred_d_h1 * d_h1_d_w1

self.w2 -= enta * d_l_d_ypred * d_ypred_d_h1 * d_h1_d_w2

self.b1 -= enta * d_l_d_ypred * d_ypred_d_h1 * d_h1_d_b1

# 神經元h2

self.w3 -= enta * d_l_d_ypred * d_ypred_d_h2 * d_h2_d_w3

self.w4 -= enta * d_l_d_ypred * d_ypred_d_h2 * d_h2_d_w4

self.b2 -= enta * d_l_d_ypred * d_ypred_d_h2 * d_h2_d_b2

# 神經元o1

self.w5 -= enta * d_l_d_ypred * d_ypred_d_w5

self.w6 -= enta * d_l_d_ypred * d_ypred_d_w6

self.b3 -= enta * d_l_d_ypred * d_ypred_d_b3

'''計算每次迭代的總損失

'''if iteration %

10==0:

1, dataset)

loss = loss(all_y_true, y_preds)

print

("epoch %d loss: %.3f"

%(iteration, loss)

)# 定義乙個資料集

dataset = np.array([[

-2,-

1],# alice[25

,6],

# bob[17

,4],

# charlie[-

15,-6

],# diana])

all_y_true = np.array([1

,# alice0,

# bob0,

# charlie1,

# diana])

# 訓練神經元

network = nerualnetwork(

)network.train(dataset, all_y_true)

emily = np.array([-

7,-3

])# 128 pounds, 63 inches

frank = np.array([20

,2])

# 155 pounds, 68 inches

print

("emily: %.3f"

% network.feedforward(emily)

)# 0.951 - f

print

("frank: %.3f"

% network.feedforward(frank)

)# 0.039 - m

實現乙個最簡單的神經網路

這次實現乙個最簡單的神經網路,這個神經網路能判斷輸入的是奇數還是偶數通常咱們寫程式 就要寫成這樣了 if inputnumber 2 else 但是神經網路不是這樣的 首先來想一下,嬰兒時怎麼學習的。嬰兒要學習乙個東西,比如漢語 嬰兒在剛出生的時候是不會任何和漢語相關的知識的 是嬰兒在後來逐漸的學習...

動手實現乙個簡單神經網路

import numpy as np 定義乙個啟用函式 defsigmoid x,deriv false if deriv true return x 1 x return 1 1 np.exp x 構造樣本 x np.array 1,0,1,0,1,1 1,1,1,0,1,1 1,0,1,0,0,...

乙個簡單的神經網路例子

來自神經網路之家 日期 2015 07 1611 18 37.0 用於訓練的輸入資料 對應的輸出資料 我們這裡設定 1 節點個數設定 輸入層 隱層 輸出層的節點個數分別為 2 3,1 2 傳遞函式設定 隱層 tansig函式 輸出層 purelin函式 3 訓練方式 trainlm。即得到下圖的模型...