tnblog
首页
视频
资源
登录

python 打破图像识别的瓶颈(学习笔记)

3064人阅读 2023/5/5 19:22 总访问:3467452 评论:0 收藏:0 手机
分类: AI

python 打破图像识别的瓶颈(学习笔记)

手写识别


mnist数据集的图片采用的28*28的灰度图。

灰度图显示的原理


一行有28个像素点,一共有28行,每一个像素用一个字节的无符号数表示它的等级,如果是0就是黑色,是1就是白色,是中间的数就是不同程度的灰色。我们通过让不同像素点的灰度值不同而达到显示的效果


如果用键盘打出来识别这个图像没什么难度,因为键盘打出来的都是相同的。


但人写得难免手抖,比如写成如下几张,这样没规则的就无法进行判断了。

神经网络识别图像


我们知道神经网络的输入是一个多维向量的,或者是一个数组。


而图片是一个方形的像素灰度值集合,所以我们只需要将这些像素一个一个拉出来形成一个矩阵就可以了。
mnist数据集每张图片的尺寸是28*28,所以这将拉出784个像素,每个像素都是一个灰度值和起来就是一个矩阵。


依次送进一个神经网络进行训练就行,最开始人们利用深度全连接神经网络取得了不错的效果,但并不是十分的好。
在机器学习的工作流程中,我们在训练时使用的数据集称为训练集,当然我们希望训练集的准确率很高,这意味着模型拟合效果很棒,在训练集数据之外拿一些新的数据进行预测,看看新的训练的数据如何?这些用来测试的数据称之为测试集


如果训练的准确率67%,很低那这个模型多半是废了。


如果在训练集上的准确率很高,但在测试集上准确率出现了明显的下降,那说明这个模型的泛化能力不行也就很难推而广之的进行实际应用,这种现象称之为:过拟合。
比如我们用一个过分复杂的模型,去拟合一些实则比简单的问题,我们以豆豆数据集举例子。


我们可以看到在训练集上拟合得很好但在测试集上反而没那么好,这就是过拟合。
由于模型不够泛化,或者说没有很好的把握事物的主要矛盾,解决神经网络的过拟合现象也有很多方式:

方式
调整网络结构
L2正则化
节点失活(Dropout)


mnist数据集有60000个训练集样本和10000个测试集样本,而人们发现在用全连接神经网络做mnist数据集识别,以及其他的图像识别的时候,尽管我们把网络堆叠的越来越深,神经元也添加的越来越多,也用尽了各种防止过拟合的方法,但网络的泛化能力任然越来越难有突破。

什么是卷积?


某人专门做了一份研究,通过卷积神经网络把准确率提高到了99.77%,那么什么是卷积呢?卷积是怎么工作的?


首先把这些像素点,通过卷积核与原始图像相乘之后再相加,得到卷积后图像。
当然一个像素块的灰度值是一个字节最大值是255,所以我们想把这个卷积后的结果显示出图像,需要把超过255的像素点都处理成255。


第一个三乘三的是一个卷积核,也被称为过滤器
所以为什么这种卷积运算,可以提取图像的诸如轮廓,花纹颜色的特征呢?我们用一个简单的例子,通过下面的卷积核可以把垂直的边缘提取出来。


这是卷积核卷积的两个结果,会发现结果图片都开始显现垂直条纹的特征。


为了更加的简单,我们将取出一个杯子的边缘部分,在卷积的时候你会发现它的左边部分全是灰度值60,右边部分全是0。
而卷积核的左侧部分是1、中间是0、右侧是-1,所以在右侧的时候元素相乘再相加就等于0.
右侧部分相乘相加等于0,中间部分相乘相加等于180。


这样的卷积核是进行垂直边缘提取,同样通过颠倒一下卷积核可以进行水平边沿提取。
我们可以做一个简单的测试。


然后我们回到的手写识别,当我们使用普通的神经网络进行处理的时候,你认为神经网络认为左边的1是更像右边的1呢?还是右边的7?


很明显是7,虽然作为人能够很好的认为它是1,但是把这些像素块当成数组的时候,与7一模一样,但它相对于第一个1相对于向后挪动了一点点,反倒和第一个1对应位置的特征值相去甚远。


如果我们使用卷积核,结果就不一样了。

编程实践


