当前位置: 首页>編程日記>正文

python做数字识别_用python实现手写数字识别

python做数字识别_用python实现手写数字识别

前言

在之前的学习中,已经对神经网络的算法具体进行了学习和了解。现在,我们可以用python通过两种方法来实现手写数字的识别。这两种方法分别是多元逻辑回归和神经网络方法。

用多元逻辑回归手写数字识别

训练样本简介

首先,可以用逻辑回归实现手写数字识别的多元分类,在ex3data.mat文件中保存着一个包含5000个培训考试训练数据集的手写数字,.mat格式表示这些训练数据集以矩阵格式保存,而不是文本格式。训练集中有5000个训练样本,每个训练样本是一个20X20像素的灰度图像,每一个像素用一个float型数据表示当前位置的灰度强度。20X20像素形成一个400维向量,每一个训练样本形成一个单行矩阵

,5000个训练样本构成一个5000X400的矩阵,每一个行向量代表手写数字图像的训练样本。矩阵

可以如下表示:

数据集第二部分包含一个5000维的矩阵

, 代表输出值的标签,即0,1,2,3,4,5,6,7,8,9.

如下代码所示,首先导入算法实现所需要的python库

import matplotlib.pyplot as plt

import numpy as np

import scipy.io as scio

初始化一些参数

input_layer_size = 400 # 20x20 像素矩阵

num_labels = 10 # 手写数字 0,1,2,3,4,5,6,7,8,9

数据可视化

随机选取

矩阵中的100行向量,并将这些函数传递到displayData函数中,通过调用此函数,我们可以显示出这些向量的灰度图像,具体实现如下所示:

载入数据

data = scio.loadmat('ex3data1.mat')

X = data['X']

y = data['y'].flatten()

m = y.size

绘图函数实现

绘图函数的实现如下所示,具体实现思路就是确定显示图像的像素大小,然后读取训练集数据,依次将其填充到设定好大小的像素矩阵中,具体可参考代码注释。

def display_data(x):

(m, n) = x.shape

# m = 100

# n = 400

# 设置每个数字的宽度与高度(像素)

example_width = np.round(np.sqrt(n)).astype(int)# example_width=20

example_height = (n / example_width).astype(int) #example_height=20

# 计算显示的行数与列数

display_rows = np.floor(np.sqrt(m)).astype(int) #display_rows=10

display_cols = np.ceil(m / display_rows).astype(int)#display_rows=10

# 单个图像之间的间隔

pad = 1

# 设置并初始化显示像素矩阵的大小211*211 ,1+(10*20+1)

display_array = - np.ones((pad + display_rows * (example_height + pad),

pad + display_rows * (example_height + pad)))

# 将每个训练样本显示在矩阵中

curr_ex = 0

for j in range(display_rows):

for i in range(display_cols):

if curr_ex > m:

break

# 每次每行和每列读取一个20*20像素的数字,矩阵大小加21

# 实际上矩阵形式可以认为 10*10*400(20*20像素)

max_val = np.max(np.abs(x[curr_ex]))

display_array[pad + j * (example_height + pad) + np.arange(example_height),

pad + i * (example_width + pad) + np.arange(example_width)[:, np.newaxis]] = \

x[curr_ex].reshape((example_height, example_width)) / max_val

curr_ex += 1

if curr_ex > m:

break

# Display image

plt.figure()

plt.imshow(display_array, cmap='gray', extent=[-1, 1, -1, 1])

plt.axis('off')

最后,绘图实现效果如下

矢量化逻辑回归

参考逻辑回归与正则化的相关知识,矢量化逻辑回归的算法实现代码如下所示:

def lr_cost_function(theta, X, y, lmd):

m = y.size

cost = 0

grad = np.zeros(theta.shape)

reg_theta = theta[1:]

hy = sigmoid(np.dot(X,theta))

cost = np.sum(-y * np.log(hy) - np.subtract(1, y) * np.log(np.subtract(1, hy))) / m + (lmd / (2 * m)) * np.sum(reg_theta * reg_theta)

grad = np.dot(X.T, np.subtract(hy, y)) / m

