使用python實現兩層神經網路(HW3)

2021-10-07 06:32:44 字數 4284 閱讀 7539

記錄一下手動實現乙個兩層的全連線神經網路,主要針對於李巨集毅老師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的時間把兩本書的知識點總結下,然後繼續深度學習的課程。歡迎小夥伴一起學習 另外,本文先把框架搭好,後續會一直補充細節和知識點。...