通过keras的mnist进行加载数据并展示出来。

  1. from keras.datasets import mnist
  2. import numpy as np
  3. from keras.models import Sequential
  4. from keras.layers import Dense
  5. from keras.optimizers import SGD
  6. import matplotlib.pyplot as plt
  7. (X_train, Y_train), (X_test, Y_test) = mnist.load_data()
  8. print("X_train.shape:"+str(X_train.shape))
  9. print("Y_train.shape:"+str(Y_train.shape))
  10. print("X_test.shape:"+str(X_test.shape))
  11. print("Y_test.shape:"+str(Y_test.shape))
  12. # 打印第一个标签样本值
  13. print(Y_train[0])
  14. # 训练集的第一个样本数据
  15. # 绘图模式为:灰度图(gray)
  16. plt.imshow(X_train[0],cmap='gray')
  17. plt.show()

  1. from keras.datasets import mnist
  2. import numpy as np
  3. from keras.models import Sequential
  4. from keras.layers import Dense
  5. from keras.optimizers import SGD
  6. import plot_utils_2
  7. import matplotlib.pyplot as plt
  8. from keras.utils.np_utils import to_categorical
  9. (X_train, Y_train), (X_test, Y_test) = mnist.load_data()
  10. print("X_train.shape:"+str(X_train.shape))
  11. print("Y_train.shape:"+str(Y_train.shape))
  12. print("X_test.shape:"+str(X_test.shape))
  13. print("Y_test.shape:"+str(Y_test.shape))
  14. # 打印第一个标签样本值
  15. print(Y_train[0])
  16. # 训练集的第一个样本数据
  17. # 绘图模式为:灰度图(gray)
  18. plt.imshow(X_train[0],cmap='gray')
  19. plt.show()
  20. # ndarray 的 reshape函数改变数组的形状。
  21. # 把28*28的图片像素转成784的数组。
  22. # 除以255的目的在于降低梯度下降的复杂度
  23. # 训练集
  24. X_train = X_train.reshape(60000,784)/255
  25. # 测试集
  26. X_test = X_test.reshape(10000,784)/255
  27. # 转换成One Hot编码
  28. Y_train = to_categorical(Y_train,10)
  29. Y_test = to_categorical(Y_test,10)
  30. # 设置训练层以及神经元数量
  31. model = Sequential()
  32. # input_dim = 784表示设置了784个像素块作为输出
  33. model.add(Dense(units=256, activation='relu', input_dim=784))
  34. model.add(Dense(units=256, activation='relu'))
  35. model.add(Dense(units=256, activation='relu'))
  36. # 输出十个值哪个最大哪个就最像
  37. model.add(Dense(units=10, activation='softmax'))
  38. # 输出的预测值实际上是一个概率值。
  39. # 但是十个输出的概率和大于了1,所以我们需要一个函数将这十个相加等于1就是softmax函数
  40. # 设置策略,0.05的阿尔法每次,按照准确率
  41. # 使用多分类交叉熵代价函数
  42. model.compile(loss='categorical_crossentropy',optimizer=SGD(lr=0.05),metrics=['accuracy'])
  43. model.fit(X_train, Y_train, epochs=5000, batch_size=1024)
  44. # 添加测试数据进行测试模型的泛化能力
  45. loss, accuracy = model.evaluate(X_test, Y_test)
  46. # 打印出损失和准确率
  47. print("loss"+str(loss))
  48. print("loss"+str(accuracy))


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

python学习 1-安装

Ptyhon非常简单易用的面向对象的脚本语言,跨平台 入门简单python分2个版本 Python2、Python3。Python 2.7 将于 2020 年结...

python学习 2-基本语法

基础:python脚本语言,不需要编译(像C#、Java、PHP、C++需要编译成机器可识别的语言), 而直接由解释器解释,很多地方类似...

python学习 3-爬虫基本介绍 及简单实例

爬虫爬虫就是一只猪,蜘蛛。。 网络蜘蛛。互联网是一个网由各个网站组成。无数的蜘蛛就在网上到处爬,根据网址从一个网站爬...

python实例 1-日志抓取处理 补错附日志小技巧

有时候数据出了问题,可以从日志中恢复数据(如果你没记日志..没备份..→_→..)一、日志展示介绍个平常自己用的小方法,如...

python实例 2-12306抢票(一) 登陆

开坑年关将近,终于对12306下手了,,平安夜撸代码,攻克了12306的登陆 2018-12-24 22:16:00没错 这篇博客就写从零开始的异...

python安装pip以及使用pip安装requests等模块

pip很简单的介绍pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。如果想...

python数据集合区别

列表(list):可读写,值可以重复,有序排列,初始化语法:['tom',‘jerry’]元组(tuple):只读,值可以重复,...

python实例 2-12306抢票(二) 下单

第二篇 刷票与下单1.记住登陆上一篇写了登陆:http://www.tnblog.net/cz/article/details/162 为了方便调试 不让每次登陆都...

使用VS Code开发python

Vs Code开发Python可以很好的支持代码调试、智能提示、代码对齐等1:下载VS Codehttps://code.visualstudio.com/Downloadvs ...

python变量与命名

Python使用等号 ( = ) 作为赋值运算符,例如a = 66 就是一条赋值语句,作用就是将66赋值给变量a。Python是弱类型语言,弱类...

python关键字和内置函数

Python中包含了如下所示的关键字:上面这些关键字都不能作为变量名。另外,Python 3还提供了如下表所示的内置函数:也不能...

python基础输入和输出

Python使用print()函数向打印程序输出,采用input()函数接收程序输入。print()函数的语法格式如下:print(value,...,sep=&#...

python基本数据类型

Python包含两大类基本数据类型:数值类型、字符串类型,三大类组合数据类型:集合类型、序列类型和字典类型.数值类型:整型...

python中通过fake_useragent生成随机UserAgent

fake_useragent第三方库,来实现随机请求头的设置;GitHub ---> https://github.com/hellysmile/fake-useragent安...

python 升级pip

一条命令即可: python -m pip install --upgrade pip 安装成功后,一般是在python目录下面的Scripts里边的

python html编码解码

使用方法:html.escape(s)与html.unescape即可 import html s="<div>jsdlfjsl</div>" #html编...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术