一个高度近视眼的深度学习实践

1

傍晚,忙了一天的 Ray 终于下班了,摘下眼镜休息下疲劳的双眼,他走到公交车站等 23 路公交车准备回家。

对于一个高度近视眼的人来说,Ray 每天都有很多烦恼,因为他看迎面而来的人是这样婶儿的。

640?wx_fmt=jpeg

每次公交车要过来,他都看不清车身上的号码,这严重影响他挤车的战斗力。

别问我他为什么不戴眼镜,爱臭美的近视眼们都知道为啥。他想起以前在国外出差,公交车上的号码总是以很大的字号印在车身上,就算视力不好也可以看得很清楚。

每到这个时候,Ray 都想跟市政建设提个意见,要是公交车的号码能来个大字版的,那多方便啊!

640?wx_fmt=jpeg

天色越来越晚,好几辆公交车驶过去了,他还站在原地,这会儿又一辆车来了,他打算先上车问一下司机。一只脚刚踏上车,话还没说出来,就被一个大姐撞飞了。他捂着胳膊问:“司机师傅,这是 23 路吗?”司机没好气地说:“你逗我呢,外面不写着呢嘛,你是不认字吗?”Ray 无辜地说:“我是看不清。”司机一脸黑线,打发他赶快往后走。这样尴尬的场景已经不是第一次了,他倍感无助。

忽然,天灵盖被一个灵感击中,大脑伸了一个懒腰,一个 idea 就这样诞生了:“要不做一个手机 App 吧,可以用手机拍摄车身照片,然后自动识别照片中公交车的号码,这样问题不就解决了嘛!”

640?wx_fmt=png

正在暗自窃喜时,他转念一想又似乎想得过于美好了,要怎么识别车上的号码呢?拍下来的照片受到光照、形状、颜色、角度等诸多因素的影响,这样的话问题开始有一点变复杂了。

2

Ray 想起了做图像处理的朋友 Cavy,也许他有办法。于是他把自己的想法跟 Cavy 说了一遍。两人兴高采烈地探讨起这个问题。

Cavy:“你觉得深度学习算法怎么样?是不可以考虑下?”

Ray:“就是那个打败人类顶尖围棋高手的深度学习吗?太深奥了吧!”

Cavy:“没错!就是那个深度学习。其实它的原理并不复杂,不过你要会一些高数的基础知识才行。”

Ray:“数学......我看我还是先从原理来了解下吧!”

640?wx_fmt=png

Cavy:“那我简单跟你说说。深度学习是基于神经网络,而神经网络是基于人类大脑的神经网络。人脑的神经网络是由许许多多神经元组成的网络。还是先从人脑的神经元说起。”

640?wx_fmt=png

“神经元包含了轴突、树突、细胞体等,树突负责从其他神经元接收信息,细胞体负责处理接收到的信息,轴突负责把细胞体处理后的信息输出到其他神经元。细胞体判断输入信号加权之和如果超过某个固定的阈值,就通过轴突发出信号(0或1),这个过程称为点火。可以抽象为数学模型如下(称为神经单元):

640?wx_fmt=png

点火可以用数学式子表示为:

 

640?wx_fmt=png

我们引入加权输入z:

640?wx_fmt=png

点火式子可以用单位阶跃函数y=u(z)表示。”

 

640?wx_fmt=png

 

640?wx_fmt=png

Ray:“单位阶跃函数有间断点,这看起来有点棘手啊。”

Cavy:“我们可以用其他函数 y=a(z)(称为激活函数)来代替单位阶跃函数,将间断点光滑化,常用的是 Sigmoid 函数。此外,为了使式子形式统一,我们把 -θ 替换为偏置 b。加权输入表示为:

640?wx_fmt=png

Sigmoid 函数定义如下:

 

640?wx_fmt=png

640?wx_fmt=png

Ray:“额......说慢点。意思是,Sigmoid 是个光滑函数,处理起来方便许多。神经网络就是将这些神经单元连接起来的,对吧?”

Cavy:“是的,看来你还可以嘛!也不是一点都不懂。其实它把多个神经单元按照一定的层次结构连接起来就形成神经网络。以公交车号码识别为例,我们把公交车号码识别的问题简化一下。假设我们需要在 4*3 像素的单色二值图像中识别数字 0 和 1。可以分 3 层来组织神经网络,分别是输入层、隐藏层和输出层。如下图所示:

 

640?wx_fmt=png

 

