20201009_进军多层_BP神经网络介绍(代码实践2)_观看覃秉丰课程笔记

一、用到sklearn的数据集

二、在训练时,比如说有10000个数据,一般会把这10000个数据分为100组,每组有100个数据,这样的话一个批次有100个数据,我们分成了100个批次,每个批次训练100个数据,这样可以提高训练速度,但是也不会影响训练的准确性。

三、归一化

输入数据的归一化,x = (x-x.min)/x.max 这个公式把输入的x转化成0到1的数字。

原因:加入x非常大,权值和x相乘就会很大,把这个很大的数字送到激活函数里,输出就会无限趋近于0或者1(以sigmoid激活函数为例),那么这个点对应的导数就会趋近于0这个网络就没有办法进行学习了。因此就会进行归一化,而且权值的初始值也会设置的比较小。

四、标签二值化

如果一张图片是0,那么它的标签就是0。如果一张图片是8,那么它的标签就是8。0和8都是它的原始标签。神经网络的风格,输出都是0和1的取值。因此二值化后的标签是:如果是0—>1000000000  如果是3->0001000000 ,规律是第几个神经元是1,那么这个图片的标签就是几。显然0的时候第0个神经元是1,3的时候第3个神经元是1。

五、完整代码:

注:BP神经网络解决实现图片识别的训练,用到了sklearn中的数据集。


# coding: utf-8

# 微信公众号:深度学习与神经网络  
# Github:https://github.com/Qinbf  
# 优酷频道:http://i.youku.com/sdxxqbf  

# In[4]:

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 NeuralNetwork:
    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))#获取预测结果
                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')


# In[ ]:



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值