您的位置:首页 > 理论基础 > 计算机网络

深度学习笔记一:BP神经网络的介绍和Python代码实现(2)

2017-12-13 15:21 966 查看
1.以下代码的编写语言采用Python3.5版本,编译环境采用Anaconda,这里数据集通过sklearn生成,这个数据集大小为(1797,64),表示的是有1797张图片样本,其中的64,表示的是每一个样本包含64个特征,也就是下述图片所示,将8*8的矩阵排成一行,即64列,下面实现生成一个图片上数字的识别功能:



显示结果如下:



2.完整的bp实现代码如下:

# coding: utf-8

import numpy as np

from sklearn.datasets import load_digits

from sklearn.preprocessing import LabelBinarizer

from sklearn.cross_validation import train_test_split

def sigmoid(x):

    return 1/(1+np.exp(-x))

def dsigmoid(x):

    return x*(1-x)

class NeuralNetwor
4000
k:

    def __init__(self,layers):#(64,100,10)

        #权值的初始化,范围-1到1

        self.V = np.random.random((layers[0]+1,layers[1]+1))*2-1

        self.W = np.random.random((layers[1]+1,layers[2]))*2-1

        

    def train(self,X,y,lr=0.11,epochs=10000):

        #添加偏置

        temp = np.ones([X.shape[0],X.shape[1]+1])

        temp[:,0:-1] = X

        X = temp

        for n in range(epochs+1):

            i = np.random.randint(X.shape[0]) #随机选取一个数据

            x = [X[i]]

            x = np.atleast_2d(x)#转为2维数据

            

            L1 = sigmoid(np.dot(x,self.V))#隐层输出

            L2 = sigmoid(np.dot(L1,self.W))#输出层输出

            

            L2_delta = (y[i]-L2)*dsigmoid(L2)

            L1_delta= L2_delta.dot(self.W.T)*dsigmoid(L1)

            

            self.W += lr*L1.T.dot(L2_delta)

            self.V += lr*x.T.dot(L1_delta)

            #每训练1000次预测一次准确率

            if n%1000==0:

                predictions = []

                for j in range(X_test.shape[0]):

                    o = self.predict(X_test[j])

                    predictions.append(np.argmax(o))#获取预测结果

#这里equal()函数的功能是,当其传入的参数相等时,返回1,否则返回0

                accuracy = np.mean(np.equal(predictions,y_test))

                print('epoch:',n,'accuracy:',accuracy)

        

    def predict(self,x):

        #添加偏置

        temp = np.ones(x.shape[0]+1)

        temp[0:-1] = x

        x = temp

        x = np.atleast_2d(x)#转为2维数据

        L1 = sigmoid(np.dot(x,self.V))#隐层输出

        L2 = sigmoid(np.dot(L1,self.W))#输出层输出

        return L2

digits = load_digits()#载入数据

X = digits.data#数据

y = digits.target#标签

#输入数据归一化

X -= X.min()

X /= X.max()

nm = NeuralNetwork([64,100,10])#创建网络

X_train,X_test,y_train,y_test = train_test_split(X,y) #分割数据1/4为测试数据,3/4为训练数据

labels_train = LabelBinarizer().fit_transform(y_train)#标签二值化     0,8,6   0->1000000000  3->0001000000

labels_test = LabelBinarizer().fit_transform(y_test)#标签二值化

print('start')

nm.train(X_train,labels_train,epochs=20000)

print('end')

显示结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