脑-机接口中的深度学习
推动该领域发展的现状和挑战
Robina Weermeijer 在 Unsplash 上的照片
什么是脑机接口?
脑机接口(Brain-Computer Interface,BCI)是一种提取对象(人或动物)的大脑活动模式并将其转换为交互式应用的消息或命令的系统。大脑活动模式是用脑电图(EEG)获得的信号。
完全用我们的思想控制设备的概念并不新鲜。众所周知,科幻小说和好莱坞电影描绘了这一点。已经进行了几项研究和实验,如猴子控制机械臂自己进食、控制轮椅和控制光标每分钟打大约八个字。
除了控制设备,脑机接口的不同应用和研究包括:
- 睡眠模式
- 癫痫
- 注意缺陷多动障碍
- 意识障碍
- 麻醉深度
- 疲劳和精神负荷
- 情绪
- 情感
BCI 应用的挑战
BCI 系统的工作依赖于破译大脑活动的能力。但是单个 EEG 数据可能包含伪像、来自电力线的干扰、测量和环境噪声。它也包含受试者正在进行的思想的干扰。这些假象/噪声掩盖了实际的目标信号。
在实验过程中,由于疲劳、情绪甚至是眨眼等细微的身体动作,我们的大脑都会产生不同的信号。因此,针对特定用户训练的分类器可能很难概括同一个人在不同时间记录的数据。
EEG 信号是高度用户特定的,因此,大多数 BCI 系统是为每个用户校准的。在佐治亚理工学院的研究中,他们在看不见的对象(不属于训练数据集的一部分)上获得了 38%的准确率,在看得见的对象上获得了 75%的准确率。
Hajinoroozi 等人对被试内和跨被试预测都进行了测试,结果显示跨被试模型的表现总是比被试内模型差。
在数据收集中,基本事实通常取决于主体必须执行的操作。因此,这可能是棘手的,因为不可能知道受试者在想什么,或者受试者准确地聚焦在哪里。
BCI 尤其具有挑战性,因为该理论涉及多个学科:
- 神经系统科学
- 信号处理
- 机器学习
- 计算智能
- 认知科学
- 物理学
这些挑战表明,为什么向大众市场推出 BCI 系统是一个巨大的挑战。
为什么深度学习适用于 BCI 应用
近年来,深度学习在各种任务中表现显著;事实证明,它优于使用手工制作功能的“传统”机器学习方法。
将具有高度可变性和非平稳噪声的脑电活动解码成有意义的信号是困难的。这些困难导致使用机器学习算法来解决 BCI 应用。
深度学习具有从高维数据的分层表示中提取特征和学习的能力,并且已经在计算机视觉和自然语言处理领域中导致了许多真实世界的应用。鉴于其在其他领域的有效性,深度学习似乎有望从原始脑电图数据中学习,以提取更好的特征,从而提高性能和鲁棒性。
EEG 数据集是高维的,具有大量参数的深度学习模型可能能够直接学习生鸡蛋信号。
常见的深度学习架构
为了解决 BCI 应用中的挑战,研究人员致力于改善从 EEG 信号中提取基本特征,并建立能够更好地概括的模型。
受限玻尔兹曼机
受限玻尔兹曼机器(RBM)基于训练数据的对数似然的梯度上升来学习输入数据的概率分布。深度信念网络(DBN)由三个 RBM 组成,其中 RBM 可以以深度学习的方式堆叠和训练。
递归神经网络
鉴于脑电图数据具有时间结构,频率随时间变化,递归神经网络(RNN)是合适的。通过递归的 RNN 模型序列数据,这是在时间上展开 RNN 以形成前馈神经网络来应用反向传播。
长短期存储器(LSTM)是一种 RNN 架构,由使用带自连接存储单元的门控单元的存储块组成。LSTM 解决了传统递归神经网络的梯度消失问题。
卷积神经网络
最近的发现显示了卷积神经网络(CNN)处理时间序列的有效性,因为它们能够从原始数据中学习最相关的特征。CNN 可以扩展到更高维度来学习任务所需的特征。卷积层通常由卷积、非线性激活和池化组成。
CNN 在多项任务上超越了之前的 BCI 竞赛获胜者。然而,支持向量机的集合获得了比 CNN 方法稍好的性能。几项研究探讨了将 DBN 与 CNN 以及 RNN 与 CNN 合并的想法。DBN 和 CNN 的结合产生了有希望的结果。
Schirrmeister 等人探究了浅层和深层 CNN 模型的效果。他们表明,较浅(5 层)的全卷积模型比深度模型性能更好。
张等从准确度、精度、F-measure 和 G-mean 等方面评估了范围从 2 到 10 深度优于更深的模型。
由于可用于 BCI 的训练样本数量很少,许多研究工作表明,那些具有更少参数的较浅架构被证明更有用。
规范化
正如在 BCI 应用的挑战中提到的,EEG 信号是高度可变的。由于 EEG 包含来自正在进行的大脑活动和测量噪声的干扰,所以在受试者之间甚至在同一受试者中,EEG 信号可能有很大不同。
这些类型的噪声建议使用正则化,以保持网络的权重较小,从而减少过拟合。神经网络的常见正则化方法是 L1 和 L2,它们根据权重的大小和符号对权重进行惩罚。辍学技术也是非常常用的。
这些正则化技术通常会略微提高性能,大多数研究至少使用了一种正则化技术。
当前最先进的模型
深度学习模型目前的性能尚不清楚它是否能胜过传统的处理技术。这是因为与自然图像不同,在自然图像中有 ImageNet 数据集作为基准数据集,EEG 没有基准数据集。
在 BCI,研究中使用了许多不同的任务和不同的数据集,报告的结果高度偏向于特定数据集的个体研究。每项研究的报告绩效指标和方法各不相同,缺乏标准化的报告方法。
再现性对于推动一个领域的发展至关重要;这在技术发展非常迅速的计算机视觉领域已经看到了。随着开源数据集的可用性和代码的共享,计算机视觉社区实现了适合现实世界应用的最先进的性能。
不幸的是,对于 BCI 研究,许多研究人员使用私人数据集,他们不公开发布他们的代码。获取数据更加昂贵,带注释的数据需要主题专家的贡献。
深度学习在 BCI 应用中的问题
因为训练深度学习模型通常需要大的训练数据集。不像计算机视觉研究社区,那里有大量的数据可用;有限的可用 BCI 数据对推进该领域提出了挑战。高质量的数据也很难获得,可以采用扩充数据集或使用生成性对抗网络。
深度学习模型在记忆数据集方面很棒,但鉴于脑电图的信噪比较低,模型可能会记忆噪声数据。因此,即使使用各种正则化技术,性能也会受到很大影响。
张等强调深度学习模型容易受到对抗性攻击。后果可能从仅仅是用户困惑和沮丧,到显著降低用户的生活质量,甚至到故意伤害用户使其陷入危险。
通常,深度学习模型被视为黑盒,其中它不提供对决策背后的神经生理现象的洞察。这让临床医生和最终用户感到不舒服,特别是当理解模型如何以及为什么产生输出可能对做出明智的临床选择至关重要时。由 Sturm 等人进行的一项研究使用逐层相关性传播将决策转换为热图,指示每个数据点与决策结果的相关性。
深度学习模型可能需要很长时间来训练;因此,在新用户和每次使用之前,需要很长时间来校准。我们不能指望新用户花几个小时记录他们在不同任务上的大脑模式,也不能让 BCI 用户每次想使用系统时都要等待。
结论
研究人员需要开发更强大和一致的算法,以便于训练和部署。算法必须能够处理小的训练样本,处理有噪声的信号,很好地概括不同时间的用户以及不同用户的情绪和概括。
许多研究是在少数对象上离线评估的,但对于实际的 BCI 应用来说,机器学习需要实时工作。
深度学习推进因缺乏数据和代码共享而滞后;当研究人员公开共享数据集和代码时,进展会快得多。
在将 BCI 应用程序推广到大众市场之前,有许多问题需要解决。
感谢阅读!当我开始我的博士之旅,研究脑机接口的时候。如果你有兴趣阅读更多关于脑机接口的内容,请关注我。我将会写下我所学到的和我将要做的事情。
他们如何相互激励、共同进步、相互受益
towardsdatascience.com](/the-fascinating-relationship-between-ai-and-neuroscience-89189218bb05) [## 数据科学家:21 世纪最肮脏的工作
40%的吸尘器,40%的看门人,20%的算命师。
towardsdatascience.com](/data-scientist-the-dirtiest-job-of-the-21st-century-7f0c8215e845)
金融深度学习:这是金融业的未来吗?
使用深度学习加速金融行业的增长
深度学习现在引领着金融创新的潮流吗?计算金融、机器学习和深度学习多年来一直是金融部门的重要组成部分。这些技巧、技术和技能的发展使得金融业在过去几十年里实现了爆炸性增长,并变得更加高效、敏锐,对其参与者来说利润丰厚。这将继续成为金融业未来的驱动力吗?
深度学习怎么用在金融上?
金融深度学习是在金融部门的各个部分使用神经网络方法的艺术,例如:
- 客户服务
- 价格预测
- 证券管理
- 欺诈检测
- 算法交易
- 高性能计算
- 风险管理
- 信用评估
- 和操作
随着新的深度学习焦点的出现,推动金融行业的人们不得不通过从理论金融知识的理解中分支出来适应。他们现在被迫学习如何使用 Python、云计算、数学和统计学,还采用了 GPU(图形处理单元)的使用,以便更快地处理数据。
在本帖中,我们将重点介绍:
- 金融中的算法交易
- 金融中的价格预测
- 金融领域的欺诈检测
每个部分还包括一个有用的教程链接。
金融中的算法交易
算法交易是创建一个计算模型来实现金融市场中的买卖决策的过程。除了基于数学模型,交易者还可以使用深度学习技术,使用近似模型来实现买卖交易。
算法交易策略
- 趋势跟随
- 这是最常见的策略类型,投资者将跟踪价格变动、移动平均线、突破等模式。没有对价格的预测,相反,目标是根据投资者提供的逻辑指令执行买卖策略。
- 套利机会
- 从金融资产的差价中获利被称为“金融套利”。这基本上是当你购买一个更便宜的资产,并在不同的市场以更高的价格出售,从而在没有任何净现金流的情况下获利。如果投资者能够成功执行利用差价的策略,就有机会进行有利可图的交易。
- 数学建模
- 均值回归——这是基于一种观点,即资产的高低价格将回归到其平均价值。一旦价格低于平均值,就被视为买入资产的机会,希望价格高于平均值。资产的平均价值不断变化,因此需要持续监控。
- 成交量加权平均价格(VWAP) —该策略分解大订单,并使用特定股票的历史成交量曲线向市场发布动态确定的较小订单块。目的是在 VWAP 附近执行订单,从而从平均价格中获益。
- 时间加权平均价格(TWAP) —时间加权平均价格策略分解一个大订单,并使用在开始和结束时间之间平均划分的时间段向市场发布动态确定的较小订单块。目标是在开始和结束时间之间以接近平均价格的价格执行订单,从而将市场影响降至最低。
参见本教程用 Python Python、Zipline 和 Quantopian 进行金融编程,学习如何用 Python 进行量化交易。
金融中的价格预测
几十年来,金融行业的交易员和专家一直严重依赖计算机,但借助运行 GPU 的高性能计算(HPC ),他们已经能够将计算机提升到一个新的水平。这些新的工作站和服务器为海量数据集提供了大量存储选项。这些系统还允许人们执行复杂的、占用大量内存的算法,这些算法需要在本地机器上使用数百万甚至数十亿个数据点来执行金融交易策略,以及使用深度学习技术进行价格预测。
用于深度学习价格预测的技术
- 递归神经网络(RNN) —短时间范围
- RNN 用于具有连续顺序的数据,如时序数据库。
- 长短期记忆模型(LSTM)——与 RNN 相比,时间跨度更长
- LSTM 是 RNN 的变体,增加了参数以支持更长的记忆,因此预测的时间范围可以更长。
- 多层感知器(MLP)
- MLP 是一类前馈神经网络,由输入层、隐含层和输出层组成。这也适用于时间序列预测,因为它:
- 对异常值、噪声数据和缺失值具有鲁棒性
- 非线性建模
- 支持多元预测
- 多步预测
本教程可以带你通过使用 Python 和 TensorFlow 2 和 Keras 进行金融资产价格预测
金融领域的欺诈检测
金融界充斥着欺诈和欺骗。黑客和骗子总是试图窃取机密的个人信息和公司内部信息来出售。世界各地的政府都在对公司进行严格审查,以升级他们的网络安全和欺诈检测系统。网络安全也是2020 年就业市场上最受欢迎的职位之一。
机器学习和深度学习现在被用于自动化搜索数据流以发现可能是安全威胁的异常的过程。
自动编码器
用于异常检测的深度学习算法是自动编码器。自动编码器神经网络是一种无监督的学习算法,它应用反向传播,将目标值设置为等于输入值,这实质上是对数据进行编码和压缩,并将数据重构为尽可能接近原始数据的表示。
自动编码器由两部分组成:
- 编码器 —获取输入数据并将其压缩成一个数量向量。
- 解码器 —从编码器获取数据并重建原始输入。
本教程将带您了解带有 Keras、TensorFlow 和深度学习的自动编码器
对深度学习在金融领域的潜力略知一二
金融行业是受 AI(人工智能)新发现影响最大的行业之一。由于近年来市场波动性增加和网络犯罪威胁增加,预测增加回报的机会和使用人工智能保护数据是两个增长的领域。
该行业产生了数万亿个数据点,需要创新的解决方案来处理和分析这些数据。更严格的监管以及来自政府、行业和消费者的越来越大的压力迫使金融行业的参与者在保护数据的同时仍然增加投资者的回报。
谁来运营你的深度学习项目?
金融行业曾经被世界上最著名学校的 MBA 们所主宰。现在,焦点转移到了拥有编程语言知识的技术人才身上,如 Python、以及云计算和深度学习。
工程师在设置和管理 GPU 驱动的硬件以应对新挑战方面也发挥着重要作用。了解你在处理什么数据,你需要使用的深度学习应用和框架,你想要得到的结果,这些都需要大家共同努力。如果您的团队中缺少工程师,寻找像 Exxact 这样的公司可以帮助您了解您的需求,并提供预先配置、设置好的解决方案,一插上电源即可投入使用。你只需要确保你手头有技术人员来使用它,或者获得必要的知识来自己运行它。
几何中的深度学习:弧长学习
入门
使用深度神经网络(DNN)解决了几何中的一个基本问题。我们从监督学习方法的例子中学到了一个几何性质。由于最简单的几何对象是曲线,我们重点学习平面曲线的长度。为此,重构了基本长度公理,建立了弧长网。
介绍
曲线长度的计算是许多现代和古典问题中最主要的组成部分之一。例如,手写签名涉及计算沿曲线的长度(Ooi 等人)。当一个人在现实生活中处理长度计算的挑战时,他面临着几个约束,如加性噪声、离散化误差和部分信息。在本帖中,我们回顾了我们的工作,预印本可在线获得:
在目前的工作中,我们解决了几何领域中的一个基本问题,我们的目标是使用 DNN 重建一个基本属性。最简单的几何对象是曲线,评估曲线的简单度量是长度。在经典文献(Kimmel,2003)中有许多用于计算长度和其他几何性质的封闭形式的表达式。然而,由于我们知道 DNN 的强大功能,我们非常有动力通过设计 DNN 来重构曲线长度(弧长)属性。为简单起见,我们将重点放在二维欧几里得域上。
一点几何学
因此,在我们深入研究机器学习公式之前,让我们简要回顾一下长度属性。2D 曲线的欧几里德长度的一般方程由下式给出
(1)
主长度的公理是可加性、不变性、单调性和非负性。关于连接的长度相加,关于旋转和平移不变,它是单调的,并且根据定义,任何曲线的长度都是非负的。
为了求一条连续曲线的长度,应该把它离散化。离散化过程包含误差。例如,让我们看看蓝色曲线。该曲线的粗略离散化可以导致橙色离散化曲线。显然,将曲线划分成许多无穷小的线可以使离散化误差最小化。
作者图片
在离散化误差中,我们可以发现由于长度方程(1)中涉及的非线性和导数而出现的附加噪声、部分信息和许多其他误差。
那么,我们如何把它表述为一项学习任务呢?
学习方法
我们用一种监督学习方法解决了这个问题,该方法具有满足长度公理的独特损失函数。得到的训练模型称为 ArcLengthNet。它获得一个 2D 向量作为输入,表示平面欧几里得采样曲线,并输出它们各自的长度。我们创建了一个包含 20,000 个示例的数据集,以完全支持 DNN 培训。这些大量的例子旨在涵盖曲线转换并满足不同的模式。我们数据中的一般曲线如下所示
其中 R 为旋转矩阵, T 为平移向量, a 为振幅,φ为相位。
按作者分列的数字
设计了一个独特的损失函数:
其中 s1、s2 和 s3 是保持等式L(S1)=L(S2)+L(S3)O是通过模型传递示例可以调整权重:
架构:设计了一个简化的基于 CNN 的架构。它包括一个卷积层和两个只有一个激活功能的全连接层。每条曲线由 N = 200 个点表示。该表示被插入到具有大小为 3 的小内核的卷积层中。它被处理成一个全连接层,该层通过一个整流线性单元(ReLU)激活函数向另一个最终输出长度的全连接层仅输出 10 个权重。
通过用反向传播方法小批量传递许多示例来训练 DNN。训练过程以 200 个样本为一批进行 100 个时期。我们使用的优化器是动量和重量衰减的随机梯度下降(SGD)。
作者图片
作者图片
经过 100 个时代后,模型得到了很好的训练。定义了一个维持集来测试这些体系结构在看不见的数据上的性能。该集合包含 5,000 个没有在训练集或测试集中使用的示例。ArcLengthNet 获得的最小均方误差为 0.17。在此维持集上测试了 ArcLengthNet 的单调属性,其中在真实长度和 ArcLengthNet 之间建立了线性关系:
作者图片
摘要
提出了一种基于学习的曲线长度重构方法。深度神经网络重构基本公理的能力得到了证明。所得结果可进一步用于改进手写签名和重构更多的微分几何性质和定理。如需更多信息,请随时给我发电子邮件。
鸣谢 一年前,我在以色列理工学院(Technion)上了一堂名为“几何计算机视觉”的课,由 Ron Kimmel 教授主讲。他向我介绍了微分几何领域的一个基本问题,并要求我使用深度学习方法重建弧长。我要感谢基梅尔教授向我介绍了这个迷人而富有挑战性的问题。
— — — — — — — — — — — — — — — — — — — — — — — — —
关于作者
Barak 获得了以色列理工学院的航空工程学士学位(2016 年)、硕士学位(2018 年)以及经济和管理学士学位(2016 年,成绩优异)。他曾在高通工作(2019-2020),在那里他主要研究机器学习和信号处理算法。巴拉克目前正在海法大学攻读博士学位。他的研究兴趣包括传感器融合、导航、深度学习和估计理论。
访问我的个人网站:www.Barakor.com
领英https://www.linkedin.com/in/barakor/
推特:巴拉克 2
— — — — — — — — — — — — — — — — — — — — — — — — —
参考
[1]j .伯格,纽约证券交易所,2018 年。复杂几何形状中偏微分方程的统一深度人工神经网络方法。神经计算 317,28–41。
[2]布朗斯坦,M.M .,布鲁纳,j .,勒村,y .,斯拉姆,a .,范德盖恩斯特,p .,2017。几何深度学习:超越欧几里得数据。IEEE 信号处理杂志 34,18–42。
[3] Do Carmo,议员,2016。曲线和曲面的微分几何:修订和更新第二版。多佛信使出版公司。
[4] Graves,a .,Liwicki,m .,Fern andez,s .,Bertolami,r .,Bunke,h .,Schmidhuber,j .,2008 年。一种新的用于无约束手写识别的连接主义系统。IEEE 模式分析与机器智能汇刊 31,855–868。
[5]君特,b,《父母研究报告》, 1990 年。计算参数曲线的弧长。IEEE 计算机图形与应用 10,72–78。
[6]黑尔韦格,H.B .,克里斯菲尔德,m .,1998 年。处理急剧骤回的新弧长法。计算机与结构 66,704–709。
[7]r .基梅尔,2003 年。图像的数值几何:理论、算法和应用。斯普林格科学与商业媒体。
[8]派,g .,韦茨勒,a .,基梅尔,r .,2016 年。学习平面曲线的不变表示。arXiv 预印本 arXiv:1611.07807。
深度学习和医疗保健:闪光的不一定是金子
深度学习和医疗保健之间复杂关系的概述。
全部登上人工智能列车
虽然这种流行趋势对我们这些在这个领域工作的人来说肯定是令人愉快和兴奋的,但它同时也带有危险的因素。信息论确实是一个有价值的工具,并将继续发展[……],但它肯定不是通信工程师或其他任何人的灵丹妙药。[……]当人们意识到使用一些令人兴奋的词汇,如信息、熵、冗余,并不能解决我们所有的问题时,我们多少有些人为的繁荣很容易在一夜之间崩溃。
——克劳德·e·香农《赶时髦》,1956 年
从最早的时候起,人工智能 (AI) 就经常被过分看好,但却表现不佳。五十多年后,香农的关注仍然非常及时:只要将’*信息论’*与’*机器学习’*和’信息、熵、冗余’与’深度学习、神经网络、人工智能’切换,你就会突然被投射到 1950 年到 2020 年。
如今, 大家都想造艾 。大型科技公司每年都推出更复杂、资源需求更大的神经网络。资金流动,炒作上升,甚至像医疗保健这样相当保守的分支机构也开始随波逐流,而没有足够担心其影响。
关于人工智能,深度学习 (DL) 是这十年来真正的最有价值的技术,最近在不同的科学领域成为一项真正的增值技术,并作为最接近人类推理的东西而受到关注。
只不过我们还没到那一步。
在此,我们将讨论为什么即使****炒作驱动的深度学习潮流不能也不应该被阻止**,医疗保健提供商也应该更多地关注谁可能真正受益于这种新方法。**
跳上深度学习列车的数据科学家(naz mul Hasan Khan/Caters News)
人工智能和医疗保健:比《暮光之城》更好的爱情故事
医学和人工智能之间的关系和人工智能领域本身一样古老。从这个意义上来说,我们可以说艾发现了医疗保健中的第一个,【大】粉碎了它的青春。
早期和第一次分手
最早的医学专家系统**(即由硬编码 if-else 语句组成的计算机化问题解决程序)实际上可以追溯到 1960 年初。正如每个青少年的爱情故事一样,最初的时刻令人难忘,热情也达到了顶峰,但事情很快开始变得有点复杂:由于硬件限制,缺乏基础,以及来自学术界和新闻界的大量悲观情绪**,医疗保健——以及其他许多科学分支——对人工智能及其应用逐渐失去了兴趣。第一次分手是在空气中。****
恢复
所谓的艾冬一直持续到 1990 年。与此同时,研究人员专注于如何利用专家知识实现基于演绎学习的患者护理临床建议。也是在这几年,朱迪亚·珀尔和理查德·尤金·那不勒斯提出了贝叶斯网络的想法,这是最有魅力的统计模型之一,开创了临床推理,即使在它诞生 45 年后仍然有很多话要说。
贝叶斯分类器和贝叶斯理论很快成为一种成熟的实践,与古老的回归模型相结合**,在至少二十年的时间里,在医学研究的许多领域带来了巨大的进步。然后互联网发生了。**
复合了
从 90 年代中期开始,随着计算机硬件和计算能力的显著提高,收集的数据量开始呈指数级增长。十年后,随着 EHRs(电子健康记录)的普及,医疗领域也开始有大量的数据可用。很快,医疗保健研究人员开始从知识驱动的方法转向数据驱动的方法:浪漫又开始了。
近二十年在 PubMed 发表的 ML 论文[ Valliani et al. 2019 ]
直到数据把我们分开
快进到 2010 年代和大数据革命,一种“新的”奇特的人工智能技术以其令人印象深刻的成就震撼了科学界。深度学习算法开始一个接一个地打破记录,逐渐将各种口味的人工神经网络** (ANNs)作为最先进的技术应用在自然语言处理、计算机视觉和语音识别等领域,导致医学成像也取得了重要进展。**
医疗保健中数据和深度学习的指数级增长[ 方等 2016 ®、比尔斯等 2018 (L)]
深度学习的两个方面
为什么大家都爱深度学习?
与传统的机器学习(ML)算法相反,深度学习由海量数据推动,需要配备强大 GPU 的高端机器在合理的时间框架内运行。这两个要求都很昂贵,那么为什么公司和研究实验室认为果汁值得压榨呢?
在传统的机器学习技术中,大多数应用的 特征需要由领域专家来识别,以降低数据的复杂性,并使模式对学习算法的工作更加可见。深度学习算法最大的优势是尝试自己从数据中学习高级特征。这在理论上消除了对领域专业知识和核心特征提取的需求。
*放射学中*模式分类的一个例子。与传统的 ML 算法相反,DL 框架将琐碎的特征提取步骤封装在学习过程本身中。(艾时代杂志)
在需要高度自动化但缺乏对特征工程领域理解的复杂问题中(例如图像分类、自然语言处理、机器人技术)深度学习技术正在飞速发展,达到前所未有的精确度水平。
深度学习在医疗保健中的应用
通过处理来自各种来源的大量数据,如放射图像、基因组数据和电子健康记录,深度学习可以帮助医生分析信息和检测多种情况,试图解决许多必要的医疗保健问题,如降低误诊率和预测手术结果。以下是深度学习目前正在展示的一些知名医疗领域:
- 【肿瘤检测】:卷积神经网络(CNN)的采用显著提高了癌症的早期检测,在筛查乳腺钼靶摄影中的乳腺癌检测等问题上达到了非常高的准确率[ 沈等 2019 ]。在该领域,当在诊断成像研究中识别重要特征时,DL 算法正在接近甚至超过人类诊断医生的准确性[ Haenssle et al. 2018 ]。
- 医院再入院、住院时间和住院死亡率预测 : DL-powered 算法可以访问每个患者的数万个预测值,包括自由文本注释,并自动识别哪些数据对特定预测很重要,而无需手动选择专家认为重要的变量 Rajkomar 等人 2018 。
- 药物发现和精准医疗:一种新药的发现总是被学术界和普通大众的兴奋所包围,但药物开发周期非常缓慢且昂贵,只有不到 10%进入市场。DL 可用于自动产生指纹和更有效的特征或用于从头药物设计,降低过程成本[ 徐等 2018 ]。
- 自然语言处理:电子病历在世界各地医疗中心的引入为医疗服务提供者打开了一个新的信息来源:自由文本。从非结构化数据中提取有用的可操作信息有助于医疗保健的许多方面,如摘要、自动报告、问题回答,当然还有决策。然而,的临床文本 往往支离破碎, 不合语法,电报式并且大量使用首字母缩写和缩写,这甚至能难倒最聪明的 NLP 算法。
然而——如题——即使是深度学习,也不是所有闪光的都是金子。数据科学家一直在上述所有应用中投入大量精力,但其中一些应用暴露出在实际用例场景中难以克服的局限性,迫使基于 DL 的方法停留在仅供研究的隔离区。但是,为什么这些方法在某些领域表现出色,而在另一些领域却举步维艰呢?为什么我们努力在真实用例场景中取得重大进展?
在这里,我们将重点关注医疗保健中深度学习的两个最重要的概念问题。
深度学习和医疗保健问题:可解释性和因果关系
应对医疗保健意味着应对人们的生活。这意味着细心、自信、透明、谨慎、敏感和解释为什么以及如何得出某种诊断的能力。同样,我们希望在内科医生和外科医生身上找到这些品质,我们也应该在我们的算法中寻找它们。这就是深度学习显示其局限性的地方。****
让我们以自然语言处理为例。如今,医疗保健领域中由人类生成的书面/口头数据量非常庞大。据估计,近 80%的医疗保健数据在创建后仍处于非结构化和未开发状态。临床记录可能是医疗保健中最被忽视的输入,发生这种情况不是因为它们不提供信息,而是因为很难处理这种类型的数据。
我们已经提到了利用这种信息如何能够显著提高模型的准确性,但是性能才是最重要的吗**?**
在医疗保健中,一种非常流行的处理文本进行预测的方法是使用单词嵌入**,这是一种由各种类型的神经网络驱动的多维、密集、数字表示的单词。
患者的临床记录可以以不同的方式组合,检索文档嵌入或患者嵌入。由于我们现在处理的是数字向量而不是文本,我们可以简单地将它们输入我们最喜欢的分类算法。**
患者嵌入管道的示例:收集患者 P1 的临床笔记句子 S,并将其分解为单词 W。然后使用深度学习将这些单词 W 转换为数字向量 W,然后将这些向量组合两次以检索患者嵌入 p,这些嵌入 p 也是向量。这种嵌入现在可以成为我们想要的每个分类算法的输入的一部分。
让我们假设现在我们开发了一个癌症早期检测模型,当我们通过 300 维患者嵌入包括非结构化数据时,它看到了惊人的 30%的准确性提升。我们合理地猜测我们的模型正在使用临床记录** 中的一些非常相关的信息来评估患者的状况。**
但是 这是什么 相关信息?
正如我们所说,嵌入只是密集的数字向量。使用深度学习将单词转换为向量,并将它们合并在一起,完全打乱了桌子上的卡片,使得无法猜测负责患者分类的单词/句子的组合。
注意机制和系数只能告诉我们哪些****成分与预测结果最相关,但是由于我们失去了单词和嵌入成分之间的联系,我们无法真正理解 为什么这些成分如此重要。****
准确性与可解释性的权衡(数据科学忍者)
即使模型达到了更好的精确度,我们也不能仅仅因为组件#217 这样说就诊断出一种疾病。使用降维是好的,但是如果我们需要理解决策的来源并在一个更大的(人类)知识框架内评估它,我们必须能够还原这个过程。
这就引出了因果关系问题**。**
因果(哈佛大学)
人工智能先驱 Yoshua Bengio 因对深度学习的发展做出的贡献而获得图灵奖,他最近表示 DL 必须学习更多关于因果关系的知识才能实现其全部潜力。
换句话说,他说,深度学习需要开始问为什么事情会发生。
深度学习从根本上是盲目的因果。与真正的医生不同,深度学习算法无法解释为什么特定的图像或临床记录可能暗示疾病。理解因果关系,特别是在医疗保健领域,将使现有的人工智能系统更加智能和高效:一个深入了解因果关系的机器人可以制定假设,想象场景,并学习如何在它们实际发生之前解决它们。
这种心态是人类天性所特有的,认知科学实验表明,理解因果关系是人类发展和智力的基础,尽管我们仍然不清楚我们是如何形成这种知识的。另一方面,深度学习算法,不太擅长概括,无法将它们从一个上下文学到的东西应用到另一个上下文。这在医学上是非常有限的,因为每一项诊断和预后任务都是基于一个非常复杂的因果联系网络。
在机器人的肩膀上(Newsparent.com)
结论
目前为止我们得到了什么
深度学习 在过去十年里已经成为游戏规则的改变者,我们已经看到了它可以在医疗领域实现的许多方式。然而,我们必须指出,当我们处理涉及患者生命的非常复杂和微妙的情况时,它的阴暗和狭隘的性质是一个问题。如果我们不能解开它以理解它得到结论的方式,那么拥有一个极其精确的模式识别工具在临床决策中是无用的。
这就是为什么简单的线性回归仍然在许多真实的医疗用例场景中战胜复杂的神经网络**。我们不能相信无法完全解释的伪黑箱,同样,如果因果关系是该学科的基石,我们也不能依赖能够掌握相关性但不能掌握因果关系的高度特定的模型。**
未来会怎样
加里·马库斯在他的新书《重塑人工智能》的后记中写道:
“由深度理解驱动的人工智能将是第一个能够像孩子一样学习的人工智能,容易、强大、不断扩展其对世界的知识,通常只需要一两个新概念或新情况的例子,就可以创建一个有效的模型。”
这可以说是我们应该指出的下一个重大成就,但这并不容易。创造一种超越人类水平的智能远比我们被引导去相信的要复杂得多。这个世界是复杂和开放的,我们今天拥有的高度专业化的狭窄机器还不能完全被信任来完成这种复杂性得到充分展示的任务,如个性化医疗。
参考资料和进一步讲座
在这里,你可以找到我的主要资料来源,以及一些非常有趣的阅读材料,如果你有兴趣深入挖掘深度学习和医疗保健之间的复杂关系,我建议你看一看。
- 学习理清因果机制的元转移目标,Bengio 等人,2019
- 人工智能先驱希望他的算法能够理解“为什么”
- 人类兼容——斯图尔特·罗素
- 重启人工智能——加里·马库斯和欧内斯特·戴维斯
- 因果关系——朱迪亚珍珠
- 平衡:准确性与可解释性
希望这篇博客文章能够给你一个关于在医学中使用深度学习的许多含义的概述。如果你觉得有帮助,请在评论区留下你的想法并分享!
** [## Tommaso Buonocore -作者-走向数据科学| LinkedIn
查看世界上最大的职业社区 LinkedIn 上 Tommaso Buonocore 的个人资料。托马索列出了 5 项工作…
www.linkedin.com](https://www.linkedin.com/in/tbuonocore/)**
医疗保健中的深度学习— X 射线成像(第 1 部分—X 射线的基础知识)
这是关于深度学习使用的系列文章的第 1 部分,重点是 X 射线成像(胸部 X 射线)。在这里,我们将讨论 X 射线的基础知识,从它的历史,工作原理到成像。
x 射线成像是最古老的医学成像方法之一,也是最流行的医学成像方法之一。x 光是拯救生命的技术,实际上是偶然发明的。德国物理学家威廉·伦琴在气体放电管中进行电子束实验时发现了这项技术。在做这个实验时,他注意到当电子束运行时,他实验室的荧光屏开始发绿光。现在,这并不是一个不寻常的现象,但是伦琴的屏幕被厚纸板挡住了,他认为厚纸板可以阻挡辐射。他的发现有趣的一面是,他发现这是某种穿透性的辐射,但不能确切地指出它实际上是什么。
当一只手放在光束前面时,神奇的事情发生了,它在屏幕上产生了骨头的图像。这一突破使得 X 射线在发现后立即得到了完美的应用。这一双重发现(X 射线及其应用)标志着人类历史上医学成像领域最大的发现之一。
它让专业人员有机会在不需要任何侵入性手术的情况下观察人体内部的疾病。它甚至允许他们看到轻微修改的软组织。
图一。第一张 x 光照片(威廉·伦琴。— [1],公共领域,【https://commons.wikimedia.org/w/index.php?curid=5059748】
那么什么是 X 射线呢?
你可以把 X 射线想象成光线。两者都是光子以波的形式携带的电磁能量。这两种波的主要区别是射线的能级或波长。我们人类有能力感知可见光波长的光线。但是越来越长的波长不在我们的可见光谱范围内。x 射线是更短更高能量的波。
图二。光谱(作者 Ulflund——该图是维基共享资源不同图片的汇编。上面的图是我自己做的,最初是作为我自己的作品上传的。结晶学图像来自文件:Lysozym diffraction.png,用户:Del45。乳房 x 线照片来自 Nevit Dilmen 的 40F MLO DMMG.png 文件。CT 图像来自文件:Ct-workstation-neck.jpg,作者:ChumpusRex。行李扫描仪图像来自文件:用户在 VTBS.JPG 行李检查用户:Mattes。、CC BY-SA 3.0、【https://commons.wikimedia.org/w/index.php?curid=22545004】T4
X 射线是如何工作的?
x 射线是由原子内电子的运动产生的。给定 X 射线的具体能级取决于原子中电子在轨道间下落的距离。
当任何给定的光子与另一个原子碰撞时,原子可以吸收光子的能量,并将电子提升到更高的水平。在这种情况下,光子的能量必须与两个电子之间的能量差相匹配。如果这没有发生,那么光子就不能引起轨道之间的移动。
这意味着当 X 射线的光子穿过身体时,每个组织的原子对光子的吸收或反应是不同的。软组织由更小的原子组成,因此由于光子的高能量,它们不能很好地吸收 X 射线。
另一方面,骨骼中的钙原子要大得多,因此它们会吸收 X 射线光子,从而导致 X 射线图像上的不同视图。
在 x 光机内:
图 3。在 x 光机里(作者丹尼尔·w·里奇——自己的作品,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=16622562)
在 x 光机内部,有一对电极,一个阴极和一个阳极。该仪器被放置在通常由玻璃制成的真空管内。阴极通常是加热的灯丝,阳极是由钨制成的平圆盘。当阴极被加热时,在高电位差下,电子从阴极喷出并向阳极移动。由于电极对上的高电压,电子以极高的速度向阳极移动。电子最终撞击阳极的钨原子,并撞击原子较低轨道中的松散电子。随着电子从较高的轨道落到这些较低的能级,额外的能量以光子或 X 射线的形式释放出来。X 射线就是这样产生的。
但是在需要检查软组织的情况下,需要添加造影剂。造影剂通常是对 X 射线不透明并聚集在软组织中的液体。为了检查血管,医生将这种介质注入静脉。通常这些图像是用荧光显微镜实时观察的。
图 4。胆囊切除术中观察软组织(由 HenrikP 医用 x 射线(荧光镜),公共领域,【https://commons.wikimedia.org/w/index.php?curid=318366)
x 射线成像:
为了从 x 光机获得图像,医生在病人的另一侧使用胶片或传感器。当 X 射线穿过人体时,它们会与沿途的许多原子相互作用。最终记录在胶片或探测器上的是所有这些相互作用的总和。
图 5。x 射线成像(BruceBlaus —自己的作品,CC BY-SA 4.0,https://commons.wikimedia.org/w/index.php?curid=44921292)
图 6。胸部 x 光片(作者 Diego Grez—radio grafía _ lupules _ Francis ca _ lor ca . jpg,抄送 BY-SA 3.0,【https://commons.wikimedia.org/w/index.php?curid=10302947】T2
参考资料:
- 《x 光片》。科学任务理事会。 NASA 。
- 罗伯特·诺韦林(1997)。斯夸尔放射学基础。哈佛大学出版社。第五版。国际标准书号0–674–83339–2。
- 【x 光】。 牛津英语词典 (第 3 版。).牛津大学出版社。2005 年 9 月。
医疗保健中的深度学习— X 射线成像(第 2 部分—了解 X 射线图像)
这是深度学习在 X 射线成像上的应用的第二部分。这里的重点是理解 X 射线图像,特别是胸部 X 射线。
解读胸部 x 光片:
图一。胸部 x 光——1)肺部,2)右半膈肌,3)左半膈肌,4)右心房,5)左心房(作者迭戈·格雷兹——radiografía _ pulmonaes _ Francis ca _ lor ca . jpg,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=10302947。作者编辑)
x 射线图像是灰度图像,即图像具有一些暗的像素和一些亮的像素。在医学成像术语中,这些图像具有范围从 0 到 255 的值,其中 0 对应于完全暗的像素,255 对应于完全白的像素。
图二。灰度条
X 射线图像上的不同值对应不同的密度区域:
- 深色-身体上充满空气的位置将显示为黑色。
- 深灰色——皮下组织或脂肪
- 浅灰色——像心脏和血管这样的软组织
- 灰白色——像肋骨这样的骨头
- 亮白色——存在金属物体,如起搏器或除颤器
医生解读图像的方式是通过观察不同密度之间的边界。如图 1 所示,肋骨呈灰白色,因为它们是致密的组织,但由于肺部充满空气,因此肺部呈黑色。类似地,肺下面是半膈,它也是软组织,因此呈现浅灰色。这有助于我们清楚地了解肺部的位置和范围。
因此,如果两个具有不同密度的物体彼此靠近,它们可以在 X 射线图像中被区分开来。
现在,如果肺部发生了什么事情,比如肺炎,那么,空气密度大的肺部会变成水密度大的肺部。这将导致分界线褪色,因为像素密度将开始接近灰度条。
进行胸部 X 射线检查时,通常要求患者站立,并从前到后(前-后)或从后到前(后-前)拍摄 X 射线。
使用胸部 x 光可以区分的各种解剖结构:
图二。解剖气道— 1)气管,2)右主支气管,3)左主支气管(作者 Diego Grez—radiografía _ pulmones _ Francis ca _ lor ca . jpg,CC BY-SA 3.0,【https://commons.wikimedia.org/w/index.php?curid=10302947】T2,作者编辑)
图 3。解剖膈肌和胸膜——1)胸膜,2)右半膈肌,3)左半膈肌(作者迭戈·格雷兹(Diego Grez——radiografía _ pulme es _ Francis ca _ lor ca . jpg,CC BY-SA 3.0,https://commons.wikimedia.org/w/index.php?curid=10302947,作者编辑)
图 4。解剖骨骼——1)锁骨,2)后肋,3)前肋,4)椎体(作者 Diego Grez——radiografía _ pulme es _ Francis ca _ lor ca . jpg,CC BY-SA 3.0,【https://commons.wikimedia.org/w/index.php?curid=10302947】,作者编辑)
图 5。胸部 x 光片上的心脏解剖(作者 Mikael hgg strm,M.D.-作者信息-重复使用图片使用 ZooFari、Stillwaterising 和 Gray’s Anatomy creators 的源图片-编辑文件:ZooFari 的 Heart diagram-en . SVG(attribute-Share like 3.0 un ported license)。文件:气管(透明)。png(来自《实习医生格蕾》,公共领域)文件:Chest _ x ray _ PA _ 3–8–2010 . png by Stillwaterising(公共领域)静脉系统的进一步概述:(2011)。“一篇绘画性文章:重症监护室的导管放射学”。印度放射学和成像杂志 21 (3): 182。DOI:10.4103/0971–3026.85365。ISSN 0971–3026。合成:米凯尔·海格斯特伦,CC BY-SA 3.0,【https://commons.wikimedia.org/w/index.php?curid=55155319】T4
以上图像的目的是显示对于一个没有受过训练的医生来说,从胸部 x 光图像中解释不同的解剖结构是多么困难,更不用说任何异常了。
这正是深度学习派上用场的地方。通过深度学习,即使是对身体的不同异常或解剖结构一无所知的人,也可以在预测各种异常时得出令人满意的结果。当然,如果没有庞大的数据集或来自训练有素的医生的地面真实数据,这些都是不可能的,但尽管如此,自我训练算法甚至可以得出这样的结果这一事实令人困惑。
在接下来的几个部分中,我们将使用 Python、卷积神经网络深入研究 X 射线图像可视化,并研究它们如何训练,并得出预测。
参考资料:
- Fred A. Mettler、Walter Huda、Terry T. Yoshizumi、Mahadevappa Mahesh:“放射学和诊断核医学中的有效剂量:目录”——放射学 2008 年;248:254–263
- “胸部 X 线质量—投影”。放射学大师级。检索于 2016 年 1 月 27 日。
- 胸透,OB-GYN 101:产科入门&妇科。2003 年、2004 年、2005 年、2008 年 Brookside Associates 有限公司医学教育部门,2010 年 2 月 9 日检索。
医疗保健中的深度学习— X 射线成像(第 3 部分—使用 Python 分析图像)
这是深度学习在 X 射线成像上的应用的第 3 部分。这里的重点是使用 Python 查看和分析 X 射线图像。
既然我们已经了解了未经培训的专业人员解读 X 射线图像有多么困难,那么让我们来看看一些查看和分析图像及其直方图的技术,以及一种使用 Python 编程将图像和标签相加的技术。
图像数据集:
图像数据集(胸部 x 光片)从 Kaggle 获得。数据集可通过以下链接获得—https://www . ka ggle . com/paultimothymooney/chest-x ray-pneumonia/data
图一。不同肺炎情况下的胸部 x 光检查(资料来源- Kaggle 公共数据集,详情见参考文献 1)
关于数据集—直接引用自 Kaggle challenge —数据集分为 3 个文件夹(train、test、val ),并包含每个图像类别(肺炎/正常)的子文件夹。有 5,863 个 x 光图像(JPEG)和 2 个类别(肺炎/正常)。胸部 X 线图像(前-后)选自广州市妇女儿童医疗中心 1-5 岁的儿童患者的回顾性队列。所有的胸部 x 光成像都是作为患者常规临床护理的一部分进行的。对于胸部 x 射线图像的分析,最初通过去除所有低质量或不可读的扫描对所有胸部射线照片进行质量控制筛选。图像的诊断然后由两名专家医生进行评级,然后被批准用于训练人工智能系统。为了解决任何评分错误,评估集也由第三方专家检查。
正如内容中明确指出的那样,挑战中共有 5863 幅图像可用,这些图像被分为肺炎和正常两类,并进一步分为训练/测试和验证集。为了使挑战更加困难,我们将数据分为三类,正常、细菌性肺炎和病毒性肺炎。在这一部分中,我们将只关注图像——用 python 加载它们,从医学成像的角度分析图像的各个重要方面,并将图像和标签一起加载。让我们直入主题吧。
导入必要的库
*#importing all the necessary libraries*
**import** **numpy** **as** **np**
**import** **matplotlib.pyplot** **as** **plt**
**import** **os**
**import** **cv2** **as** **cv**
**import** **random**
Numpy — Numpy 是 Python 中最常用的库之一。它用于对多维数组和矩阵进行运算,并执行高级数学函数来对这些数组进行运算。
matplotlib——用于在 python 中创建静态和动态可视化的库。
OS——python 内置的一个模块。它提供了与操作系统交互的功能。
cv2 — OpenCV(开源计算机视觉库)—一个非常重要的库,主要用于计算机视觉。其他类似的库有 SimpleITK 和 Pillow (Python 图像库)。
random —生成伪随机数的模块。
研究数据集中的单个图像:
*#load a single image from the bacteria folder*
**def** load_image(path):
**for** img **in** os.listdir(bacteria_path):
print('Image name =',img)
image = cv.imread(os.path.join(bacteria_path, img))
**break**
**return** image
如前所述,数据集中的图像被分成三类。1-正常,2-细菌(细菌性肺炎),3-病毒(病毒性肺炎)。
上面的代码片段创建了一个函数 load_image,它将用于从训练集的细菌文件夹中加载一个图像。os.listdir 用于列出该目录中的所有文件。在这种情况下,它可以用来访问细菌文件夹中的所有图像。接下来,它将打印图像的名称。最后,使用 OpenCV 库读取图像。
Break-在这里是必要的,这样只访问第一个图像,否则函数将遍历细菌文件夹中的所有图像。
*# Investigate a single image*
bacteria_path = 'H:/All Files/Kaggle/chest_xray/train/2_BACTERIA/'
image = load_image(bacteria_path)
plt.imshow(image, cmap='gray')
plt.colorbar()
plt.title('Raw Chest X Ray Image')
print(f"The dimensions are **{image.shape[0]}** pixels height and **{image.shape[1]}** pixels width")
print(f"The maximum pixel value is {image.max():.4f}")
print(f"The minimum pixel value is {image.min():.4f}")
print(f"The mean value of the pixels is {image.mean():.4f}")
print(f"The standard deviation is {image.std():.4f}")
输出-
在这个代码片段中,首先定义了图像的路径。然后,通过调用函数 load_image,将文件夹中的第一幅图像加载到变量“image”中。然后使用 matplotlib.imshow 查看图像。之后,打印图像尺寸、灰度栏中的最大像素值和最小像素值。还计算图像像素的平均值和标准偏差。
接下来,我们绘制图像所有像素的直方图。直方图是用不同高度的条来显示数据的图形。
# plot a histogramplt.hist(image.ravel(),256,[0,256])
plt.show()
输出-
Matplotlib.hist 用于绘制直方图。由于图像大部分是暗的,我们在灰度条的零位置上看到一个巨大的像素簇。
这些是可以使用 OpenCV 和 matplotlib 在图像上执行的一些基本功能。我们将在后面的部分看到 OpenCV 的更多用途。
一起加载图像和标签并调整图像大小
*# loading the path of the train images*
path = 'H:/All Files/Kaggle/chest_xray/train/'
train = os.listdir(path)
定义了训练集的路径,路径下的目录保存在‘train’中。在这种情况下,有三个文件夹,1_Normal、2_Bacteria 和 3_Virus。
folders=[]
folders = [f **for** f **in** sorted(os.listdir(path))]
print(folders)
输出-
[’ 1 _ 正常’,’ 2 _ 细菌’,’ 3 _ 病毒’]
我们创建一个空列表——文件夹。然后,使用 os.listdir 遍历路径,将文件夹名排序并存储在列表中——“folders”。
labels = folders
print (f'The labels are **{labels}**')
*# setting the size of images that we want*
image_size = 256
print(f'All images to be resized into **{image_size}*****{image_size}** pixels')
输出-
文件夹名称被设置为图像的标签,并且图像尺寸被选择为 256256。也就是说,所有图像的大小都将调整为 256256。如果我们浏览数据集,我们会看到所有的图像都有不同的维度,为了将图像输入到卷积神经网络(CNN)中,有必要将图像调整到相同的维度。
*# defining a function to load images and labels together*
*# this function will also resize the images*
**def** load_train(path):
images = []
**for** label **in** labels:
direc = os.path.join(path, label)
class_num = labels.index(label)
**for** image **in** os.listdir(direc):
image_read = cv.imread(os.path.join(direc,image),cv.IMREAD_GRAYSCALE)
image_resized = cv.resize(image_read,(image_size,image_size))
images.append([image_resized,class_num])
**return** np.array(images)
这里我们定义了一个函数,根据标签名称加载所有图像,将它们的大小调整为 256*256 像素,并返回图像数组。
创建一个空列表来保存所有图像。然后运行“for”循环,从所有三个文件夹中提取所有图像。os.path.join 用于合并目录中的路径。简历。im read _ gray 将所有图像转换为灰度格式。cv.resize 用于将图像大小调整为 256*256 像素。。“append”用于将所有图像追加到一个列表中,该列表最终被转换为一个数组并使用 return 语句返回。
*#load all the training images to train_images*
train_images = load_train(path)
print(f'Shape of the training images = **{train_images.shape}**')
训练图像的输出形状= (5208,2)
然后调用函数“load_train ”,所有训练图像都作为数组保存在 train_images 中。训练图像的形状为(5208,2)
*#loading the images and labels seperately in X and y, to be used later for training*X = []
y = []
**for** feature, label **in** train_images:
X.append(feature)
y.append(label)
print (f'Length of X = {len(X)}')
print (f'Length of y = {len(y)}')
输出-
为了训练神经网络,需要分离图像和标签,并且通过在 train_images 上循环,并且通过提取图像和它们相应的标签来完成。
*# checking the number of images of each class*
a = 0
b = 0
c = 0
**for** label **in** y:
**if** label == 0:
a += 1
**if** label == 1:
b += 1
**if** label == 2:
c += 1
print (f'Number of Normal images = **{a}**')
print (f'Number of Bacteria images = **{b}**')
print (f'Number of Virus images = **{c}**')
*# plotting the data*
x_pos = [i **for** i, _ **in** enumerate(labels)]
numbers = [a,b,c]
plt.bar(x_pos,numbers,color = 'green')
plt.xlabel("Labels")
plt.ylabel("No. of images")
plt.title("Images for each label")
plt.xticks(x_pos, labels)
plt.show()
输出-
为了检查每个类中的图像数量,运行了一个 for 循环。然后使用用于创建条形图的 matplotlib.bar 绘制结果。
从数据中可以清楚地看出,属于每个标签的图像数量有很大的差异。如果用这些数量的图像训练网络,它可能会偏向具有最多标签的类。这就是所谓的阶级不平衡问题。因此,每个类有相似数量的图像是必要的,我们将在下一部分讨论这一点。
*# Displays images*
*# Extract 9 random images*
print('Display Random Images')
*# Adjust the size of your images*
plt.figure(figsize=(20,10))
**for** i **in** range(9):
num = random.randint(0,len(X)-1)
plt.subplot(3, 3, i + 1)
plt.imshow(X[num],cmap='gray')
plt.axis('off')
*# Adjust subplot parameters to give specified padding*
plt.tight_layout()
最后,我们使用随机模块从训练集中生成九幅随机图像,然后使用 matplotlib 绘制这些图像。
这是这部分的结尾。正如我们所见,对于医学成像分析来说,正确理解数据集是非常重要的,在本例中是 X 射线图像。在下一部分中,我们将使用 matplotlib 和 OpenCV 处理类不平衡问题和更多操作。
参考资料:
- 从丹尼尔-克马尼获得的数据集;张、康;Goldbaum,Michael (2018),“用于分类的标记光学相干断层扫描(OCT)和胸部 X 射线图像”,Mendeley Data,v2 http://dx . doi . org/10.17632/rscb jbr 9 SJ。
- 通过基于图像的深度学习识别医学诊断和可治疗的疾病- (2018),作者:Daniel S. Kermany,Michael Goldbaum,Cai,Carolina C.S. Valentim,Huiying Liang,Sally L. Baxter,Alex McKeown,Ge Yang,Xiaokang Wu,Yan,Justin Dong,Made K. Prasadha,Jacqueline Pei,Magdalene Y.L. Ting,,Christina Li,Sierra Hewett 等,出版物:Cell Publisher。
医疗保健中的深度学习——X 射线成像(第 4 部分——类别失衡问题)
这是深度学习在 X 射线成像上的应用的第 4 部分。这里的重点是解决阶级不平衡问题的各种方法。
正如我们在上一部分—第三部分—(https://towards data science . com/deep-learning-in-health care-x-ray-imaging-Part-3-analyzing-images-using-python-915 a 98 fbf 14 c)中看到的,胸部 x 光数据集存在图像的不平衡。这是我们在上一部分看到的每个类的图像的条形图。
图一。各个阶层形象的不平衡(作者图片)
在医学成像数据集中,这是一个非常常见的问题。由于大多数情况下,数据是从各种不同的来源收集的,并且不是所有的疾病都像其他疾病一样流行,所以数据集往往是不平衡的。
那么,如果我们在不平衡的数据集上训练神经网络,会出现什么问题呢?答案是,与图像较少的班级相比,网络倾向于从图像较多的班级学到更多东西。也就是说,在这种情况下,该模型可能预测更多的图像是“细菌性肺炎”,即使这些图像可能来自其他两个类别,这在处理医学图像时是不期望的结果。
此外,应该注意,在处理医学图像时,模型的最终精度(训练精度或验证精度)不是模型性能所基于的正确参数。因为,即使模型在特定类别上表现不佳,但是在具有最大图像的类别上表现良好,准确度仍然会很高。实际上,我们希望模型在所有的类中都表现良好。因此,还有其他参数,如灵敏度(召回率/真阳性率(TPR))、特异性(真阴性率(TNR))、精确度或阳性预测值(PPV)和 F 值,这些参数应该被考虑来分析训练模型的性能。我们将在后面讨论混淆矩阵的部分详细讨论这些。
还必须维护一组单独的图像,在这些图像上,模型既没有被训练也没有被验证,以便检查模型如何在它以前从未见过的图像上执行。这也是分析模型性能的必修步骤。
解决阶级不平衡的各种方法:
有各种各样的方法来解决阶级不平衡的问题。最好的方法是为少数民族阶层收集更多的图像。但是在某些情况下这是不可能的。在这种情况下,通常这三种方法是有益的:a. 加权损失 b. 欠采样 c. 过采样
我们将详细介绍每种方法:
- 更新损失函数—加权损失
假设我们用的是 二元交叉熵损失函数 。损失函数看起来像这样-
L(X,y) = - log P(Y =1 |X)如果 Y =1 和-log P(Y=0 |X)如果 y=0
这测量分类模型的输出,其输出在 0 和 1 之间。(这个损失函数只有在我们做二元分类问题的时候才起作用。对于多个类别,我们使用分类交叉熵损失或稀疏分类交叉熵损失。我们将在后面的部分讨论基本的损失函数)。
示例-如果图像的标签为 1,并且神经网络算法预测标签为 1 的概率为 0.2。
让我们应用损失函数来计算本例的损失。请注意,我们对标签 1 感兴趣。所以,我们要用损失函数 L 的第一部分,损失 L 是-
L =-log 0.2 = 0.70
这是算法在这个例子中得到的损失。
对于另一个标签为 0 的图像,如果算法预测该图像为标签 0 的概率为 0.7,那么我们使用损失函数的第二部分,但实际上不能直接使用。相反,我们使用不同的方法。我们知道最大概率可以是 1,所以我们计算标签的概率是 1。
在这种情况下,L =-log(1–0.7)=-log(0.3)= 0.52
现在我们来看多个例子,关于阶级不平衡。
图一。阶级不平衡,概率和计算损失(来源:图片由作者创建)
在图 1 中,我们看到总共有 10 个图像,但是其中 8 个属于类标签 1,只有两个属于类标签 0。因此,这是一个典型的阶级不平衡问题。假设所有预测的概率都是 0.5,
标签 1 的损耗 L =-log(0.5)= 0.3,
标签 0 的损耗 L =-log(1–0.5)=-log(0.5)= 0.3
因此,标签 1 的总损耗= 0.3 x 8 = 2.4
而标签 0 的总损耗= 0.3 x 2 = 0.6
因此,损失的大部分来源于标签为 1 的类。因此,与标签为 0 的图像的权重相比,更新权重时的算法更倾向于更新标签为 1 的图像的权重。这并不能产生一个非常好的分类器,这就是类不平衡问题。
类别不平衡问题的解决方案是修改损失函数,以不同地加权 1 和 0 类别。
w1 是我们分配给标签 1 示例的权重,w0 是分配给标签 0 示例的权重。新的损失函数,
如果 Y =1,L = w1 x -log(Y =1 |X ),并且,
如果 Y=0,L = w0 x -log P(Y=0 |X)
我们希望给予图像较少的类比图像较多的类更多的权重。因此,在这种情况下,我们给 8 个例子中的类 1 的权重为 2/10 = 0.2,给 2 个例子中的类 0 的权重为 8/10 = 0.8。
通常,使用下面的公式计算权重,
w1 =标签为 0 的图像数/图像总数= 2/10
w0 =标签为 1 的图像数量/图像总数= 8/10
下面是使用加权损失的更新损失表。
图二。更新的加权损失(来源:图片由作者创建)
因此,对于新的计算,我们只需将损失与各个类别的权重相乘。如果我们计算总损失,
标签 1 的总损耗= 0.06×8 = 0.48
标签 0 的总损耗= 0.24 x 2 = 0.48
现在这两类都有相同的总损失。因此,即使两个类别具有不同数量的图像,该算法现在也会平等地对待这两个类别,并且分类器会正确地对具有非常少图像的类别的图像进行分类。
2。缩减采样
缩减像素采样是从包含最多图像的类中移除图像,以使其与包含较少图像的类具有可比性的过程。
例如,在肺炎分类问题中,我们看到,与 1341 个正常肺炎图像和 1337 个病毒性肺炎图像相比,有 2530 个细菌性肺炎图像。因此,我们可以从细菌性肺炎类中删除大约 1200 幅图像,这样所有类都有相似数量的图像。
这对于具有属于每个类的大量图像的数据集是可能的,并且移除一些图像不会损害神经网络的性能。
3。过采样
过采样是将更多图像添加到少数类以使少数类中的图像数量与多数类中的图像数量相似的过程。
这可以通过简单地复制少数类中的图像来实现。直接复制同一个图像两次,会导致网络过载。因此,为了减少过度拟合,我们可以使用一些人工数据增强来为少数民族创建更多的图像。(这也确实会导致一些过度拟合,但这是一种比直接复制原始图像两到三次好得多的技术)
这是我们在肺炎分类任务中使用的技术,网络工作得相当好。
接下来,我们看一下生成人工数据集的 python 代码。
**import** **numpy** **as** **np**
**import** **pandas** **as** **pd**
**import** **cv2** **as** **cv**
**import** **matplotlib.pyplot** **as** **plt**
**import** **os**
**import** **random**
**from** **sklearn.model_selection** **import** train_test_split
我们之前看过所有的库,除了 sklearn。
sklearn — Scikit-learn(又名sklearn)是一个针对 python 的机器学习库。包含了分类、回归、支持向量机、随机森林等所有著名的机器学习算法。它也是一个非常重要的机器学习数据预处理库。
image_size = 256
labels = ['1_NORMAL', '2_BACTERIA','3_VIRUS']
**def** create_training_data(paths):
images = []
**for** label **in** labels:
dir = os.path.join(paths,label)
class_num = labels.index(label)
**for** image **in** os.listdir(dir):
image_read = cv.imread(os.path.join(dir,image))
image_resized = cv.resize(image_read,(image_size,image_size),cv.IMREAD_GRAYSCALE)
images.append([image_resized,class_num])
**return** np.array(images)train = create_training_data('D:/Kaggle datasets/chest_xray_tf/train')X = []
y = []
**for** feature, label **in** train:
X.append(feature)
y.append(label)
X= np.array(X)
y = np.array(y)
y = np.expand_dims(y, axis=1)
上面的代码调用训练数据集并加载 X 中的图像和 y 中的标签。第 3 部分已经提到了详细信息—(https://towardsdatascience . com/deep-learning-in-health care-X-ray-imaging-Part-3-analyzing-images-using-python-915 a 98 fbf 14 c)。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,random_state = 32, stratify=y)
因为我们只有训练和验证数据,没有测试数据,所以我们使用 sklearn 的 train_test_split 创建测试数据。它用于将整个数据分割成训练和测试图像和标签。我们将整个数据的 20%分配给测试集,因此设置“test_size = 0.2”,random_state 在第一次混洗数据,但在下一次运行时保持它们不变,并用于在每次运行 train_test_split 时不混洗图像,分层在这里很重要,因为数据是不平衡的,因为分层确保在训练和测试集中每个类别的图像有相等的分割。
重要说明—过采样应在训练数据上进行,而不是在测试数据上进行。如果测试数据包含人工生成的图像,我们将看到的分类器结果将不会正确解释网络实际学习了多少。因此,更好的方法是首先拆分训练和测试数据,然后只对训练数据进行过采样。
*# checking the number of images of each class*
a = 0
b = 0
c = 0
**for** label **in** y_train:
**if** label == 0:
a += 1
**if** label == 1:
b += 1
**if** label == 2:
c += 1
print (f'Number of Normal images = **{a}**')
print (f'Number of Bacteria images = **{b}**')
print (f'Number of Virus images = **{c}**')
*# plotting the data*
xe = [i **for** i, _ **in** enumerate(labels)]
numbers = [a,b,c]
plt.bar(xe,numbers,color = 'green')
plt.xlabel("Labels")
plt.ylabel("No. of images")
plt.title("Images for each label")
plt.xticks(xe, labels)
plt.show()
输出-
所以现在我们看到了。训练集具有 1226 幅正常图像、2184 幅细菌性肺炎图像和 1154 幅病毒性肺炎图像。
#check the difference from the majority classdifference_normal = b-a
difference_virus = b-c
print(difference_normal)
print(difference_virus)
输出—
958
1030
解决不平衡—
**def** rotate_images(image, scale =1.0, h=256, w = 256):
center = (h/2,w/2)
angle = random.randint(-25,25)
M = cv.getRotationMatrix2D(center, angle, scale)
rotated = cv.warpAffine(image, M, (h,w))
**return** rotated
**def** flip (image):
flipped = np.fliplr(image)
**return** flipped
**def** translation (image):
x= random.randint(-50,50)
y = random.randint(-50,50)
rows,cols,z = image.shape
M = np.float32([[1,0,x],[0,1,y]])
translate = cv.warpAffine(image,M,(cols,rows))
**return** translate
**def** blur (image):
x = random.randrange(1,5,2)
blur = cv.GaussianBlur(image,(x,x),cv.BORDER_DEFAULT)
**return** blur
我们将使用 4 种类型的数据扩充方法,使用 OpenCV 库-1。旋转-从-25 度到+25 度任意旋转,2。水平翻转图像,3。平移,x 轴和 y 轴随机设置,4。高斯模糊随机。
有关如何使用 OpenCV 实现数据增强的详细信息,请访问以下链接—https://opencv.org
**def** apply_aug (image):
number = random.randint(1,4)
**if** number == 1:
image= rotate_images(image, scale =1.0, h=256, w = 256)
**if** number == 2:
image= flip(image)
**if** number ==3:
image= translation(image)
**if** number ==4:
image= blur(image)
**return** image
接下来,我们定义另一个函数,这样所有的扩充都是完全随机应用的。
**def** oversample_images (difference_normal,difference_virus, X_train, y_train):
normal_counter = 0
virus_counter= 0
new_normal = []
new_virus = []
label_normal = []
label_virus = []
**for** i,item **in** enumerate (X_train):
**if** y_train[i] == 0 **and** normal_counter < difference_normal:
image = apply_aug(item)
normal_counter = normal_counter+1
label = 0
new_normal.append(image)
label_normal.append(label)
**if** y_train[i] == 2 **and** virus_counter < difference_virus:
image = apply_aug(item)
virus_counter = virus_counter+1
label =2
new_virus.append(image)
label_virus.append(label)
new_normal = np.array(new_normal)
label_normal = np.array(label_normal)
new_virus= np.array(new_virus)
label_virus = np.array(label_virus)
**return** new_normal, label_normal, new_virus, label_virus
该功能为正常和病毒性肺炎图像创建所有人工增强图像,直到它们达到与总细菌性肺炎图像的差值。然后,它返回新创建的正常和病毒性肺炎图像和标签。
n_images,n_labels,v_images,v_labels =oversample_images(difference_normal,difference_virus,X_train,y_train)print(n_images.shape)
print(n_labels.shape)
print(v_images.shape)
print(v_labels.shape)
输出—
我们看到,正如预期的那样,创建了 958 幅正常图像和 1030 幅病毒性肺炎图像。
让我们想象一些人造的正常图像,
*# Extract 9 random images*
print('Display Random Images')
*# Adjust the size of your images*
plt.figure(figsize=(20,10))
**for** i **in** range(9):
num = random.randint(0,len(n_images)-1)
plt.subplot(3, 3, i + 1)
plt.imshow(n_images[num],cmap='gray')
plt.axis('off')
*# Adjust subplot parameters to give specified padding*
plt.tight_layout()
输出-
接下来,让我们想象一些人造病毒性肺炎的图像,
*# Displays 9 generated viral images*
*# Extract 9 random images*
print('Display Random Images')
*# Adjust the size of your images*
plt.figure(figsize=(20,10))
**for** i **in** range(9):
num = random.randint(0,len(v_images)-1)
plt.subplot(3, 3, i + 1)
plt.imshow(v_images[num],cmap='gray')
plt.axis('off')
*# Adjust subplot parameters to give specified padding*
plt.tight_layout()
输出-
上面生成的每张图像都有某种程度的增强——旋转、平移、翻转或模糊,所有这些都是随机应用的。
接下来,我们将这些人工图像及其标签与原始训练数据集合并。
new_labels = np.append(n_labels,v_labels)
y_new_labels = np.expand_dims(new_labels, axis=1)
x_new_images = np.append(n_images,v_images,axis=0)
X_train1 = np.append(X_train,x_new_images,axis=0)
y_train1 = np.append(y_train,y_new_labels)
print(X_train1.shape)
print(y_train1.shape)
输出—
现在,训练数据集有 6552 幅图像。
bacteria_new=0
virus_new=0
normal_new =0
**for** i **in** y_train1:
**if** i==0:
normal_new = normal_new+1
**elif** i==1 :
bacteria_new = bacteria_new+1
**else**:
virus_new=virus_new+1
print ('Number of Normal images =',normal_new)
print ('Number of Bacteria images = ',bacteria_new)
print ('Number of Virus images =',virus_new)
*# plotting the data*
xe = [i **for** i, _ **in** enumerate(labels)]
numbers = [normal_new, bacteria_new, virus_new]
plt.bar(xe,numbers,color = 'green')
plt.xlabel("Labels")
plt.ylabel("No. of images")
plt.title("Images for each label")
plt.xticks(xe, labels)
plt.show()
输出—
最后,我们在训练数据集中取得了平衡。我们在所有三个类中有 2184 个图像。
这就是我们解决阶级不平衡问题的方法。请随意尝试其他方法,并与最终结果进行比较。
既然在下一部分中处理了类不平衡问题,我们将研究使用 Keras 和 TensorFlow 的图像规范化和数据增强。
医疗保健中的深度学习——X 射线成像(第 5 部分——数据扩充和图像标准化)
这是深度学习在 X 射线成像上的应用的第 5 部分。这里的重点是实现数据扩充的各种方法。
我们在上一部分—第四部分—https://towards data science . com/deep-learning-in-health care-x-ray-imaging-Part-4-the-Class-distribution-Problem-364 eff 4d 47 bb中看到了如何解决阶层失衡问题。在本节中,我们将重点关注图像规范化和数据扩充。
在解决了类不平衡问题之后,接下来我们来看看如何提高神经网络的性能并使其更快。在训练数据的三个类中,我们已经有了相似数量的图像— 1。正常(无感染),2。细菌性肺炎,3。病毒性肺炎。
每一类中图片数量的条形图——图片来自第四部分(来源:图片由作者创建)
图像缩放/归一化:
当所有特征都在同一尺度上时,神经网络工作得最好。类似地,当特征以平均值零为中心,标准偏差为 1时,梯度下降等优化算法工作得非常好,即数据具有标准正态分布的属性。
这可以通过如下所示的几种方式来实现。
案例 1:不推荐
scaled_dataset = (dataset - dataset_mean) / dataset_std_deviation
train, test = split(scaled_dataset)
整个数据集被缩放,然后分成训练集和测试集。
案例 2:不推荐
train, test = split(dataset)
scaled_train = (train - train_mean) / train_std_deviation
scaled_test = (test - test_mean) / test_std_deviation
数据集被分成训练集和测试集,然后分别对训练集和测试集进行缩放。
案例三:推荐
train, test = split(dataset)scaled_train = (train - train_mean) / train_std_deviation
scaled_test = (test - train_mean) / train_std_deviation
数据集被分成训练集和测试集。然后对训练图像进行缩放。为了缩放测试图像,我们使用训练集的平均值和标准偏差,而不是测试图像的平均值和标准偏差。
使用训练集的均值和标准差来衡量测试集可能看起来很奇怪,但是案例 3 是遵循的最佳方法。原因是:
测试数据是模型的“看不见的数据”,我们使用测试数据来检查模型在看不见的数据下的表现,也就是说,它给出了一个很好的估计,即模型是否可以在现实世界中使用。
现在,在真实的场景中,我们可能没有一批测试图像来测试我们的模型,而是只有一个图像。在这种情况下,不可能在单个图像上计算平均值和标准偏差。此外,在多个图像的情况下,知道每批测试数据的平均值将有效地给我们的模型带来优势,并且我们不希望模型具有关于测试数据的任何信息。
因此,解决这个问题的最佳方式是使用案例 3,并使用从训练集计算的统计数据来规范化传入的测试数据。然后,我们将使用这些统计数据来转换我们的测试数据和以后的任何数据。
数据扩充:
数据扩充是一种策略,使从业者能够显著增加可用于训练模型的数据的多样性,而无需实际收集新数据。[1]
在第 4 部分(https://towards data science . com/deep-learning-in-health care-x-ray-imaging-part-4-the-class-unbalancy-problem-364 eff 4d 47 bb)中,我们已经看到了如何通过使用数据增强来创建人工图像。我们使用 OpenCV 来旋转、平移、翻转和模糊图像。在这里,我们研究如何在 Keras 中进行数据扩充。
数据增强的优势:
- 改进模型结果
- 防止过度拟合
为了实现这一点,我们将使用 Keras 框架中的 ImageDataGenerator 类。ImageDataGenerator 通过实时数据扩充帮助生成批量张量图像数据。也就是说,它可以执行所有这些操作:
- 生成数据框中指定的批量图像。
- 允许基本的数据扩充技术,如翻转、缩放、缩放、旋转等。
- 转换每批中的值,使它们的平均值为 1,标准偏差为 1。这通过标准化输入分布来帮助模型训练。
- 它还通过在所有通道上重复图像中的值,将单通道 X 射线图像(灰度)转换为三通道格式。我们需要这样做,因为我们稍后将用来训练模型的预训练模型需要三通道输入。
实现 ImageDataGenerator:
下面的代码是第 3 部分和第 4 部分代码的延续:
**def** get_train_generator(X_train,y_train, batch_size = 32, shuffle = **True**, seed = 1):
print("getting train generator...")
*# normalize and augment images*
image_generator = ImageDataGenerator(
samplewise_center=**True**,
samplewise_std_normalization= **True**,
rotation_range = 15,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
fill_mode="nearest",
cval=0.0,
rescale = 0.2)
generator = image_generator.flow(
X_train,
y=y_train,
shuffle=shuffle,
batch_size=batch_size,
seed=seed
)
**return** generator
上面的代码片段为训练集实现了 ImageDataGenerator。ImageDataGenerator 成批接受图像。这里,批量大小设置为 32,因此它将一次生成 32 个图像。
samplewise_center=**True**,
samplewise_std_normalization= **True**
这实现了图像标准化。它将图像像素居中到平均值 0,标准偏差为 1。
这就是 Keras 在不需要使用任何公式的情况下进行图像规范化/标准化/缩放的方式。
可视化 ImageDataGenerator 如何工作:
通过一张猫的图片,我们可以看到 ImageDataGenerator 中的各种增强功能是如何工作的
#importing the necessary libraries**import** **cv2** **as** **cv**
**import** **numpy** **as** **np**
**import** **matplotlib.pyplot** **as** **plt**
**from** **tensorflow.keras.preprocessing.image** **import** load_img
**from** **tensorflow.keras.preprocessing.image** **import** img_to_array
**from** **tensorflow.keras.preprocessing.image** **import** ImageDataGenerator#define a function to display 9 augmented images**def** show_image(iterator):
*# generate samples and plot*
**for** i **in** range(9):
plt.subplot(330 + 1 + i)
batch = iterator.next()
image = batch[0].astype('uint8')
plt.imshow(image)
plt.show()#load and display the original imageimg = load_img('cat.jpg')
plt.imshow (img)
data = img_to_array(img)
samples = np.expand_dims(data, 0)
***# height_shift_range***datagen = ImageDataGenerator(height_shift_range=0.5)
iterator = datagen.flow(samples, batch_size=1)
show_image(iterator)
***# width_shift_range***datagen = ImageDataGenerator(width_shift_range=0.5)
iterator = datagen.flow(samples, batch_size=1)
show_image(iterator)
***# rotation_range*** datagen = ImageDataGenerator(rotation_range = 50)
iterator = datagen.flow(samples, batch_size=1)
show_image(iterator)
***# shear_range*** datagen = ImageDataGenerator(shear_range = 50)
iterator = datagen.flow(samples, batch_size=1)
show_image(iterator)
***# brightness_range*** datagen = ImageDataGenerator(brightness_range = [0.3,1.9])
iterator = datagen.flow(samples, batch_size=1)
show_image(iterator)
***# zoom_range***datagen = ImageDataGenerator(zoom_range = [0.5,1.5])
iterator = datagen.flow(samples, batch_size=1)
show_image(iterator)
***# flip***datagen =ImageDataGenerator(horizontal_flip=**True**,vertical_flip=**True**)
iterator = datagen.flow(samples, batch_size=1)
show_image(iterator)
从图片来看,我相信 ImgaeDataGenerator 中每个函数的作用是可以理解的。更多详情请访问以下链接—【https://keras.io/api/preprocessing/image/ 。
回到 X 射线图像,我们已经看到了如何在训练集上实现 ImageDataGenerator。但是我们不应该直接在测试集上实现,就像在案例 3 的图像缩放/归一化中看到的那样(如上所述)。因此,我们为测试和验证集构建了一个单独的生成器。
**def** get_test_val_generator(X_train,y_train,X_test,y_test,X_val,y_val,
batch_size=32, seed=1, sample_size=100):
raw_train_generator = ImageDataGenerator().flow(
X_train,y_train,
batch_size=sample_size,
shuffle=**False**)
*# get data sample*
batch = raw_train_generator.next()
data_sample = batch[0]
*# use sample to fit mean and std for test set generator*
image_generator = ImageDataGenerator(
featurewise_center=**True**,
featurewise_std_normalization= **True**)
*# fit generator to sample from training data*
image_generator.fit(data_sample)
*# get test generator*
test_generator = image_generator.flow(
X_test,
y=y_test,
batch_size=batch_size,
shuffle=**False**,
seed=seed)
*#get validation generator*
val_generator = image_generator.flow(
X_val,
y=y_val,
batch_size=batch_size,
shuffle=**False**,
seed=seed)
**return** test_generator,val_generator
在这个实现中,我们使用训练集的统计数据,并将其应用于测试和验证集。理想情况下,我们希望使用整个训练集来计算样本均值和标准差。
然而,由于这非常大,这将非常耗时。
因此,我们随机抽取数据集样本(在本例中为 100 张图像),并计算样本均值和样本标准差。
接下来,我们创建训练、测试和验证生成器。
***#create the train, test and validation generator* ** train_generator = get_train_generator(X_train,y_train) test_generator,valid_generator = get_test_val_generator(X_train,y_train,X_test,y_test,X_val,y_val)
在生成器被创建之后,我们可视化一些来自训练和测试生成器的图像,看看它们看起来如何。
***# Displays 9 generated train_generator images***
print('Display Random Images')
*# Adjust the size of your images*
plt.figure(figsize=(20,10))
**for** i **in** range(12):
num = random.randint(1,30)
plt.subplot(3,4, i + 1)
x,y = train_generator.__getitem__(num)
plt.imshow(x[num],cmap='gray')
plt.axis('off')
*# Adjust subplot parameters to give specified padding*
plt.tight_layout()
***# Displays 9 generated test_generator images * ** print('Display Random Images') *# Adjust the size of your images* plt.figure(figsize=(20,10))
**for** i **in** range(12):
num = random.randint(1,17)
plt.subplot(3,4, i + 1)
x,y = test_generator.__getitem__(num)
plt.imshow(x[num],cmap='gray')
plt.axis('off')
*# Adjust subplot parameters to give specified padding* plt.tight_layout()
我们看到图像现在在训练和测试生成器中都被归一化了,但是我们仅在训练生成器上应用了增强,因为神经网络仅在训练图像上训练,并且我们不想干扰测试或验证图像。
图像被标准化和增强,现在可以输入神经网络。在下一部分中,我们将设计一个神经网络,看看它在将 X 射线图像适当分类到所有三个类别中的效果如何。在后面的部分,我们还将看到如何使用迁移学习进一步改善这些结果。
参考资料:
组织病理学中的深度学习(下)
计算机视觉/深度学习/医学成像
文献综述
在这篇博客中,我们将从方法论的角度更详细地讨论深度学习对组织病理学的适用性,以及它使用相关工作进行说明来帮助完成的任务。
深度学习的适用性可以根据它执行的任务或学习范式来研究,这是我们将在这篇文章中使用的分类。不同的学习算法,即用于组织病理学的深度学习,以及任务在以下概述中进行了可视化。
图:这里看到的是计算组织病理学中的深度神经网络模型、各种应用和任务的概述。来源: 斯里尼迪等人
基于这些,在文献中已经提出了许多 DL 模型,这些模型传统上基于卷积神经网络(CNN)、递归神经网络(RNNs)、生成对抗网络(GANs)、自动编码器(AEs)和其他变体。
监督学习
在监督学习技术中,我们根据数字组织病理学中解决的任务的性质确定了三种主要的规范深度学习模型:分类、回归和分割。
监督分类法
它可以进一步细分为局部和全球一级的分类。 局部级别分类 需要识别整个载玻片图像的小块中的细胞或细胞核。深度学习已被证明在通过滑动窗口方法对图像补片进行逐像素预测方面非常成功,病理学家将这些图像补片标注为包含感兴趣对象(细胞/细胞核)或背景的区域。
局部分类中最突出的工作之一出现在 2019 年,当时 Qaiser 等人在其论文中使用轮廓作为区分特征,以便通过将斑块分类为肿瘤区域或正常区域来分割结肠肿瘤区域。持续同源性分布图是一个区域的紧凑的数学特征表示,对于输入数据、维度和坐标中的规模、扰动具有独特性和鲁棒性。
他们将训练数据集的 PHP 与使用 CNN 提取的特征结合起来使用,然后对它们分别使用随机森林回归,随后使用多阶段集成策略进行最终分类。这种混合方法被证明是既准确又高效的 wrt 推理速度。
在 全局水平分类 中,大部分已发表的工作都集中在一种基于面片的分类方法上,用于全切片水平的疾病预测任务。它可以包括小块水平的定位以及整个载玻片水平的疾病分类或分级。这些方法的主要缺点是在整个 WSI 上进行密集的逐块预测需要相对较长的计算时间。不同的作品以不同的方式处理这个问题,一些使用启发式采样策略到最近的使用基于任务驱动 视觉注意 的粗处理。**
图:基于视觉注意力的观察、调查和分类模型的流程。来源: 徐等(2019)
【徐】在他们的工作中,通过硬视觉注意算法自适应地从原始图像中选择一系列粗糙区域,然后对于每个这样的区域,能够基于软注意机制来调查异常部分。然后,在顶部构建一个递归网络以对图像区域进行分类,并且还预测在下一时间步要研究的图像区域的位置。这样,分类只需要调查一小部分像素
将基于视觉注意力的模型用于整个幻灯片图像全局分类任务的优点是:
- 该模型试图只学习对疾病预测最相关的诊断有用的区域,因为它实施了区域选择机制。
- 模型的复杂度与 WSI 的大小无关。
由 哈利切克、马丁等人 进行的另一项全球分类的近期工作使用 CNN 使用完全不同的方法对鳞状细胞癌【SCC】和甲状腺细胞癌进行基于补丁的定位和全切片分类。
从每个概述的组织学载玻片产生癌症区域的地面实况二元掩模。使用 最近邻插值 将 WSIs 和相应的地面实况向下采样四倍。然后将降采样后的载玻片分成大小为 101 x 101 的小块。为了确保通用性,通过应用 90 度旋转和反射,图像补片的数量增加了 8x ,以开发一种更强大的诊断方法。此外,为了建立颜色特征不变性和对载玻片之间的 H & E 染色 的差异的容忍度的水平,在馈送到用于检测头颈癌的 Inception-v4 模型之前,随机操纵每个块的色调、饱和度、亮度和对比度,以形成更严格的训练范例。
监督回归
在这种方法中,我们集中于直接回归像素作为对象中心的可能性,以检测或定位对象。与分类不同,回归给我们一个连续的值,通常是概率分数,而不是简单的作为输出的类别标签。回归有助于通过加强拓扑约束进行更好的检测,例如为靠近对象中心的像素分配更高的概率值。
回归也有助于应对细胞/细胞核检测中面临的挑战,这些挑战是由于高度不规则的外观以及它们作为重叠的团块出现而导致分离它们的问题而引起的。文献中提出的深度回归模型主要基于 CNN 或 全卷积网络(FCN) 架构。
由 格雷厄姆等人 在 HoVer-Net 上发表的论文是整个研究领域中最具开创性的作品之一。它提出了一个统一的 FCN 模型,同时核实例分割和分类。它利用核像素到其质心的垂直和水平距离内编码的丰富实例信息。然后利用这些距离来分离成簇的细胞核,从而产生精确的分割,特别是在具有重叠实例的区域中。
然后,对于每个分割的实例,网络通过专用的上采样分支预测细胞核的类型。该网络由用于三种不同任务的三个平行分支组成。对于三个分支中的每一个,我们都有相应的数据基础事实注释。
- 细胞核像素(NP) 分支预测像素是否属于细胞核或背景,
- *而*水平-垂直(悬停)分支预测核像素到其质心的水平和垂直距离。这里,颜色表示每个核像素到质心的距离的等级。
- 蓝色代表最大+1 的正距离,表示像素在水平贴图的情况下位于 COM 的左侧,在垂直贴图的情况下位于 COM 的上方。类似地,红色表示负距离,最大为-1,意味着像素相应地位于 COM 的右侧/底部。
- 然后,细胞核分类(NC) 分支(可选)预测每个像素的细胞核类型。
图:由一个编码器和三个并行解码器组成的 HoVernet 架构 FCN 网络。来源: 格雷厄姆等人
具体来说, NP 和 HoVer 分支通过先从背景中分离出细胞核像素(NP 分支),再分离出接触细胞核( HoVer 分支)共同实现细胞核实例分割。这是用于组织的定位和聚类步骤的相同模型,用于将整个载玻片图像建模为图形,以便使用 图形神经网络 进行后续学习,如前一篇文章中所述。
在我们关于组织病理学深度学习讨论的下一个也是最后一个部分,我们将讨论数字组织病理学背景下的监督分割、弱监督和非监督学习方法,以及适当的应用和相关文献。
PS:我已经将技术上重要的术语链接到解释它们的相应资源。
参考
- Qaiser,Tsang,Y.W .,Taniyama,d .,Sakamoto,n .,Nakane,k .,Epstein,d .,Rajpoot,n .,2019b .利用持续同源性和深度卷积特征快速准确地分割组织学图像中的肿瘤。医学图像分析 55,1–14。
- 徐,b,刘,j,侯,x,刘,b,加里波第,j,埃利斯,国际组织,格林,a,沈,l,邱,g,2019。看,调查,分类:乳腺癌分类的深度混合注意方法,载于:2019 IEEE 第 16 届国际生物医学成像研讨会(ISBI 2019),第 914–918 页。
- 使用卷积神经网络进行数字化全切片组织学中的头颈癌检测。科学报告9.1(2019):1–11。
- Graham,s .,Vu,Q.D .,Raza,S.E.A .,Azam,a .,Tsang,Y.W .,Kwak,J.T .,Rajpoot,n . 2019 b .Hover-net:多组织组织学图像中细胞核的同时分割和分类。医学图像分析 58,101563。
- 斯里尼迪,切坦 l,奥赞西加和安妮 l 马特尔。“用于计算组织病理学的深度神经网络模型:综述.” arXiv 预印本 arXiv:1912.12378 (2019)。
Java 中的深度学习
DeepJavaLibrary 简介:一个开源的、与引擎无关的、用于训练和推理的深度学习 Java 库
长久以来,Java 一直是企业中[最受欢迎的编程语言之一,拥有一个庞大的库、框架和开发人员社区的生态系统。然而,Java 为深度学习应用程序提供的选项非常有限。目前,大多数深度学习模型都是用 Python 编写和训练的。这为想要进入这一领域的 Java 开发人员带来了额外的进入壁垒,因为他们必须学习一种新的编程语言和复杂的深度学习领域。
为了降低 Java 开发者进入深度学习的门槛,AWS 构建了](https://www.cloudfoundry.org/wp-content/uploads/Developer-Language-Report_FINAL.pdf) Deep Java Library (DJL) ,这是一个开源的 Java 深度学习框架,通过支持任何深度学习引擎,如 Apache MXNet、PyTorch 或 TensorFlow,在 Java 中原生运行训练和推理,为 Java 开发者搭建桥梁。它还包含一个强大的 ModelZoo 设计,允许您管理经过训练的模型,并在一行代码中加载它们。内置的 ModelZoo 目前支持来自 GluonCV、HuggingFace、TorchHub 和 Keras 的 70 多个预训练和随时可用的模型。如果你是一名 Java 开发人员,并且对探索深度学习感兴趣, Deep Java Library (DJL) 是一个很好的起点。
在本教程中,我们将通过在流行的 MNIST 数据集上训练一个简单模型来演示 DJL 的训练能力。
什么是深度学习?
机器学习是通过使用各种统计技术,让计算机从数据中学习给定任务的规范的过程。这种学习任务特征的能力允许计算机执行复杂的任务,例如检测图像中的对象,这些任务通常被认为超出了计算机的范围,因为很难为每种可能的情况提供准确的规范。
深度学习是基于人工神经网络的机器学习分支。人工神经网络是一种受人脑启发的编程范式,它帮助计算机基于观察数据学习和执行任务。深度学习是一组强大的技术,可以用来帮助训练大型人工神经网络来执行复杂的任务。深度学习技术已被证明在解决复杂任务方面非常有效,如对象检测、动作识别、机器翻译、自然语言理解等。
和 DJL 一起训练 MNIST
设置项目
您可以在 gradle 项目中使用以下配置来导入所需的依赖项。在这个例子中,我们使用了包含 DJL 项目核心 API 的api
包,以及包含 DJL 一些基本数据集的basicdataset
包。因为我们用 MXNet 引擎训练,我们也将导入mxnet-engine
包和mxnet-native-auto
包。
plugins {
id 'java'
}
repositories {
jcenter()
}
dependencies {
implementation "ai.djl:api:0.8.0"
implementation "ai.djl:basicdataset:0.8.0"
// MXNet
runtimeOnly "ai.djl.mxnet:mxnet-engine:0.8.0"
runtimeOnly "ai.djl.mxnet:mxnet-native-auto:1.7.0-backport"
}
NDArray 和 NDManager
NDArray 是 DJL 所有数学计算的核心数据结构。NDArray 表示一个多维、固定大小的同构数组。NDArray 的行为类似于 python 程序 numpy。
NDManager 是 NDArray 的管理者。NDManager 管理 NDArray 的生命周期,是 DJL 内存管理的重要组成部分。一旦 NDManager 关闭,由 NDManager 实例创建的每个 NDArray 都将关闭。NDManager 和 NDArray 都扩展了AutoCloseable
。为了更好的了解和理解 NDArray 和 NDManager 的用法,请看这篇博文。
模型
在 DJL,训练和推理以Model
开始。在本文中,我们将集中讨论培训过程。为了开始训练过程,我们创建了一个Model
类的新实例。Model
类也扩展了AutoCloseable
。所以,它是用 try-with-resources 创建的。
try (Model model = Model.newInstance()) {
...
// training process takes place here
...
}
准备数据
MNIST 数据库(改进的国家标准和技术研究所数据库)是一个手写数字的大型数据库,通常用于训练各种图像处理系统。MNIST
数据集在 DJL 随处可见。来自 DJL MNIST 数据集的单个图像的形状为(28,28)。如果您希望在自己的数据集上训练模型,您可以按照这里的说明添加自己的数据集。
来自 MNIST 数据集、的随机图像集合,由克尔森·瓦斯特拍摄
为了训练您的模型,您首先需要加载数据集。
int batchSize = 32;
Mnist trainingDataset = Mnist.builder()
.optUsage(Usage.TRAIN)
.setSampling(batchSize, true)
.build();
Mnist validationDataset = Mnist.builder()
.optUsage(Usage.TEST)
.setSampling(batchSize, true)
.build();
这段代码创建了训练和验证数据集。数据集还被配置为对数据集进行随机采样。对数据集进行了进一步的配置,如对图像应用变换,或限制数据集的大小。
构建模型(构建模块)
一旦数据准备好了,你需要构建你想要训练的神经网络。在 DJL,神经网络用一个Block
来表示。块是形成神经网络的可组合函数。它们可以代表单个操作、神经网络的一部分,甚至整个神经网络。一个Block
可以有参数和子块。在训练过程中,参数被更新,并且子块也被训练。这也递归地更新了它所有子节点的参数。
在构建这些块函数时,最简单的方法就是使用 composition。积木可以由其他积木组合而成。我们将包含块称为父块,将子块称为子块。
我们提供了几个助手,让构建通用的块组合结构变得容易。SequentialBlock
是一个容器块,它的子块形成了一个块链,每个子块将其输出提供给序列中的下一个子块。ParallelBlock 是一个容器块,其子块并行执行,块的输出根据指定的组合函数进行组合。block 是一个具有操作功能的模块,必须由用户指定。
可用于构建神经网络的模块类型(非穷举),keer than Vasist 的图像
我们将建立一个简单的 MLP(多层感知器)。多层感知器(MLP)是一种前馈人工神经网络,它从一组输入生成一组输出。MLP 的特征在于若干层输入结点在输入层和输出层之间连接成一个有向图。它可以通过在一个SequentialBlock
内使用多个LinearBlock
来构建。
int input = 768;
int output = 10;
int[] hidden = new int[] {128, 64};
SequentialBlock sequentialBlock = new SequentialBlock();
sequentialBlock.add(Blocks.batchFlattenBlock(input));
for (int hiddenSize : hidden) {
sequentialBlock.add(Linear.builder().setUnits(hiddenSize).build());
sequentialBlock.add(activation);
}
sequentialBlock.add(Linear.builder().setUnits(output).build());
DJL 还提供了一个预制的Mlp
模块,我们可以直接使用。
Block block = new Mlp(
Mnist.IMAGE_HEIGHT * Mnist.IMAGE_WIDTH,
Mnist.NUM_CLASSES,
new int[] {128, 64});
培养
现在,您已经创建了模型的一个新实例,准备了数据集,并构造了一个块,您可以开始训练了。在深度学习中,训练包括以下步骤:
- 初始化:该步骤初始化模块,并根据指定的
Initializer
方案创建相应的参数。 - Forward:该步骤执行由
Block
表示的计算,并生成输出。 - 损失计算:在这一步中,通过将指定的
Loss
函数应用于输出和提供的标签来计算损失。 - 向后:在此步骤中,使用损失,并沿神经网络反向传播梯度。
- 步骤:在该步骤中,根据指定的
Optimizer
更新程序块的参数值。
然而,DJL 通过Trainer
抽象了所有这些步骤。可以通过指定Initializer
、Loss
、Optimizer
等训练配置来创建Trainer
。使用TrainingConfig
可以设置这些配置和更多配置。可以设置的其他一些配置有:
Device
-必须进行培训的设备TrainingListeners
-监听器监听训练过程中的各个阶段,并执行特定的功能,如记录和评估。用户可以根据需要实现自定义TrainingListener
。
DefaultTrainingConfig config = new DefaultTrainingConfig(Loss.softmaxCrossEntropyLoss())
.addEvaluator(new Accuracy())
.optDevices(Device.getDevices(arguments.getMaxGpus()))
.addTrainingListeners(TrainingListener.Defaults.logging(arguments.getOutputDir()));
try (Trainer trainer = model.newTrainer(config)){
// training happens here
}
一旦创建了训练器,必须用输入的Shape
对其进行初始化。然后,你调用fit()
方法开始训练。fit()
方法对数据集上的模型进行指定数量的历元训练,运行验证,并将模型保存在文件系统的指定目录中。
/*
* MNIST is 28x28 grayscale image and pre processed into 28 * 28 NDArray.
* 1st axis is batch axis, we can use 1 for initialization.
*/
Shape inputShape = new Shape(1, Mnist.IMAGE_HEIGHT * Mnist.IMAGE_WIDTH);
int numEpoch = 5;
String outputDir = "/build/model";// initialize trainer with proper input shape
trainer.initialize(inputShape);TrainingUtils.fit(trainer, numEpoch, trainingSet, validateSet, outputDir, "mlp");
就是这样。恭喜你!你已经使用 DJL 训练了你的第一个深度学习模型!您可以在控制台上监视训练过程,也可以监视监听器的实现。如果您使用默认侦听器,您的输出应该类似于以下内容。
[INFO ] - Downloading libmxnet.dylib ...
[INFO ] - Training on: cpu().
[INFO ] - Load MXNet Engine Version 1.7.0 in 0.131 ms.
Training: 100% |████████████████████████████████████████| Accuracy: 0.93, SoftmaxCrossEntropyLoss: 0.24, speed: 1235.20 items/sec
Validating: 100% |████████████████████████████████████████|
[INFO ] - Epoch 1 finished.
[INFO ] - Train: Accuracy: 0.93, SoftmaxCrossEntropyLoss: 0.24
[INFO ] - Validate: Accuracy: 0.95, SoftmaxCrossEntropyLoss: 0.14
Training: 100% |████████████████████████████████████████| Accuracy: 0.97, SoftmaxCrossEntropyLoss: 0.10, speed: 2851.06 items/sec
Validating: 100% |████████████████████████████████████████|
[INFO ] - Epoch 2 finished.NG [1m 41s]
[INFO ] - Train: Accuracy: 0.97, SoftmaxCrossEntropyLoss: 0.10
[INFO ] - Validate: Accuracy: 0.97, SoftmaxCrossEntropyLoss: 0.09
[INFO ] - train P50: 12.756 ms, P90: 21.044 ms
[INFO ] - forward P50: 0.375 ms, P90: 0.607 ms
[INFO ] - training-metrics P50: 0.021 ms, P90: 0.034 ms
[INFO ] - backward P50: 0.608 ms, P90: 0.973 ms
[INFO ] - step P50: 0.543 ms, P90: 0.869 ms
[INFO ] - epoch P50: 35.989 s, P90: 35.989 s
一旦训练完成,我们就可以使用训练好的模型进行推理来获得预测。您可以使用您的 model jupyter 笔记本按照推理,在保存的模型上运行推理。您也可以按照使用多层感知器(MLP)模型训练手写数字识别中的说明直接运行完整的代码。
摘要
在本文中,我们向您介绍了深度学习,并使用 DJL 完成了一个简单的训练示例。虽然这个例子是一个简单的例子,但 DJL 为更复杂的深度学习模型提供了相同的抽象。
关注我们的 GitHub 、演示库、 Slack channel 和 Twitter 获取更多关于 DJL 的文档和示例!
宏观经济学中的深度学习——国债
预测 10 年期美国国债利率
未来一年,美国国债利率将如何变动?下个财政季度?下个月怎么样?这些问题在金融市场投资者和政策制定者的决策中都起着至关重要的作用。投资者的目标是寻求更高的投资回报,估计长期回报,并模拟风险溢价。政策制定者试图预测未来的利率,以帮助推动适当的货币和财政措施,从而维持健康的市场和宏观经济。
在本文中,我将卷积 LSTM 神经网络的预测性能与费城美联储专业预测者调查的总体预测性能进行了比较。这个模型和方法类似于我在《T4》上一篇关于预测美国通胀率的文章中使用的方法。历史上,这种调查汇总的预测方法已经被用于通过汇总许多经济学家模型的结果和对未来表现的预测来提高表现。这与蓝筹股经济指标预测以及道琼斯/华尔街日报经济预测调查等所使用的方法类似。我发现,通过使用神经网络预测算法,预测性能可以在所有测试时间范围内得到改善。
国债的重要性
美国国债收益率不仅在显示股市和整体经济状况方面非常重要,也是许多其他利率和证券定价的驱动因素。
10 年期美国国债实际上是美国债务的一部分。通过购买债券,你可以向美国联邦政府提供小额贷款。10 年期债券是美国财政部发行的 10 年后到期的债券。这些债券由美国财政部拍卖,其价格在一定程度上由需求决定。
这些债券通常被视为无风险债务工具。也就是说,它们决定了无违约风险的债务回报率。这是因为所有的美国国债都是由美国经济担保的。相对于许多国家而言,人们认为美国债务违约的风险很小。
这种将美国国债视为无风险投资的观点,是推动美国国债在理解经济观点方面的重要性以及推动美国国债对其他债务工具的影响力的部分原因。
当经济表现良好且对未来表现的预期较高时,投资者将寻求投资的最高回报率,对美国国债的需求将会减少。在商业周期的这种扩张时期,有许多其他投资工具可以产生比国债更高的回报。结果,需求下降,购买者只愿意以低于面值的价格购买债券。随着市场平衡,与其他投资工具竞争,这将推高收益率。
在经济收缩时期或有衰退风险时,情况正好相反。投资者将资产从被认为风险较高的工具中转移出来,寻找安全稳定的投资,比如国债。这种高需求推高了债券价格,降低了收益率。投资者愿意接受这种较低的回报,以换取他们投资安全的知识。这就是为什么在经济扩张时期,我们会看到国债利率下降,而在经济收缩时期,我们会看到利率上升。
在紧缩时期,这种无风险利率的下降导致银行贷款利率和其他利率也下降,以便在市场上竞争。抵押贷款等安全性较低的投资必须降低利率,以吸引投资者。这为市场提供了额外的流动性。较低的抵押贷款和贷款利率通过降低购房和举债成本而推高了借贷。
通过更好地了解债券利率的未来走势,个人、政策制定者和市场参与者可以改善他们的决策。投资者可以获得更高的回报,并在市场波动之前采取行动,而不是对其做出反应。同样,政策制定者可以在经济陷入危机之前就货币政策和流动性做出决定。或许最重要的是,通过预测债券利率的变动,我们可以更好地理解更广泛的经济情绪。一段时间内利率的大幅变动可以表明风险认知的变化,并作为衰退的指标。
数据
对于数据,我使用来自 FRED-MD 数据库的 GS10 系列。FRED-MD 是一个由圣路易斯美联储委员会维护的数据库,旨在对大数据进行“实证分析”。“数据通过 FRED 数据库实时更新。
GS10 变量代表 10 年期美国国债月底的固定到期收益率。该利率是根据美国财政部提供的信息计算的。数据也可以从弗雷德这里获得。
为了这个分析,我预测了每个月的债券利率。由于债券是每天交易的,这相当于每个月末计算的利率。首先对该序列进行差分以产生平稳性,然后用具有单一特征的滚动 24 个月周期的张量来构造。虽然数据在用于非线性预测模型之前是否必须是稳定的还存在争议,但在这种情况下,我发现差分后的结果得到了改善。滚动平均输入的结构类似。在对序列进行差分后,计算移动平均值,然后将其构建为滚动 24 个月周期的张量,其中三个移动平均值中的每一个都作为一个特征。
时间序列数据的卷积 LSTM 建模
我开发了一个卷积 LSTM 神经网络(CNN-LSTM)来预测未来 12 个月每个月的债券利率。
卷积神经网络是一系列深度学习算法,最初是为图像分类而设计的。该网络获取一幅图像,将该图像通过一组对该图像的不同方面应用权重的过滤器,并最终提供预测。这就像一个特征工程系统,随着时间的推移,网络“学习”什么样的特征过滤器在图像分类中最重要。
类似的方法可以应用于时间序列。虽然时间序列不像图像那样具有“物理”特征,但时间序列数据确实包含时间维度特征。如果我们将时间序列数据想象成一幅图像,我们可以将卷积网络想象成一盏聚光灯或一扇窗户,它扫描整个时间段,照亮该时间段内序列的形状,然后对其进行过滤,以找到它最能代表的特征形状。这种模式的简单说明如下:
时间序列卷积网络的说明性示例(权重是固定的)-十年期国债利率
这个卷积模型可以扩展为一个长短长短期记忆(LSTM)层集,以便更好地了解这些历史时间维度特征中的哪一个在何时影响比率。LSTM 是一种用于深度学习的人工递归神经网络(RNN)架构。与其他前馈神经网络不同,LSTM 网络具有反馈连接。这些反馈连接允许网络学习哪些过去的信息是重要的,而忘记哪些是不重要的。
该单元由几个门函数组成,这些门函数决定新信息对预测问题是否重要,以及旧信息是否仍然相关。该存储器被称为单元状态,并且可以保存所有先前学习的相关信息,用于时序序列的完整处理。这允许在整个处理过程中保持序列中更早学习到的信息。
当信息通过 LSTM 处理时,它通过一系列的门,这些门决定了信息是被保留、更新还是被完全遗忘。这就是 LSTM 建筑优于其他 RNN 建筑的好处。LSTM 能够将信息从处理的早期一直传送到末端,而其他 RNN 网络只是用序列中的每个附加输入来更新它们的理解。这使得 LSTM 网络对于像时间序列这样的序列数据的分析非常强大。
模型架构
我用来分析的 CNN-LSTM 网络如下图所示。首先,我们从两个输入开始,原始时间序列和三个移动平均平滑序列。每个平滑系列代表任何给定观测值的前三个月、六个月和一年的移动平均值。
这些输入然后被馈送到单独的卷积层,以提取每个输入序列的相对重要的特征权重。这些结果然后被合并在一起,并传递到一系列 LSTM 网络,然后最终传递到一组完全连接的块。全连接块堆栈中的每个后续块包含的节点比前一堆栈中的少。在每个块之间,使用剩余或跳过连接,允许模型使用在早期层中学习的信息来继续训练后面的层。这防止了从卷积层输出的信息太快丢失或被模型的后续层模糊。这也有助于防止渐变消失的问题,并允许在模型结构中进一步保留原始序列中的一些较小的细节。最后,在输出最终预测之前,将对最终图层应用一个丢弃。
模型架构图
结果
在对数据进行差分后,我将数据集分成训练集和测试集(70/30 分割)。数据在截至 2001 年 6 月的所有月份中进行训练,然后对 2001 年 7 月到 2019 年 9 月进行预测。我使用一步滚动预测。对于测试集中的每个月,预测对应于接下来 12 个月的每个月末的债券利率,然后使用观察到的债券利率来预测接下来 12 个月的集合。预测以多元方式进行,同时预测随后 12 个月中的每个月,并在系列中每 10 次观察时进行验证。
这是一个相当现实的方法,因为在预测下一期的债券利率时,分析师可以使用所有以前观察到的利率。通过使用一步预测,我们保持这种不断增长的建模信息。通过使用有状态 LSTM 模型,模型权重随着每次新的预测迭代而调整。这使得模型能够拾取序列中可能随时间发生的任何结构变化。该模型的误差率以年度百分比表示。
作为模型的基准,我给出了专业预测者调查(SPF)和费城美联储 DARM 模型(SPF 的最高表现基准)测试期间的误差率。SPF 是美国持续时间最长的宏观经济指标预测调查。这些基准的错误率是根据 SPF 官方错误率文档计算的。
下面是模型结果的总结:
模型和基准误差结果
我们可以看到,多元卷积 LSTM 模型远远优于直接自回归模型和调查汇总预测。虽然在这些预测如何运行以及误差如何表现方面存在一些差异,但我们可以看到卷积模型在每个时间段都优于这些更传统的方法。SPF 预测按季度在每个季度的中期进行,然后在当前季度末和随后的季度进行预测,而不是按月进行。仍然可以通过将每个季度预测视为三个月的预测,将当前季度预测视为大约一个月的预测来进行比较。
下面,我们可以看到模型在整个时间序列中的表现。总的来说,我们可以看到模型与数据拟合得很好,只是在方差较大的时期或趋势变化很快的时候,误差会稍微大一些。在 1980 年代的最高历史汇率值时,情况尤其如此。
如果我们更仔细地观察测试期间,我们可以看到模型几乎完全符合实际债券利率。这部分是由于模型在每次后续预测中获得了额外的信息。自 1984 年的峰值以来,国债利率一直在稳步下降。最近的经济理论表明,债券利率可能已经发生结构性变化,进入一个较低的稳定状态。考虑到美国国债收益率曲线,这一点尤其有趣。然而,该模型似乎很容易适应这种结构上的变化。
虽然在误差方面比基准测试有明显的改进,但可以看到的另一个主要好处是模型的预测能力没有滞后。典型的计量经济学模型预测通常显示出其预测的滞后性,并且难以快速适应趋势的变化。在查看下面的附加基准预测时,我们可以看到,特别是对于中长期预测,预测率存在明显的滞后。我们还可以在基准预测中看到我所说的模型粘性。在这种情况下,长期预测往往会高估系列趋势变化的幅度,并且对方向逆转的适应速度较慢。这在 20 世纪 80 年代 DARM T+12 预测中最为明显。我们可以看到,模型在峰值后反转方向很慢。
10 年期国债利率预测
结论
这为使用神经网络预测债券利率提供了有力的证据。这种神经网络结构可以极大地改善预测,并能更快地对趋势变化做出反应。这种预测方法也可能具有更好的性能,因为它同时预测所有 12 个未来期间。与其他典型的递归生成预测的基准模型(即预测 T+2 基于预测 T+1)不同,神经网络仅使用时间 T 的信息来预测所有 12 个时段。这基本上允许模型优化其权重,就好像使用了 12 个独立的模型一样。
这项分析只使用了一个单一的预测变量,通货膨胀的历史,以预测未来的通货膨胀率。有可能通过增加额外的预测因子来提高模型的性能。也可以使用不同的平滑方法,例如指数平滑,这可以允许改进预测。债券利率数据也可以在每日序列中获得,这可能是预测挑战的有趣补充,并提供额外的数据。
我的分析代码可以在我的 GitHub 上找到。我将继续更新代码和完善模型,因此结果可能会略有变化。
[## acertainKnight/FRED _ 预测 _ 最终
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/acertainKnight/FRED_Forecasting_Final) [## 10 年期国债固定到期利率
资料来源:美联储系统(美国)理事会发布:H.15 选定利率单位:频率…
fred.stlouisfed.org](https://fred.stlouisfed.org/series/GS10)
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
自动驾驶地图中的深度学习
更新:自本文撰写以来,有几篇关于深度学习的高清地图构建的新论文。当我有机会的时候,我会更新这个帖子
深度学习的应用已经在自动驾驶栈的各个组件中进行了探索,例如,在感知、预测和规划中。深度学习还可以用于映射,这是更高级自动驾驶的关键组件。
拥有准确的地图对于自动驾驶在路线选择、定位以及轻松感知方面的成功至关重要。可以通过订购商业地图服务来获得具有不同程度信息的地图。然而,在没有地图的地区,自动驾驶车辆需要依靠自己的地图构建能力来确保自动驾驶的功能性和安全性。
离线映射与在线映射
在离线绘图场景中,传感器数据被聚集在一个集中的位置。这些数据可能是卫星图像,也可能是相机或激光雷达等机载传感器收集的数据。它可能来自同一辆车在同一地点的多次通行,也可能来自一个车队的众包。地图的渲染是离线构建的,需要人工注释者在地图上注释语义结构并检查最终结果。传统的地图服务以这种离线方式工作,然后将经过注释和管理的地图提供给路上的车辆。
高清地图注释的用户界面示例(来源)
在线地图是在车辆上进行的,因此不能让人类参与其中。典型的例子是用于同步定位和绘图的 SLAM 系统。最近,语义 SLAM 专注于道路上的表面标记的几何和语义含义,被探索作为映射的轻量级解决方案。此外,单目语义在线映射(monoSOM) 是一个趋势性主题,其中使用神经网络将来自多个相机的单目图像的时间序列融合成语义鸟瞰图。这些话题超出了本文的范围,将在其他地方讨论。
标清地图与高清地图
根据输入分辨率的不同,深度学习在映射中的应用大致有两种类型。第一行工作集中于地图拓扑的发现,例如道路网络,并且通常不包含车道级别信息。他们只需要一张分辨率相对较低、精度大约为米级的图像。另一类应用侧重于提取车道级别信息,如车道线、路面箭头和其他语义标记。这需要更高分辨率的图像,具有厘米级的精度。相应地,这两种类型的地图在本文的其余部分将被统称为标清地图和高清地图。
深度学习在 SD 地图上的应用(左, DeepRoadMapper )和 HD 地图上的应用(右, DAGMapper )
这篇文章主要关注高清地图的离线生成。请注意,其中一些方法也可以应用于在线制图,我们将专门针对 SD 制图的一些相关工作进行一个简短的回顾。
注释者友好的映射
在离线映射中,有一个人类评审员来评审深度学习的结果是负担得起的,也是必不可少的。因此,不仅整体的准确性很重要,而且结果的表示也很重要,因为结果应该很容易被人类注释者修改。
由于大多数运动规划者只能处理结构化的并表示正确拓扑的车道图,映射算法的输出通常是一个 结构化表示(车道线的折线等)。幸运的是,这种表示有助于人工注释者的有效修改。
SD 映射(道路拓扑发现)
深度学习在地图绘制上的早期应用侧重于从相对低分辨率的航空图像中提取道路级拓扑。深度学习为 SD 映射创建了一个大覆盖范围的负担得起的解决方案。SD 地图中生成的道路拓扑的主要用途在自动驾驶环境中相对有限,用于路线选择和导航。然而,其中一些研究中提出的方法与后来的高清地图工作高度相关,因此在此进行回顾。
deep road mapper(ICCV 2017)接收从卫星获得的航空图像,并创建结构化的道路网络。它首先执行语义分割,并在生成的道路图上运行细化和修剪算法。由于语义分割的不准确性(被树、建筑物等遮挡),许多道路是断开的。为了解决这个问题,DeepRoadMapper 使用 A*搜索算法来生成连接假设以弥合差距。
road tracer(CVPR 2018)也注意到了不可靠的语义分割结果,将其作为中间表示进行了剔除。它使用迭代图构造来直接获得道路的拓扑。该算法需要做出决定,朝着某个方向前进一定的距离,类似于强化学习设置中的代理。
“代理”在 RoadTracer 中提取道路拓扑
poly mapper(ICCV 2019)可能受到 RoadTracer 的启发,它也消除了中间表示。它显式地统一了不同类型对象的形状表示,包括道路和街道建筑物,并将它们表述为封闭的多边形。公式非常巧妙和简洁,遵循迷宫墙跟随器算法。
在 PolyMapper 中使用迷宫墙跟随器对道路拓扑进行顺序化
PolyMapper 使用 Mask RCNN 架构提取建筑物和道路的边界遮罩。基于遮罩,它提取顶点,找到起始顶点,并使用 RNN 自回归迭代所有顶点以形成闭合多边形。
聚合地图的网络架构
在 RoadTracer 和**poly mapper中,地图结构化表示的自回归生成与高清制图中使用的非常相似。**
高清制图(车道等级信息提取)
SD 地图缺乏自主汽车安全定位和运动规划所需的细节和准确性。带有车道等级信息的高清地图是自动驾驶所必需的。高清地图生成通常采用更高分辨率的鸟瞰(BEV)图像,通过拼接机载相机图像和/或激光雷达扫描生成。
【结构化在线地图的分层递归注意网络,CVPR 2018】取道路的稀疏点云扫掠,输出包含车道边界实例的道路网络的结构化表示。它首先迭代地找到每条车道线的起点,然后对于每条车道线,沿着这条线迭代地绘制下一个顶点。这两个 rnn 以分层的方式组织起来,因此被命名为 HRAN——分层递归注意网络。********
分层循环注意力网络(来源)
它提出了折线损失的思想,以鼓励神经网络输出结构化折线。折线损失测量地面真实折线的边与其预测值的偏差。这比顶点上的距离更合适,因为有许多方法可以绘制等效的折线。****
折线损失(又名倒角距离损失)关注的是形状而不是顶点位置(源)
HRAN 使用每像素 5 厘米的分辨率,并在 20 厘米的精度内实现 0.91 召回。主要的失效模式来自于缺失或额外的车道线。注意,100%的准确性不一定是最终目标,因为注释者仍然需要手动检查这些图像并修复它们。这些故障案例可以相对容易地修复。后期作品深度边界提取器中使用的高度渐变图或许可以修复护栏被误认为车道线的 FP 情况。
来自 HRAN 的定性结果
深度结构化人行横道 (绘制人行横道的端到端深度结构化模型,ECCV 2018)从 Lidar 点和相机图像(lidar + RGB = 4 通道)产生的 BEV 图像中提取结构化人行横道。该网络生成三个独特的特征地图——语义分割、轮廓检测以及根据直接监控定义人行横道方向的角度。
天真地说,等高线图和角度/对齐图仅在人行横道边界处具有非零值。这类似于一键编码,并且提供了过于稀疏的监督。为了解决这一问题,等值线图采用了反距离变换(DT)的形式,并且角度图还将非零区域扩展到扩大的等值线带。另一种方法是使用高斯模糊来处理几乎是一个热点的地面真相,就像在 CenterNet 中一样。
这项工作在某种意义上不完全是端到端的,因为管道的最终目标是生成人行横道的两个结构化的、定向的边界。为了获得结构化的边界,三个中间特征地图连同一个粗地图(OpenStreetMaps,其提供道路中心线和交叉多边形)被输入到能量最大化管道中,以找到人行横道的最佳边界和方向角。
深层结构人行横道总体管线
BEV 输入分辨率为 4cm/像素,整体精度达到 0.96。主要故障模式是油漆质量差,导致不正确的距离变换和分割预测。
以上结果由几次行驶产生的输入离线得出。该模型还可以在同一位置单程运行在线,并可以实现类似的性能,在线生成图像质量差的附加故障模式。
来自深层结构人行横道的定性结果
深度边界提取器 (道路边界提取卷积递归网络,CVPR 2019)用折线提取道路边界。它受深度结构化人行横道的启发,使用卷积 RNN(卷积蛇,或 cSnake)以自回归方式进行预测。通过增加一个额外的激光雷达高度梯度通道,输入扩展了深层结构人行横道的输入,该通道通过获取 Sobel 滤波激光雷达 BEV 图的幅值生成。
cSnake 网络迭代地关注旋转的 ROI,并输出对应于道路边界的折线的顶点。它首先预测终点。基于每个端点,它裁剪和旋转以该端点为中心的特征地图,并定位下一个点的位置。上述过程自回归运行。
深边界提取器整体管线
Deep Boundary Extractor 以 4 cm/pixel 的输入分辨率运行,并实现约 0.90 逐点 F1 分数和 0.993 拓扑精度。
来自深边界提取器的定性结果
Dag mapper(通过发现车道拓扑来学习地图,ICCV 2019)将 HRAN 的结构化车道线提取工作向前推进了一步,并专注于分叉和合并等更难的情况。它接收激光雷达强度图并输出 DAG(有向无环图),而不是 HRAN 中的简单折线。
在 DAGMapper 的核心还有一个递归卷积头,它迭代地关注以最后预测点为中心的裁剪后的特征地图补丁,并预测下一个点的位置。变化在于它还预测点的状态是合并、分叉还是继续。
DAGMapper 的整体管线
输入分辨率为 5 厘米/像素。精确度/召回率/F1 在 2 像素(10 厘米)阈值处约为 0.76,在 10 像素(50 厘米)处约为 0.96。拓扑精度约为 0.89。
来自 DAGMapper 的定性结果
外卖食品
- 用于离线绘图的深度学习有一个人在循环中。深度学习的结果需要被结构化,以便能够被自动驾驶堆栈使用,并且能够被人类注释者容易地修改。
- 当前的高清制图应用主要集中在道路边界、车道线(包括合并和分叉拓扑)和人行横道边界的提取上。
- 所有 HD 制图研究的核心构建模块是递归卷积网络,它迭代地获取以当前注释点为中心的裁剪后的特征地图,并预测下一个注释点。
参考
- DeepRoadMapper :从航拍影像中提取道路拓扑,ICCV 2017
- RoadTracer :航拍影像道路网自动提取,CVPR 2018
- PolyMapper : 从航拍图像中提取拓扑图,ICCV 2019
- 折线损失 : 结构化在线地图的分层递归注意网络,CVPR 2018
- 深度结构化人行横道 : 绘制人行横道的端到端深度结构化模型,ECCV 2018
- 深度边界提取器:用于道路边界提取的卷积递归网络,CVPR 2019
- DAGMapper :通过发现车道拓扑学地图,ICCV 2019
- 稀疏高清地图 : 利用稀疏语义高清地图进行自动驾驶车辆定位,IROS 2019 口述
实践中的深度学习:思维导图备忘单
做深度学习需要什么?
一旦你理解了深度学习背后的理论,琐碎的下一步就是实践你所学到的东西。在这篇文章中,我试图在一个心理地图备忘单中收集所有与实践中的深度学习相关的内容。这对于深度学习初学者来说非常有用,这些初学者通常要么不知道要使用的工具或数据集,要么对一两个市场领导者的知识很肤浅,因为他们在几乎所有与深度学习相关的文档中都遇到过他们。如果你打算从事这个领域,你应该有一个更全面的看法。
在 Unsplash 上由 Tevarak Phanduang 拍摄的照片
思维导图的中心主题是“实践中的深度学习”,从中衍生出 5 个主要分支,即(1)编程语言,(2)框架和库,(3)ide、笔记本和源代码编辑器,(4)数据集和(5)实现。它们中的每一个都将在下面介绍。以下是所提议的思维导图备忘单的不同分支的摘录。每个工具和数据集前面都有一个指向下载页面的链接。最常用的工具用红色标出。
思维导图备忘单不同分支的摘录
你可以点击下面的按钮下载备忘单。由于思维导图非常大,请考虑将其下载到您的设备上,然后在 PDF 文档中缩放感兴趣的项目。
分支 1:编程语言
Python 是最著名的语言之一,甚至可能是最流行的。下面的利率随时间变化图就是很好的证明。根据过去 12 个月的谷歌全球趋势,它显示了 Python 与其潜在候选人 R、Julia 和 Scala 相比的趋势。你可以在思维导图中找到其他用于深度学习的语言,比如 java、javascript、Go……
分支 2:框架和库
我在思维导图中提到的一些框架和库只致力于深度学习,例如 M xNet 和 DeepLearning。Scala 。其他的不仅仅是深度学习。它们是更大的机器学习,具有很大的深度学习焦点,例如 TensorFlow 和 PyTorch 。此外,我收集到的框架和库类型多样: BigDL 和 PaddlePaddle 用于分布式深度学习, PaddleFL 用于联邦学习, PyTorch Mobile 和 TensorFlow Lite 用于移动和物联网设备上的深度学习,…
在下面的图表中,我展示了 GitHub 上最受欢迎的框架在提交、贡献者、明星、分叉和观察方面的近期活动。除了明星类别,TensorFlow 在其他类别中拥有最多的 GitHub 活动。Fastai 显示了更多的恒星。事实上,当我写这篇文章时,它是 GitHub 上第二大热门知识库。你可以在这里找到理解 GitHub 类别所需的一切。
分支 3:ide、笔记本和源代码编辑器
我将这个分支细分为 3 个主要部分:
(1)IDE:IDE,集成开发环境的首字母缩略词,使程序员能够整合编写计算机程序的不同方面。它通过将编写软件的常见活动(如编辑源代码、编译、构建可执行文件和调试)合并到一个应用程序中,提高了程序员的工作效率。在下表中,我展示了一些在思维导图中唤起的 ide。
(2)源代码编辑器:是 ide 的简化版本,因为它们提供的工具更少。它们是对编程语言敏感的,因此它们突出了程序的语法元素;并提供许多有助于程序开发的特性,如自动完成、编译、构建和运行。
(3)笔记本电脑:适合初学者,因为它们结合了 IDE 功能和人体工程学、交互式和易于使用的教育工具。他们还结合了实时代码、叙述性文本、等式、结果可视化、图像和其他几种媒体。在下表中,我根据自己选择的 6 个特性展示了 5 款开源笔记本电脑:
*支持的内核:*内核是执行笔记本中包含的代码的计算引擎/后端。我所说的支持的内核是指笔记本环境所支持的语言范围。
*类型:*此功能表示笔记本是基于网络的应用程序还是基于桌面的应用程序。web 应用程序的一个非常简单的定义是,它存储在一个远程服务器上,该服务器需要一个 web 浏览器作为客户端来运行,并且需要互联网来传输数据和资源。桌面应用程序旨在为不需要互联网的独立机器提供服务。如果安装了适当的软件包(例如,nteract),基于桌面应用程序的笔记本电脑可以用作基于网络的笔记本电脑。
*多语言:*是在一个笔记本中创建多语言支持的能力,以便允许不同语言执行的代码之间的互操作性。相反,单一语言笔记本允许您同时以其支持的语言之一创建笔记本。
*多用户:*表示允许多个用户同时编辑笔记本,而不会互相冲突、碰撞和覆盖。一些笔记本电脑可以与多个用户共享,但它们不具备多用户功能。Jupyter 本质上是一个单用户应用程序。但是,您可以使用 JupyterHub 来创建多用户 Hub,它管理和代理单用户 Jupyter 笔记本服务器的多个实例。
*云平台支持:*可以在个人电脑上工作。然而,管理需要大量数据的实际问题变得很困难。为了从 GPU 等更高的物质资源中受益,有必要向更高的计算规模转移。我之所以选择这个功能,是因为了解大型云平台是否支持笔记本电脑环境非常重要,也就是说,您创建笔记本电脑所需的一切都已预装在云上。
*社区:*如果您开始使用某个特定的笔记本电脑,您会希望与其他开发人员和专家建立联系。他们可以加快你的进度,帮助你解决一些遇到的问题。此外,文档应该基本可用。
分支 4:数据集
深度学习获得更好模型的关键是数据。这就是为什么我在建议的思维导图中专门为数据集设计了一个分支。所有诱发的数据集都是开放的,并且大量用于众多深度学习项目。其中一些甚至在市场领导者框架内实现了特定的类和功能;并且在全球比赛中非常常用,如 Kaggle 、 Codalab 和 DataDriven 。我选择添加到我的思维导图中的数据集属于不同的上下文,即图像处理(例如 MNIST 和 ImageNet)、自然语言处理(NLP)(例如 Yelp 和 WordNet)和语音识别(例如 LibriSpeech 和 AudioSet)
用于图像处理的开放深度学习数据集的样本
面对新型冠状病毒引起的新冠肺炎疫情,世界各地的研究人员正试图找到耗时的 RT-PCR 的其他诊断替代方法。深度学习应用于阳性新冠肺炎病例的胸部射线照相图像,例如胸部 X 射线(CXR)和计算机断层扫描(CT),已经显示出对冠状病毒诊断的很大希望。在这种情况下,我注意到很多人,特别是那些深度学习从业者,但不是医学成像专家,询问可用的新冠肺炎 CXR 和 CT 图像。因此,我列举了目前在这种情况下使用的开放数据集以及它们的 GitHub 链接。我还提到了现有的 CXR 和 CT 图像数据集,例如 RSNA 和 ChestX-ray14,它们已经被用于肺部疾病的检测和分类。这将帮助您将它们与新的新冠肺炎数据集合并,以便(1)将其与其他类型的肺炎区分开来,(2)决定谁应该优先接受新冠肺炎病例的 PCR 检测,以及(3)选择治疗方法,因为新冠肺炎和非新冠肺炎感染需要不同的治疗方案。
来自开放深度学习新冠肺炎和非新冠肺炎数据集的胸部 x 光图像
在此,我必须指出,我没有指出新冠肺炎数据库中的图像数量,因为它们变化很大。他们正在被科学界和医学协会扩大。随着新数据的出现,后者正在不断努力扩大这些基础。此外,新冠肺炎数据集仍处于初期阶段,有限且不成熟。你可以求助于一些技术,比如迁移学习和数据扩充,来改进训练过程。你可以在 AI 对抗新冠肺炎特别工作组和世界卫生组织(世卫组织)的网站上寻找其他数据集、挑战、项目和论文,其中大部分是预印本。希望这一切都会过去!
第五分部:实施
深度学习正在多个领域兴起,包括但不限于计算机视觉、在线推荐引擎、语音助手、医疗诊断、聊天机器人、预测营销分析、物理机器人和自动驾驶汽车。我在思维导图中提到的实现是说明性的,而不是详尽的。这些仅仅是举几个例子。我为您挑选了下面的链接,这些链接展示了与医学成像处理、NLP 和语音识别相关的深度学习的 3 个现实世界实现:
嗯!就是这个!
请注意,我并不要求列举与深度学习相关的所有工具、数据集和用例。我试图在一个单一的思维地图中收集这些后者的大部分。这仍有待讨论。我欢迎并重视您在这方面可能提出的任何问题和意见。此外,本文的目的不是判断哪种工具比其他工具更好。我不知道你是否注意到没有个人意见形成。它只是对主要深度学习工具及其特征的客观列举。
如果你错过了我以前的文章:
学习率问题和答案
towardsdatascience.com](/frequently-asked-questions-on-learning-rate-6defb4e45d2e) [## 全面综合了主要激活函数的优缺点
激活函数:神经网络最重要的超参数之一,必须仔细选择…
medium.com](https://medium.com/analytics-vidhya/comprehensive-synthesis-of-the-main-activation-functions-pros-and-cons-dab105fe4b3b)
宇宙中的深度学习:排名 3 机器学习(ML)应用
在过去十年中,深度学习帮助推动了多个领域的最新发展,科学研究也不例外。我们之前已经讨论过 Deepmind 在蛋白质折叠预测方面令人印象深刻的首次亮相,以及斯坦福学生研究蛋白质复合物结合操作的项目,这两个都是利用深度学习研究非常小的事情的例子。
深度学习同样也在科学研究中得到了应用,而这与规模光谱正好相反。在这篇文章中,我们将讨论深度学习用于研究宇宙学的一些最新应用,也就是对宇宙的研究。正如您所想象的,这个主题包含了各种各样的子类别。我们将从机器学习和基础科学的角度对这些项目的炒作和影响进行评级,尽管我们将根据趣味性而不是依赖引用指标来判断这一点。如果可能的话,我们还会提供每个项目公共资源库的链接,这样你就可以自己查看了。
大肆宣传是为了什么?人工智能解决了宇宙学中的三体问题
(格林等 2019) 一览:
TL;一个多层感知器被训练来预测一个简化的三体问题模拟中的未来位置。
炒作: 4/3 三倍浓咖啡。该项目的报道范围从人工智能可以解决难住牛顿的三体到神经网络解决三体的速度快一亿倍。媒体的大肆宣传遵循了研究论文中的描述性方法,这似乎是为了让专业领域之外的读者惊叹而精确设计的。由于深度学习和n-身体轨道力学方面的共同专业知识将是稀有的平方,很容易陷入不熟悉的细节而错过重点。
冲击(ML): 3/10 致密层。有趣的是,在这个大 conv 网络无处不在的时代,看到一个深度多层感知器被使用。
撞击(物理学): 3/ n 巨大的天体。
**模型:**具有 ReLU 激活的 10 层全连接神经网络。
**输入数据:**三体之一的起始位置和目标时间 t 。
**输出:**时间 t 三个粒子中的两个粒子的位置。坐标参考系统暗示了第三个粒子的位置。
代码:https://github.com/pgbreen/NVM(仅使用预先训练的模型权重进行推断)
解开人工智能如何解决宇宙学中的三体问题的细节
在经典轨道力学中,预测一个孤立的两个引力体系统的未来位置是相对容易的。再增加一个物体,我们就有了臭名昭著的三体问题,这是一个经典的例子,说明在一个看似简单的系统的动态相互作用中,混沌是如何出现的。混沌系统的一个标志是它们对初始条件极其敏感,它们的行为看起来是随机的。这些状态很难预测,混沌系统演化的时间越长,预测就变得越困难,因为过去的错误会不断增加。这就是为什么对于一个特工来说,学会摆动一根实心的杆子要比一根多节的杆子容易得多的原因之一:
像这种双摆的混沌系统很难预测和控制
就像强化学习代理努力控制双摆一样,科学家也发现很难预测像三体问题这样的混沌系统的未来状态。没有解析解,所以计算物理学家依靠他们的老朋友蛮力计算。这是可行的,但是并不总是清楚需要多少数值精度,并且会消耗大量资源。
这篇文章的作者使用了一个 10 层的多层感知器来预测三体轨道问题的未来状态。训练数据由名为 Brutus 的强力数值模拟器计算。我很喜欢看到一个“老式”的多层感知器,如果看看代码,用不同的训练超参数和不同的体系结构进行试验,会很有趣。不幸的是,可用的公共代码不包括任何培训实用程序。
我同意最近的怀疑态度,因为这篇论文的主张是由一个非常狭窄和简化的用例支持的,不太可能轻易地推广到更复杂的情况。我要补充的是,结果并不像宣传的那样令人印象深刻。当被训练来预测更远的未来时,性能显著下降,范围从大约 0.01 到 0.2 的平均绝对误差。当所讨论的无单位数几乎总是在-1 和+1 之间时,这些误差就很大。训练网络来预测未来还会导致训练集更大的过度拟合,这个问题在讨论中没有涉及。
在宇宙学中使用机器学习(ML)最有价值的领域是什么?用深度学习发现更多系外行星
艺术家对由马丁·科恩梅瑟创作的 K2–18b 的印象。图片来源美国宇航局
(Dattilo et al. 2019)
机器学习如何帮助发现新行星一览
**TL;博士:**开普勒太空望远镜在 2013 年发生故障,导致了大量的噪音数据。研究人员将 AstroNet-K2 训练为先前模型 AstroNet 的修改版本,以处理新的噪声数据,并发现了两颗新的系外行星。这些行星通过后续观测得到了验证。
炒作: 1/3 三倍浓咖啡。麻省理工学院技术评论的报道经过了合理的衡量,没有对该项目做出夸大或不切实际的声明,但有时忽略了提及 AstroNet-K2 是基于一年前发布的前一个项目 AstroNet。
影响(ML): 4/8 卷积滤波器。AstroNet 和 AstroNet-K2 的区别似乎在于超参数搜索和不同的数据集。
**Impact(系外行星天文学)😗*2/1076 个已知的【超级地球】(https://en . Wikipedia . org/wiki/File:Size _ of _ Kepler _ Planet _ candidates . jpg)由 AstroNet-K2 发现,并用额外的观测数据验证。我认为这是作为一个本科生研究项目开始的一个非常有益的成果。
**模型:**两个独立的卷积臂从输入数据中提取特征。这些卷积层的输出被结合并馈入输出最终预测的 4 个完全连接的层。
**输入数据:**开普勒望远镜 K2 运行的 1D 光变曲线。
**输出:**给定信号由凌日系外行星引起的概率。
代号:https://github.com/aedattilo/models_K2
解开机器学习如何发现新行星的细节
开普勒仪器是一个基于太空的望远镜,旨在研究太阳系以外的行星,也就是外行星。1995 年,迪迪埃·奎洛兹和米歇尔·马约尔描述了第一颗围绕像我们这样的恒星运行的系外行星,这两人获得了 2019 年诺贝尔物理学奖。十多年后,当开普勒于 2009 年发射时,已知的系外行星总数不到 400 颗。现在处于休眠状态的望远镜于 2009 年开始运行,在 2013 年用于精确指向的部件反应轮出现故障之前,发现了 1000 多颗新的系外行星。这结束了任务的第一阶段。
一些巧妙的工程改变让望远镜开始了第二阶段的数据采集,称为 K2。来自 K2 的数据更嘈杂,而且仅限于 80 天或更少的连续观测。这些限制给在成千上万个假定的行星信号中识别有前途的行星候选者带来了挑战,这项任务以前由卷积神经网络(AstroNet)处理开普勒初级数据收集阶段的数据处理得很好。德克萨斯大学奥斯汀分校的研究人员决定尝试相同的方法,并从 AstroNet 的架构中派生出 AstroNet-K2 来对 K2 行星信号进行排序。
经过训练,AstroNet-K2 在测试集中识别确认的系外行星的准确率达到 98%,假阳性率很低。作者认为这种性能足以用作分析工具,而不是完全自动化,需要人工跟踪。来自报纸:
虽然我们网络的性能还没有达到生成全自动且统一的
行星候选星表所需的
水平,但它可以作为
概念的证明。——(达蒂洛等 2019)
AstroNet-K2 获得了这篇博文梦寐以求的“最佳价值”奖,因为它实现了一项物有所值的重大科学发现。与列表中的其他两个项目不同,这两个项目更多的是概念性的演示,这个项目导致了实际的科学进步,为已知系外行星的目录增加了两个新的确认条目:EPIC 246151543 b 和 EPIC 246078672 b。
除了 K2 数据的内在挑战之外,行星的信号还因火星穿过观测窗口和与安全模式事件相关的 5 天数据缺失而进一步混淆。这是一个很好的有效的机器学习的例子:作者采用了一个现有的有良好记录的 conv 网络,并对其进行了修改,以在给定的数据上表现良好,添加了一些从困难的观察运行中获得的新发现,而没有重新发明轮子。
值得注意的是,这项研究的主要作者安妮·达蒂洛在研究完成时还是一名大学生。对于一个本科生研究项目来说,这是一个非常好的结果。开源软件的使用和基于以前开发的架构的构建强调了一个事实,即深度学习正处于高级准备阶段。这项技术还没有完全成熟到无处不在的地步,但工具都在货架上,随时可以应用。
CosmoGAN:引力透镜的生成对抗网络方法
(穆斯塔法等人 2019 )一览
柴郡猫星系团的引力透镜效应。图片来源 NASA
**TL;博士:**宇宙中有一堆缺失的物质,我们称之为暗物质。这种丢失质量的重力会弯曲光,宇宙学家可以根据光的扭曲来猜测暗物质的位置。深度卷积生成对抗网络擅长制作逼真的图像,这些研究人员训练了一个网络来制作看起来像与暗物质分布相关联的数据的图像。
炒作: 1/3 三倍浓咖啡。基本上我能找到的这篇论文的所有新闻报道都是从劳伦斯柏克莱国家实验室的新闻稿中抄袭来的。这样的报道并不过分夸张或古怪,尽管我会说对 CosmoGAN 实际上做了什么的描述是模糊的(但这篇论文在这方面也不是很清楚)。我最喜欢的标题是宇宙科学家利用神经网络以简单的方式构建暗物质地图。
影响(ML): 6/64 潜在空间随机变量。这是一个普通的 DCGAN,被训练来模拟引力弱透镜数据。
**撞击(宇宙学)😗*10 个中有 1 个不可观测的质量。
型号: CosmoGAN 是一款 DCGAN 。每个网络有 4 层,但由于具有较少的卷积滤波器,发生器的参数(1230 万)比鉴别器(440 万)多 3 倍。参数不一致是为了稳定训练,防止鉴别器脱离生成器。
输入数据: 64 单位潜向量(生成器),生成(由 CosmoGAN)和模拟(数值物理模拟器)弱透镜会聚图的 2D 图像,可以对应暗物质分布(鉴别器)。
**输出:**似是而非的会聚图(生成器),或给定图像是真实(模拟)会聚图的概率(鉴别器)
代号:https://github.com/MustafaMustafa/cosmoGAN
解开关于生成对抗网络如何导致引力透镜化的更好方法的细节
暗物质是一种相对神秘的物质形式,占(我们认为)宇宙质量的很大一部分(大约 85%)。“黑暗”的绰号指的是这样一个事实,即这种形式的物质在正常观测中是不可见的,而是只能从引力效应中推断出来,比如 20 世纪 60 年代由薇拉·鲁宾观测到的星系旋转速度的差异。研究暗物质的一个基本可观测现象是引力透镜,其中大质量物体扭曲了来自更远物体的光线。当透镜效应是由不可见的暗物质引起时,这就变成了一个困难的逆问题,需要密集的模拟来克服。
“如果你希望从零开始做一个苹果派,你必须首先发明宇宙”(卡尔·萨根,宇宙)。这同样适用于研究暗物质的存在:基于引力透镜的观察建立暗物质地图的黄金标准方法是创建一个(虚拟)宇宙。众所周知,宇宙的创造在计算上是昂贵的,旋转一个高保真度的宇宙来检查它是否与观察结果一致,这给可以完成的科学数量带来了实质性的限制。
当数据丰富而分析数据的计算不足时,科学家会寻找方法来开发替代模型,这些模型可以解释数据,而不必每次都构建一个全新的宇宙。CosmoGAN 就是这样一种方法,利用现代深度学习生成网络来估计引力透镜数据的收敛图。
自 Goodfellow 等人在 2014 年描述了生成性对抗网络以来,它们已经走过了漫长的道路。GAN 框架是一个(现在相当多样化的)生成模型的利基,它将生成网络与鉴别网络或伪造检测网络对立起来。这两个网络相互作用,产生越来越真实的合成数据,而鉴别器在检测假货方面越来越好。这种相互作用提供了纯 GAN 训练环路中唯一必需的训练信号(尽管像条件 GAN 这样的变体可以利用额外的数据),因此在 GAN 训练中平衡两个网络是一种艺术,众所周知,当这种平衡不均衡时,GAN 容易不稳定。
考虑到他们难以训练和解释的名声,甘斯在计算宇宙学家中找到了 从业者中的号 可能会有点令人惊讶。然而,CosmoGAN 的范围相当有限。生成器学习模仿收敛图的统计现实图像,但这些图像与潜在空间中的随机输入无关。在这种情况下,像古老的 edges2cats 演示中的 pix2pix 方案这样的条件 GAN 会更有意义。也就是说,生成一个似乎可以解释给定天文图像中透镜现象的会聚图将是有用的,这可以通过额外的观测来验证。
此外,由发生器产生的会聚图是 2D,但暗物质实际上将分布在三维空间。作者暗示,其中一些限制将在未来的工作中得到解决。例如,提到“可控的 gan”听起来类似于上面提到的条件 gan,他们确实打算制作一个 3D 版本的体积暗物质分布。如果是这样的话,这个项目中 85%的工作现在仍然是不可观察的。
这 3 个机器学习(ML)应用程序正在允许宇宙学中不可思议的发现和突破
我们刚刚开始看到它在宇宙学中的潜力。这篇文章强调了一个事实,即在太空研究中取得新的发现并不需要大胆地去科学家没有去过的地方。更确切地说,正如我们在系外行星项目中看到的那样,一种经过验证的技术的巧妙实现,可以适应并应用于一个新的数据集,从而产生新的发现。另一方面,这个列表中的另外两个项目,虽然拥有更高的期望和更闪亮的描述,但只是使用模拟数据的概念性探索。
我们还可以注意到,这些例子中非专业媒体报道的炒作因素与研究论文描述中使用的夸张程度相关。这表明研究人员不能将夸大的新闻报道完全归咎于科学记者,这个问题困扰着大多数研究领域,而不仅仅是 AI/ML。过度炒作会导致无效的反馈循环,导致经济/技术泡沫和研究资源的低效配置。这就是为什么我们更喜欢仔细看看新的深度学习应用的明星声明,无论它们是研究宇宙还是更世俗的东西。
【深度学习】引入生成对抗网络(GANs)
甘斯的直觉和客观功能
生成对抗网络(GANs)形成于 2014 年[1],是一种先进的深度神经网络,具有许多应用。与无监督学习中的传统机器学习(它不需要目标标签)不同,GANs 是一种通过给定数据生成新内容的生成模型。
有趣的是,GANs 首先从原始论文的右侧看到了 MNIST(手写数字数据库)的生成图像:
直觉
GANs 的类比被认为是伪钞制造者和警察之间的假币检测游戏[1]。根据 Goodfellow [2]对 GANs 的教程,GANs 由两个角色组成,分别是生成者(造假者)和鉴别者(警察)。
伪造者试图制造假币,并通过查看真钞来欺骗警察(鉴别者)。鉴别器的工作就是鉴别给定的钱是不是真的。首先,伪造者制造的货币太粗糙,很容易辨别。基于这些失败,现在伪造者努力生产更复杂的货币。与此同时,警察现在更有经验来辨别真假钱。
随着这一过程重复多次,双方都向对方学习(这就是它被称为“对抗性”的原因),因此变得足够成熟和老练。现在,造假者生产的假币对除了警察以外的其他人来说都是非常逼真的。
打假人与警察博弈的类比。图片由作者提供。
GANs 的目标函数
回想一下,目标函数是在训练时要优化的函数(通常是最大化它,如果我们要最小化它,通常它被称为损失函数)。寻找目标函数的最优点有几种方法,如最大似然估计(MLE)和不同的梯度下降法等。
GANs 由两个深度神经网络组成,生成器网络(表示为 G)和鉴别器网络(表示为 D)。G 的目的是从分布 p_data 中输出假数据 G(z)来欺骗 D。另一方面,鉴别器网络 D 输出真实数据的概率,其目标是最大化真实标签的概率和最小化虚假标签的概率(分布为 p_z)。
在训练期间,G 和 D 基于下面的最小-最大目标函数 V(G;d):
等式 1。作者图片
鉴别器应该给真实图像(D_θd(x))一个高值,这与对它取逻辑函数((logD_θd(x)))是一样的。它还应该给假图像(G_θg(z))一个低值,这与减去它并取逻辑函数(log(1- D_θd(x))是一样的。简而言之,可以通过上述目标函数 V(G;d)为 d。
对于生成器来说,最好是愚弄生成器,如果 D_θd(x)接近 1,就可以实现,这与最小化 log(1- D_θd(x))相同。对于生成器来说是有区别的,也就是说,最小-最大函数 V(G;d)不依赖于发电机。(在打假人与警察的博弈类比中,警察能否识别真钱与打假人无关。)简而言之,它与最小化目标函数 V(G;d)对于θg。
训练甘斯
由于训练中的实际原因,对发生器部分进行了修改,而不是原来的目标函数:
等式 2。作者图片
原因是在训练开始时,生成的伪图像太明显(即 D_θd(x)接近于零),因此损失几乎为零并且具有零梯度。
对于新的目标函数,当 D_θd(x)较小时,梯度比原来的高:
等式 3。作者图片
但是对于一个梯度:
等式 4。作者图片
当 D_θd(x)较小时,等式 3 中的分母比等式 4 中的分母小得多。
原始论文陈述了鉴别器 D 的最佳点和训练过程,这里跳过这些以避免数学细节和直接复制,但是这里提供了用于说明的非正式想法:
- 训练在小批量的噪声样本和真实例子中进行。minibatch 的目标是加快训练过程,因为通过所有数据训练 DNN 是非常繁重的。
- 发电机的原始随机梯度下降通常被方程 2 的随机梯度上升代替。
参考资料:
- 古德费勒、j .普热-阿巴迪、m .米尔扎、b .徐、d .沃德-法利、s .奥泽尔、a .库维尔和 y .本吉奥。生成对抗网络。在 NIPS,2014。
- 好家伙。Nips 2016 教程:生成性对抗网络。arXiv 预印本 arXiv:1701.00160,2016。