【机器学习】——纯Python建立BP模型
生活随笔
收集整理的這篇文章主要介紹了
【机器学习】——纯Python建立BP模型
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
參考:https://blog.csdn.net/michael_f2008/article/details/103715699
https://developer.aliyun.com/article/614411
import pandas as pd import numpy as np import datetime from sklearn.utils import shuffle# 1.初始化參數(shù) def initialize_parameters(n_x, n_h, n_y):np.random.seed(2)# 權(quán)重和偏置矩陣w1 = np.random.randn(n_h, n_x) * 0.01b1 = np.zeros(shape=(n_h, 1))w2 = np.random.randn(n_y, n_h) * 0.01b2 = np.zeros(shape=(n_y, 1))# 通過字典存儲參數(shù)parameters = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2}return parameters# 2.前向傳播 def forward_propagation(X, parameters):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']# 通過前向傳播來計算a2z1 = np.dot(w1, X) + b1 # 這個地方需注意矩陣加法:雖然(w1*X)和b1的維度不同,但可以相加a1 = np.tanh(z1) # 使用tanh作為第一層的激活函數(shù)z2 = np.dot(w2, a1) + b2a2 = 1 / (1 + np.exp(-z2)) # 使用sigmoid作為第二層的激活函數(shù)# 通過字典存儲參數(shù)cache = {'z1': z1, 'a1': a1, 'z2': z2, 'a2': a2}return a2, cache# 3.計算代價函數(shù) def compute_cost(a2, Y, parameters):m = Y.shape[1] # Y的列數(shù)即為總的樣本數(shù)# 采用交叉熵(cross-entropy)作為代價函數(shù)logprobs = np.multiply(np.log(a2), Y) + np.multiply((1 - Y), np.log(1 - a2))cost = - np.sum(logprobs) / mreturn cost# 4.反向傳播(計算代價函數(shù)的導(dǎo)數(shù)) def backward_propagation(parameters, cache, X, Y):m = Y.shape[1]w2 = parameters['w2']a1 = cache['a1']a2 = cache['a2']# 反向傳播,計算dw1、db1、dw2、db2dz2 = a2 - Ydw2 = (1 / m) * np.dot(dz2, a1.T)db2 = (1 / m) * np.sum(dz2, axis=1, keepdims=True)dz1 = np.multiply(np.dot(w2.T, dz2), 1 - np.power(a1, 2))dw1 = (1 / m) * np.dot(dz1, X.T)db1 = (1 / m) * np.sum(dz1, axis=1, keepdims=True)grads = {'dw1': dw1, 'db1': db1, 'dw2': dw2, 'db2': db2}return grads# 5.更新參數(shù) def update_parameters(parameters, grads, learning_rate=0.0075):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']dw1 = grads['dw1']db1 = grads['db1']dw2 = grads['dw2']db2 = grads['db2']# 更新參數(shù)w1 = w1 - dw1 * learning_rateb1 = b1 - db1 * learning_ratew2 = w2 - dw2 * learning_rateb2 = b2 - db2 * learning_rateparameters = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2}return parameters# 建立神經(jīng)網(wǎng)絡(luò) def nn_model(X, Y, n_h, n_input, n_output, num_iterations=10000, print_cost=False):np.random.seed(3)n_x = n_input # 輸入層節(jié)點數(shù)n_y = n_output # 輸出層節(jié)點數(shù)# 1.初始化參數(shù)parameters = initialize_parameters(n_x, n_h, n_y)# 梯度下降循環(huán)for i in range(0, num_iterations):# 2.前向傳播a2, cache = forward_propagation(X, parameters)# 3.計算代價函數(shù)cost = compute_cost(a2, Y, parameters)# 4.反向傳播grads = backward_propagation(parameters, cache, X, Y)# 5.更新參數(shù)parameters = update_parameters(parameters, grads)# 每1000次迭代,輸出一次代價函數(shù)if print_cost and i % 1000 == 0:print('迭代第%i次,代價函數(shù)為:%f' % (i, cost))return parameters# 對模型進行測試 def predict(parameters, x_test, y_test):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']z1 = np.dot(w1, x_test) + b1a1 = np.tanh(z1)z2 = np.dot(w2, a1) + b2a2 = 1 / (1 + np.exp(-z2))# 結(jié)果的維度n_rows = y_test.shape[0]n_cols = y_test.shape[1]# 預(yù)測值結(jié)果存儲output = np.empty(shape=(n_rows, n_cols), dtype=int)# 取出每條測試數(shù)據(jù)的預(yù)測結(jié)果for i in range(n_cols):# 將每條測試數(shù)據(jù)的預(yù)測結(jié)果(概率)存為一個行向量temp = np.zeros(shape=n_rows)for j in range(n_rows):temp[j] = a2[j][i]# 將每條結(jié)果(概率)從小到大排序,并獲得相應(yīng)下標(biāo)sorted_dist = np.argsort(temp)length = len(sorted_dist)# 將概率最大的置為1,其它置為0for k in range(length):if k == sorted_dist[length - 1]:output[k][i] = 1else:output[k][i] = 0print('預(yù)測結(jié)果:')print(output)print('真實結(jié)果:')print(y_test)count = 0for k in range(0, n_cols):if output[0][k] == y_test[0][k] and output[1][k] == y_test[1][k] and output[2][k] == y_test[2][k]:count = count + 1acc = count / int(y_test.shape[1]) * 100print('準確率:%.2f%%' % acc)if __name__ == "__main__":# 讀取數(shù)據(jù)data_set = pd.read_csv('D:\\circles_data_training.csv', header=None)data_set = shuffle(data_set) # 打亂數(shù)據(jù)的輸入順序# 取出“特征”和“標(biāo)簽”,并做了轉(zhuǎn)置,將列轉(zhuǎn)置為行X = data_set.ix[:, 0:11].values.T # 前12列是特征Y = data_set.ix[:, 12:14].values.T # 后3列是標(biāo)簽Y = Y.astype('uint8')# 開始訓(xùn)練start_time = datetime.datetime.now()# 輸入12個節(jié)點,隱層6個節(jié)點,輸出3個節(jié)點,迭代10000次parameters = nn_model(X, Y, n_h=6, n_input=12, n_output=3, num_iterations=10000, print_cost=True)end_time = datetime.datetime.now()print("用時:" + str((end_time - start_time).seconds) + 's' + str(round((end_time - start_time).microseconds / 1000)) + 'ms')# 對模型進行測試data_test = pd.read_csv('D:\\circles_data_test.csv', header=None)x_test = data_test.ix[:, 0:11].values.Ty_test = data_test.ix[:, 12:14].values.Ty_test = y_test.astype('uint8')predict(parameters, x_test, y_test)?
總結(jié)
以上是生活随笔為你收集整理的【机器学习】——纯Python建立BP模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络adb重启失效
- 下一篇: 【图像处理】——Python实现图像特征