【机器学习】动手写一个全连接神经网络(三):分类

我们来用python写一个没有正则化的分类神经网络。
传统的分类方法有聚类LR逻辑回归传统SVMLSSVM等。其中LR和svm都是二分类器,可以将多个LR或者svm组合起来,做成多分类器。
多分类神经网络使用softmax+cross entropy组成最终的多分类代价函数J。为什么要用这个代价函数,可能需要广义线性模型的知识。简单来说就是最大化分类函数的熵。
假设一共有M个分类,softmax+cross entropy代价函数本身不需要学习。在softmax+cross entropy代价函数之前的网络层是一个需要训练的输出通道为M的全连接层。
设分类项为K,J的表达式为:

J=k=1M[IK(yi)log(softmax(θk,x))]+λ2θ2IK=1 if yi=K,else IK=0softmax(θk,x)=eθTkxkeθTkx

将log拆开得到:
J=k=1MIK(yi)logeθTkx+k=1MIK(yi)logkeθTkx+λ2θ2=k=1MIK(yi)logeθTkx+logkeθTkx+λ2θ2

J对 θ 求导得到
Jθk=k[IK(yi)eθTkxeθTkx]x+eθTkxxkeθTkx+λθ=k[IK(yi)]x+eθTkxxkeθTkx+λθ=x(eθTkxxkeθTkx1)+λθ

如果加入批处理batch,那么梯度变为:
Jθk=1Ni=1n[xi(eθTkxixkeθTkxi1)]+λθ

下面给出一个简单的非batch二分类神经网络代码:

import numpy as np

X = np.linspace(-50,50,100)
y = np.mat(X>0)*1.0

def sigmoid(x):
    return 1.0/(1+np.exp(-x))

lr2 = 0.0000005
inputDim = 1
fc1Dim = 2
W1 = np.random.randn(fc1Dim, inputDim)
b1 = np.zeros((fc1Dim,1))

def forward(x):
    fc1=W1.dot(x)+b1
    sig1 = fc1
    softmax=np.exp(sig1)
    softmax=softmax/np.sum(softmax)
    return fc1,sig1,softmax

def backward(x,fc1,sig1,loss,W1,b1):
    dfc2up = loss#1xn->nx1
    dsigup = dfc2up
    dW1 = np.dot(dsigup,x.T)#nx1
    db1 = dsigup#nx1
    W1 -= lr2 * dW1
    b1 -= lr2 * db1
    return W1,b1

num = 1000
for i in xrange(0,num):
    for x in X:
        fc1,sig1,softmax = forward(x)
        #print fc1,sig1,fc2
        if x > 0:
            loss = softmax-np.mat([[0.0],[1.0]])
        else:
            loss = softmax-np.mat([[1.0],[0.0]])

        W1,b1=backward(x,fc1,sig1,loss,W1,b1)
    if i % (num/5) == 0:
            print 'class is', int(softmax.argmax()),'softmax:',softmax,'actual value is :', x >0

test = np.mat([10.0])
_,_,res = forward(test)
print res,res.argmax()," actually is : ", test[0]>0
test = np.mat([-10.0])
_,_,res = forward(test)
print res,res.argmax()," actually is : ", test[0]>0
test = np.mat([-60.0])
_,_,res = forward(test)
print res,res.argmax()," actually is : ", test[0]>0
test = np.mat([100.0])
_,_,res = forward(test)
print res,res.argmax()," actually is : ", test[0]>0

输出为
lass is 0 softmax: [[ 1.00000000e+00]
[ 4.47127940e-11]] actual value is : True
class is 0 softmax: [[ 0.54705728]
[ 0.45294272]] actual value is : True
class is 1 softmax: [[ 0.01308647]
[ 0.98691353]] actual value is : True
class is 1 softmax: [[ 0.00294751]
[ 0.99705249]] actual value is : True
class is 1 softmax: [[ 0.00108553]
[ 0.99891447]] actual value is : True
[[ 0.17952696]
[ 0.82047304]] 1 actually is : [[ True]]
[[ 0.82047849]
[ 0.17952151]] 0 actually is : [[False]]
[[ 9.99890279e-01]
[ 1.09720611e-04]] 0 actually is : [[False]]
[[ 2.51524968e-07]
[ 9.99999748e-01]] 1 actually is : [[ True]]
分类正确。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值