输入层有 12 个神经单元,每个神经单元对应一个像素位置(一共有4*3=12个),从图像读取像素信息。隐藏层有 3 个神经单元,负责提取图像的特征。输出层有 2 个神经单元负责输出整个网络的判断结果,上方神经单元的输出值较大则表示网络识别出数字 0,反之如果输出层下方神经单元的输出值较大则表示网络识别出数字 1。

我们约定变量和参数的表示。我们对层从左到右编号,左边输入层为层 1,中间隐藏层为层 2,右边输出层为层 3。变量和参数如下表所示。

 

640?wx_fmt=png

 

利用这个表格的符号,神经网络可以表示如下:

 

640?wx_fmt=png

 

我们写出各层的关系式。输入层比较简单,神经单元的输入值与输出值相同,关系式如下:

640?wx_fmt=png

隐藏层中,激活函数为 a(z),关系式如下:

640?wx_fmt=png

同样地,输出层的关系式如下:

640?wx_fmt=png

有了以上关系式,如果确定权重、偏置等参数,我们就得到一个可以识别 4*3 像素图片中数字 0 和 1 的神经网络。”

“艾玛......让我缓缓,说太多了,口干舌燥的。”Cavy边说边喝了口水。

640?wx_fmt=png

3

Ray:“我觉得我们可以预先准备一些图像数据并标记好答案,通过调整神经网络的权重和参数,使神经网络的输出与图像数据吻合,这样就可以了。”

Cavy:“Bingo!这就涉及到神经网络的学习了。其实我们的目标是神经网络的输出值(预测值)与预先标记的答案(正解)总体误差达到最小。假设我们有 64 张图像作为学习数据,图像与正解对应如下:

 

640?wx_fmt=png

我们引入 2 个变量 t1、t2 作为正解变量,取值如下:

640?wx_fmt=png

我们用平方误差 C 作为目标函数,定义如下:

640?wx_fmt=png

把 64 张输入图像的平方误差加起来,

640?wx_fmt=png

得到的总体误差 CT 称为神经网络的代价函数。”

Ray:“数学上应该有很多最优化数值方法求代价函数 CT 最小值。”

Cavy:“我们通常考虑梯度下降法。这个可厉害了,梯度下降法的原理就跟下山类似,从一个初始位置:

640?wx_fmt=png

沿着梯度的反方向(局部下降最快)走一定的步长 η(学习率)。

640?wx_fmt=png

到一个新的位置:

640?wx_fmt=png

如此迭代若干次后达到最小值点。这里的关键是梯度的计算。”

Ray:“导数计算看起来非常繁杂,不好计算,有点难度。”

Cavy:“为了避免繁杂的导数计算,我们首先引入神经单元误差:

640?wx_fmt=png

通过数学推导,可以把梯度分量用神经单元误差表示如下:

640?wx_fmt=png

而神经单元误差有如下漂亮的递推关系(m 为层 l+1 的神经单元数目):

640?wx_fmt=png

用以上式子逐层递推计算,就可以避免繁杂的偏导数。这就是误差反向传播法。”

Ray:“这个方法很精妙!那回到我的问题,实际的公交车号码由 0-9 共十个数字组成,这就需要更多的神经单元组成更大的神经网络了。”

Cavy:“可以用卷积神经网络(CNN)来减少神经元数量,简化网络,提高效率。卷积神经网络是深度学习的一种实现方式,它是由输入层、隐藏层和输出层组成。它的隐藏层具有一定结构,由卷积层和池化层组成。卷积层的神经单元负责扫描图像,找出特征在图像中的分布。池化层神经单元负责整合卷积层的结果。这样只需用较少的基本特征就可以进行图像识别。”

Ray:“emmmm......话说我觉得我还是要深入了解一下才行,跟你比还是差点火候。”

Cavy:“看你还算机灵,送你一本学深度学习的书吧。兄弟有空记得看看。这本《动手学深度学习》我就送你了。这个书里包含了书籍和视频,还有专门的讨论区,亚马逊专家会不定时给予回复,其他的小伙伴也会给帮助,一定要看!!你要想学深度学习看这个可以了”

Ray:“听起来还不错!希望能拯救我的秃头。”(狗头.jpg)

640?wx_fmt=png

☟☟☟

 

640?wx_fmt=jpeg

《动手学深度学习 (平装)》

出版时间:2019年6月

640?wx_fmt=png

扫码查看详情

