神经网络结构
(一)信号的正向传播
隐藏层输出 = 激活函数(输入 * 权值)
最终输出 = 激活函数 (隐藏层输出 * 权值)
**
(二)误差的反向传播
最终输出层delta = (标签 - 最终输出)* 激活函数的导数(最终输出)
隐藏层delta = 下一层delta * (下一个权值的转置)*激活函数的倒数(隐藏层输出)
(三)权值的增量
最后权值的增量 = 学习率 * 对应输入值的转置 * 对应delta
(四)激活函数
(1)sigmoid函数
(2)ReLu函数
(3)Tanh函数
(4)Softsign函数
等等…
(关于BP网络–手写数字识别代码)
import numpy as np
from sklearn.datasets import load_digits #导入手写数字的图像
from sklearn.preprocessing import LabelBinarizer #进行标签二值化
from sklearn.model_selection import train_test_split #进行训练集和测试集的区分
from sklearn.metrics import classification_report,confusion_matrix #对结果进行评估
import matplotlib.pyplot as plt #画图
#载入数据
digits = load_digits()
#定义数据
X = digits.data
#定义标签
Y = digits.target
#定义神经网络模型 结构:64-100-10
#定义权值矩阵 范围0~1
V = np.random.random((64,100)) * 2 - 1
W = np.random.random((100,10)) * 2 - 1
#学习率
lr = 0.1
#数据切分 3/4训练集 1/4测试集
X_train,X_test,Y_train,Y_test = train_test_split(X,Y)
#标签二值化
labels_train = LabelBinarizer().fit_transform(Y)
#激活函数
def sigmoid(x):
return 1/(1+np.exp(-x))
#激活函数导数
def dsigmoid(x):
return x * (1-x)
#训练函数
def train(steps):
global W,V,X,Y,lr
for n in range(steps+1):
#随机生成一个数据
i = np.random.randint(X.shape[0])
#将这个数据复制
x = X[i]
#转化为2维数据
x = np.atleast_2d(x)
#BP算法
#每一层的输出
L1 = sigmoid(x.dot(V))
L2 = sigmoid(L1.dot(W))
#计算
delta_L2 = (labels_train[i]-L2)*dsigmoid(L2)
delta_L1 = delta_L2.dot(W.T) * dsigmoid(L1)
#权值的增量
delta_W = lr * L1.T.dot(delta_L2)
delta_V = lr * x.T.dot(delta_L1)
#更新权值
W = W + delta_W
V = V + delta_V
#每训练1000次算一遍准确率
if n%1000 == 0:
output = predict(X_test)
predictions = np.argmax(output,axis=1)
#.mean 求平均 .equal 判断是否相等 ,返回1或0
acc = np.mean(np.equal(predictions,Y_test)) #预测值与标签测试值判断是否相等 然后求平均
print("steps:",n,"acc:",acc)
def predict(x):
L1 = sigmoid(x.dot(V))
L2 = sigmoid(L1.dot(W))
return L2
train(10000)
output = predict(X_test)
predictions = np.argmax(output,axis=1)
print(classification_report(predictions,Y_test))
print(confusion_matrix(predictions,Y_test))