# -*- 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。即得到下圖的模型...