softmax 手写数字识别

1.导入测试数据

from sklearn.datasets import load_digits
import numpy as np
import matplotlib.pyplot as plt
digits = load_digits()
print(digits.data.shape)
print(digits.target.shape)
print(digits.images.shape)
 
digits = load_digits()
digits.images[0]
X=[]
plt.matshow(digits.images[0])
plt.show()
for i in range(len(digits.images)):
    X.append(digits.images[i].reshape(1,64)[0])
X=np.array(X)
data=np.concatenate((X,digits.target.reshape(len(digits.target),1)),axis=1)

2.打乱数据,分成训练集和测试集

np.random.shuffle(data)
train_data_x=data[:1500,0:64]
train_data_y=data[:1500,-1]
test_data_x=data[1500:,0:64]
test_data_y=data[1500:,-1]
train_data_x.shape,train_data_x[5],train_data_y[6]

3. 初始化参数


#初始化参数W
W=np.random.rand(10,64,)
#初始化偏置
b=np.random.rand(10,1)
W,b

4.softmax 函数

#功能函数
#我们要的是exp(1)/(exp(1)+exp(2)+...) ,exp(2)/(exp(1)+exp(2)+...)  向量可以这么写
def softmax(z):
    return np.exp(z)/np.sum(np.exp(z))#这个如果数据是二维的就不能用了,因为会把所有行的值都加起来,我们只
                                                                                        #需要每一行的总和


#数组的话2行乘三列的,会把所有的元素求和,我们只需要每行求和用下面这个softmax函数
#z=WX+b 是一个4个z值,因为有四类,求四组w,,X是(300,2) W(4,2) 相乘应该是300*4
#通过softmax 每行四个值的exp分别与四个exp的和做比值,得到四个概率值为四个类的概率


def softmax2(z):
    exp=np.exp(z)
    sum=np.sum(np.exp(z),axis=1,keepdims=True)#在第二个维度上求和,并且保持维度不变
    return exp/sum

print(softmax2(np.dot(train_data_x,W.T)+b.T))
np.sum(softmax2(np.dot(train_data_x,W.T)+b.T),axis=1)

5.one_hot 编码

#one_hot 编码,把四个类的标签,假如是[1,2,3,4]类,变成[1,0,0,0]代表1类,[0,1,0,0]代表2类....以此类推
def one_hot(temp):
    one_hot=np.zeros((len(temp),len(np.unique(temp))))
    one_hot[np.arange(len(temp)),(temp.astype(np.int))]=1
    return one_hot
one_hot(train_data_y).shape

6.计算y=WX+b

#计算y=WX+b
def computer_hat(W,X,b):
    return np.dot(X,W.T)+b.T

W.shape,train_data_x.shape,b.shape,computer_hat(W,train_data_x,b)

7.计算损失函数

#计算损失函数
def cross_entropy(y,y_hat):
    loss=-(1/len(y))*np.sum(y*np.log(y_hat))
    return loss

8.计算梯度,获得最优W和b


lr=0.001
All_loss=[]
for i in range(1000):
    X=train_data_x
    Z=computer_hat(W,X,b)#z=Wx+b
    y=one_hot(train_data_y)
    y_hat=softmax2(Z)
    loss=cross_entropy(y,y_hat)
    All_loss.append(loss)
    #计算梯度
    gw=(1/len(X))*np.dot(X.T,(y_hat-y))
    gb=(1/len(X))*np.sum(y_hat-y)
    W=W-lr*gw.T
    b=b-lr*gb
    if i%100==0:
        print(loss)
plt.plot(All_loss)
plt.show()

 

9.测试模型

def predict(W,X,b):
    Z=computer_hat(W,X,b)
    y_hot=softmax2(Z)
    return np.argmax(y_hot,axis=1)
#计算正确率
np.sum(predict(W,test_data_x,b)==test_data_y)/len(test_data_y)

正确率大概0.7到0.8之间

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值