作者:阿斯顿·张(Aston Zhang) 李沐(Mu Li)[美] 扎卡里 C. 立顿(Zachary C. Lipton)[德] 亚历山大 J. 斯莫拉(Alexander J. Smola)

 编辑推荐:

  • 亚马逊科学家李沐等重磅作品;

  • 交互式实战环境下动手学深度学习的全新模式,原理与实战完美结合

  • 韩家炜/Bernhard Schölkopf/周志华/张潼/余凯/漆远/沈强 联袂推荐

  • 加州大学伯克利等全球15 所知名大学用于教学;

本书旨在向读者交付有关深度学习的交互式学习体验。书中不仅阐述深度学习的算法原理,还演示它们的实现和运行。

与传统图书不同,本书的每一节都是一个可以下载并运行的 Jupyter 记事本,它将文字、公式、图像、代码和运行结果结合在了一起。此外,读者还可以访问并参与书中内容的讨论。

如何在短时间内成为Python工程师?

https://edu.youkuaiyun.com/topic/python115?utm_source=csdn_bw

那这本大神新作

是否很贵呢?

在优快云当然是不贵的

现在购买可享受8.5折优惠价

扫描下方二维码即可购买!

640?wx_fmt=png

 

640?wx_fmt=gif

码书商店是优快云专为我们的用户建立的一个商店,这里提供大量的技术书籍,除了书籍我们也提供生活类的相关产品,如耳机、键盘等,或者你们如果有需求也可以联系码书商店的客服或者在公众号下留言你们需要的产品,我们尽量满足大家需求哦。

作为码书商店的运营人员,诚邀你们进入我们的“优快云码书福利群”,群里会不定时的给大家赠书书籍、优惠券等,有书籍推荐或者物流方面信息也可群里咨询~目前群已满100人,需要加群的请扫下方二维码添加微信,拉你入群哦~

640?wx_fmt=png

 

 

640?wx_fmt=gif

### 使用深度学习实现近视眼图像分类的方法和模型 #### 数据准备与预处理 为了有效利用深度学习技术进行近视眼分类,高质量的数据集至关重要。通常情况下,数据收集自多种渠道,包括但不限于公开数据库如iChallenge-PM[^3]。该数据集中不仅包含病理性近视患者的眼底图片,也涵盖了非病理性近视患者的样本。 对于获取到的原始图像,在输入至神经网络之前需经过一系列预处理操作以提升后续建模效果。具体措施可能涉及尺寸调整、灰度化转换以及标准化等步骤,确保所有输入具有一致性和可比性[^1]。 ```python import cv2 from PIL import Image import numpy as np def preprocess_image(image_path, target_size=(224, 224)): img = Image.open(image_path).convert('L') # 转换为灰度图 img_resized = img.resize(target_size) # 统一大小 img_array = np.array(img_resized) # 图片转数组 normalized_img = (img_array - np.mean(img_array)) / np.std(img_array) # 归一化 return normalized_img ``` #### 构建卷积神经网络(CNN) 针对此类二元或多类别分类任务,常采用卷积神经网络作为基础框架。CNN能够自动提取特征并完成模式识别工作。下面给出了一种简单的ResNet50变体结构用于解决这个问题: ```python from tensorflow.keras.applications.resnet50 import ResNet50 from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, GlobalAveragePooling2D base_model = ResNet50(weights='imagenet', include_top=False) x = base_model.output x = GlobalAveragePooling2D()(x) predictions = Dense(2, activation='softmax')(x) # 假设有两个类别:正常 vs 近视 model = Model(inputs=base_model.input, outputs=predictions) for layer in base_model.layers: layer.trainable = False # 冻结底层权重参数 ``` #### 训练过程中的注意事项 当准备好上述组件之后就可以着手于实际训练环节了。值得注意的是,在此期间应当合理设置超参(比如批次大小batch size)、优化器(optimizer),并通过交叉熵损失函数(cross entropy loss function)评估每轮迭代后的表现情况。此外,考虑到过拟合风险的存在,建议引入早停机制(Early Stopping)或者正则项(regularization term)[^2]。 ```python from tensorflow.keras.callbacks import EarlyStopping from tensorflow.keras.optimizers import Adam optimizer = Adam(lr=0.0001) model.compile(loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"]) early_stopping_callback = EarlyStopping(monitor='val_loss', patience=5) history = model.fit( train_generator, epochs=epochs, validation_data=val_generator, callbacks=[early_stopping_callback], verbose=True ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值