grad[1:] = grad[1:] + reg_theta * (lmd / m) #正则化

return cost, grad

def sigmoid(z):

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

人为构造一些参数值,计算结果如下所示:

theta_t = np.array([-2, -1, 1, 2])

X_t = np.c_[np.ones(5), np.arange(1, 16).reshape((3, 5)).T/10]

y_t = np.array([1, 0, 1, 0, 1])

lmda_t = 3

cost, grad = lr_cost_function(theta_t, X_t, y_t, lmda_t)

print(cost,grad)

参数训练

在之前的代码中,已经实现了逻辑回归的梯度下降算法,利用训练样本,现在可以通过梯度下降算法训练

参数了,其中,与二元分类不同的是,在本次代码中需要实现的是0-9的数字分类,与用0,1实现二元分类相比,更加复杂,所以在多元分类中,我们用多元逻辑回归算法实现多元分类时,通过0和1来区分每个数字是否识别成功,简而言之,相当于进行了10次二元逻辑回归,只不过每次

的值会发生变化而已。具体实现代码如下所示:

def one_vs_all(X, y, num_labels, lmd):

(m, n) = X.shape

all_theta = np.zeros((num_labels, n + 1))

X = np.c_[np.ones(m), X]

for i in range(num_labels):

initial_theta = np.zeros((n + 1, 1))

iclass = i if i else 10

y_i = np.array([1 if x == iclass else 0 for x in y])

print('Optimizing for handwritten number {}...'.format(i))

def cost_func(t):

return lr_cost_function(t, X, y_i, lmd)[0]

def grad_func(t):

return lr_cost_function(t, X, y_i, lmd)[1]

theta, *unused = opt.fmin_cg(cost_func, fprime=grad_func, x0=initial_theta, maxiter=100, disp=False,

full_output=True)

print('Done')

all_theta[i] = theta

return all_theta

调用one_vs_all()函数,可以看到通过梯度下降算法得到的

参数矩阵如下所示,

用多元逻辑回归算法实现一对多分类预测

现在,我们已经实现了多元逻辑回归算法,现在可以利用梯度下降算法获得的参数实现一对多分类的具体应用了,具体实现代码可以如下表示:

def predict_one_vs_all(all_theta, X):

m = X.shape[0]

num_labels = all_theta.shape[0]

p = np.zeros(m)

X = np.c_[np.ones(m), X]

result = np.dot(all_theta, X.T)

result = np.roll(result, -1, axis=0)

result = np.vstack([np.zeros(m), result])

p = np.argmax(result, axis=0)

return p

pred = predict_one_vs_all(all_theta, X)

print('Training set accuracy: {}'.format(np.mean(pred == y)*100))

经过计算,识别精确率如下所示:

用神经网路实现手写数字识别

初始化一些参数

根据算法要求,首先需要初始化一些参数,具体代码如下所示:

data = scio.loadmat('ex3weights.mat') #加载权重矩阵

theta1 = data['Theta1']

theta2 = data['Theta2']

计算神经网络算法识别效果的精确度

利用神经网络实现多元分类时,不再计算损失函数和梯度,利用输入层,隐藏层和输出层,我们可以直接利用神经网络实现手写数字识别的多元分类。具体实现代码如下所示:

def predict(theta1, theta2, x):

num_labels = theta2.shape[0]

p = np.zeros(m)

x = np.c_[np.ones(m), x]

h1 = sigmoid(np.dot(x, theta1.T))

h1 = np.c_[np.ones(h1.shape[0]), h1]

h2 = sigmoid(np.dot(h1, theta2.T))

p = np.argmax(h2, axis=1) + 1

return p

分析以上代码,我们可以发现这是有一个输入层(

矩阵),一个

隐藏层(由

矩阵计算得到的

),由隐藏层计算得到的输出层(

),最后,由输出层得到分类结果。

通过神经网络得到识别的精确率如下所示:


https://www.fengoutiyan.com/post/14854.html

相关文章:

  • python找数字
  • python获取用户输入的数字
  • python 判断数字
  • python读取输入的数字
  • python 输入数字
  • python提取数字
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機