記錄一下手動實現乙個兩層的全連線神經網路,主要針對於李巨集毅老師hw3的7分類問題。本來是想拿nn svg畫一下這個結構,結果維度太高,它宕機了。。(好吧,是我太菜了,,不太會用),所以用乙個小的結構代替一下,就是乙個簡單的fcnn
bp演算法就不寫在這裡了,其他的大神都講的很不錯的。網路大概結構:
源**:
import numpy as np
import matplotlib.pyplot as plt
from keras.utils import to_categorical
# 載入笑臉
file_path = r'c:/users/desktop/2020kaoyan/ml/2017mlspring_hung-yi-lee-master/2017mlspring_hung-yi-lee-master/hw3/data.csv'
with
open
(file_path, encoding=
'utf8'
)as f:
data = np.loadtxt(f,
float
, delimiter=
",", skiprows=1)
label_path = r'c:/users/desktop/2020kaoyan/ml/2017mlspring_hung-yi-lee-master/2017mlspring_hung-yi-lee-master/hw3/label.csv'
with
open
(label_path, encoding=
'utf8'
)as labels_file:
labels = np.loadtxt(labels_file,
float
, delimiter=
",", skiprows=1)
# 處理相應的矩陣資料
data = np.array(data, dtype=
float
)labels = to_categorical(np.array(labels, dtype=
float),
7)# 求sigmoid的值
defsigmoid
(input_x)
:return1/
(1+ np.exp(
-input_x)
)# 計算sigmoid函式的gradient值
defsigmoid_gradient
(x):
return sigmoid(x)*(
1- sigmoid(x)
)# 定義 softmax 函式
defsoftmax
(x):
exps = np.exp(x - np.
max(x)
)return exps / np.
sum(exps)
# 定義cross_entropy loss函式
defcross_entropy
(x, y)
:return np.
sum(np.nan_to_num(
-y*np.log(x)-(
1-y)
*np.log(
1-x)))
# 初始化各個引數 神經網主要有兩層,只有一層隱藏層
definit_each_params
(input_nums, hidden_nums, output_nums)
:# 初試話兩層的bias
bias_one = np.random.randint(-5
,5,(hidden_nums,1)
).astype(np.
float
) bias_two = np.random.randint(-5
,5,(output_nums,1)
).astype(np.
float
)# 初始化兩層的weight
weight_one = np.random.randint(-5
,5,(hidden_nums, input_nums)
).astype(np.
float
) weight_two = np.random.randint(-5
,5,(output_nums, hidden_nums)
).astype(np.
float
)return bias_one, bias_two, weight_one, weight_two
# 訓練資料
deftrainning
(dataset, labelset, weight1, weight2, bias1, bias2)
:# 設定學習率
lr =
0.02
for i in
range
(len
(dataset)):
# feedforward pass
a_one = np.transpose(dataset[i,:]
).reshape(
2304,1
) z_one =
(np.matmul(weight1, a_one)
.astype(np.
float))
+ bias1
# hidden layer 輸出
a_two = sigmoid(z_one)
.astype(np.
float
)# 輸出層的輸入
z_two =
(np.matmul(weight2, a_two)
.astype(np.
float))
+ bias2
# 輸出層輸出
outputset = softmax(z_two)
.astype(np.
float
) loss = cross_entropy(outputset, np.transpose(labelset[i,:]
)).astype(np.
float
)# backpropgate pass
# 更新兩層誤差項,由於會出現broadcast的問題,所以直接reshape了一下
theta_out = outputset - np.transpose(labelset[i,:]
).reshape(7,
1)theta_first = sigmoid_gradient(z_one)
*(np.matmul(weight2.t, theta_out)
)# 更新第二層的 weight 和 bias
weight2 = weight2 - lr *
(np.matmul(theta_out, a_two.t)
.astype(np.
float))
bias2 = bias2 - lr * theta_out
# 更新第一層的 weight 和 bias
weight1 = weight1 - lr *
(np.matmul(theta_first, a_one.t)
.astype(np.
float))
bias1 = bias1 - lr * theta_first
print
("the loss of %d times trainning is:%f"
%(i, loss)
)return weight1, weight2, bias1, bias2
# 定義初始化的引數
# 輸入層是乙個 48*48 的灰白影象的 flatten ,沒有降維,所以輸入層的dim為2304
# 隱藏層自定義了3000個神經元,最後輸出層有7個神經元,因為是7分類模型
# 整個網路是模擬全連線神經網
bias_one, bias_two, weight_one, weight_two = init_each_params(
2304
,3000,7
)model_weight1, model_weight2, model_bias1, model_bias2 = trainning(data, labels, weight_one, weight_two, bias_one, bias_two)
Numpy實現兩層的神經網路
numpy ndarray是乙個普通的n維array。它不知道任何關於深度學習或者梯度 gradient 的知識,也不知道計算圖 computation graph 只是一種用來計算數 算的資料結構。一 神經網路結構圖 二 神經網路的構建 1 乙個輸入向量,乙個隱藏層,乙個全連線relu神經網路,沒...
Pytorch兩層神經網路
這一次我們不用手動更新model的weights,而是使用optim這個包來幫助我們更新引數。optim這個package提供了各種不同的model優化方法,包括sgd momentum,rmsprop,adam import torch n,d in,h,d out 64,1000 100,10 ...
深度學習入門(三)構建簡單的兩層神經網路
25天看完了吳恩達的機器學習以及 深度學習入門 和 tensorflow實戰 兩本書,吳恩達的學習課程只學了理論知識,另外兩本書的 自己敲了一遍,感覺過的太快,趁著跑cgan的時間把兩本書的知識點總結下,然後繼續深度學習的課程。歡迎小夥伴一起學習 另外,本文先把框架搭好,後續會一直補充細節和知識點。...