惯性导航的深度学习
基于深度学习的惯性导航前沿解决方案综述。
Or 等人 2020
介绍
在过去十年中,出现了许多视觉辅助导航方法,因为这些方法的应用范围很广(黄,2019)。换句话说,以低成本惯性传感器为唯一信息源的惯性导航经典领域已经开始受到所涉及的新颖深度学习方法的关注。惯性导航的主要问题是漂移,这是误差的一个重要来源。更多的问题包括错误的初始化、不正确的传感器建模和近似误差。
在这篇文章中,我们回顾了深度学习和惯性测量单元(IMU)在经典惯性导航系统(INS)中的集成,这些集成仅解决了上述部分问题。首先,我们介绍一些先进的架构来改进速度估计、降噪、零速度检测以及姿态和位置预测。其次,讨论了 KITTI 和 OxIOD 数据集。最后,给出了具有深度学习的行人惯性导航方案。
基于深度学习的尖端解决方案
导航领域的主要问题之一是速度估计。随着估计变得精确,它也将影响位置解。在 Cortes 等人 2018 年发表的工作中,提出了一种基于深度学习的速度估计方法。主要思想是在经典的惯性导航系统(INS)中加入速度约束。他们仅通过使用 CNN 来估计 IMU 的速度,然后通过这种预测来约束 INS 解。将这种估计公式化为回归深度学习任务,其中输入是 IMU 在几秒内的六通道,输出是速度,这将改善轨迹跟踪和运动模式分类。
科尔特斯等人,2018 年
我想展示的下一个作品是关于降噪的。由于许多低成本传感器会受到高幅度噪声的影响,并且噪声随时间变化,因此需要对其进行滤波。然而,由于这些噪声分布难以估计,使用基于深度学习的方法似乎可以解决这个问题。Chen 等人(2018)提出了一种新的深度学习方法来处理传感器信号中的许多误差源。通过这样做,传感器的信号可以被校正,然后才能用于导航方案。他们报告说,正确识别 IMU 信号的准确率为 80%。CNN 也用于这项工作,其中它包括 5 个卷积层和一个全连接层。
陈等,2018
瓦格斯塔夫和凯利(2018)的另一项工作涉及室内导航任务,其中提出了一种检测脚零速度的方案。通过这样做,提供了速度估计的精度,并且通过一般的 INS 提高了精度。检测是通过设计一个长短期记忆(LSTM)神经网络来完成的。通过评估超过 7.5 [km]的室内行人运动数据的设计,他们报告了定位误差的减少超过 34%。他们的架构包括 6 层 LSTM,每层 80 个单元,以及 LSTM 之后的单一全连接层。
瓦格斯塔夫和凯莉(2018)
我要讨论的最后一项工作与导航领域的一个主要问题有关:姿态和位置预测。实现精确的姿态状态估计对于多旋翼系统非常重要,因为微小的误差都可能导致不稳定并最终导致灾难。Al-Sharman 等人(2019)的一项工作提出了一种基于深度学习的状态估计增强,特别适用于姿态估计。他们通过降噪技术解决了精确姿态估计的问题,从而确定了测量噪声的特性。他们使用了一个简单的多层神经网络和一种退出技术,这种技术比传统的方法更优越。
阿尔-沙曼等人(2020 年)
公共数据集
有两个通用数据集可用于评估不同的建议方法,第一个是卡尔斯鲁厄理工学院的 KITTI 数据集,它包含大量数据:威力登、IMU、GPS、相机校准、灰度立体序列、3D 物体卡车标签等等。Geiger 等人(2013 年)的论文回顾了整个数据集。Alto KITTI 是该领域的主要数据集,我想提一下另一个全新的数据集,由牛津大学命名为“OxIOD”。它用于深度惯性里程计,完整信息见陈等人(2018)的论文。
盖格等人(2013 年)
陈等(2018)
行人惯性导航
最近,人们对将深度学习技术应用于行人的运动传感和位置估计越来越感兴趣。在 Chen 等人(2020)的工作中,审查了基于深度学习的行人 INS 方法、数据集和设备上的界面。在他们的工作中,他们提出了 L-IONet,一个从原始数据中学习惯性跟踪的框架。该架构主要包含 1d 扩展卷积层,受 WaveNet 启发,具有全连接层。
Klein 等人(2020)的另一项工作提出了 StepNet:一种用于步长估计的深度学习方法。作者通过一系列基于深度学习的方法来回归步长,从而解决了行人室内航位推算问题。建议的 StepNet 优于他们论文中描述的传统方法。
克莱因等人(2020 年)
总结
随着深度学习的热度不断上升,它似乎解决了惯性导航领域的许多经典问题。正如我们在这篇文章中所描述的,一些研究已经解决了深度学习和惯性导航的集成问题,并取得了可喜的成果。
参考
黄,。“目视惯性导航:简明综述.” 2019 机器人与自动化国际会议(ICRA) 。IEEE,2019。
科尔特斯、圣地亚哥、阿诺·索林和胡奥·坎纳拉。“基于深度学习的速度估计,用于约束智能手机上的捷联惯性导航.” 2018 IEEE 第 28 届信号处理机器学习国际研讨会(MLSP) 。IEEE,2018。
陈,华,等,“用深度学习方法减少误差改进惯性传感器” NAECON 2018-IEEE 全国航空航天与电子会议。IEEE,2018。
瓦格斯塔夫,布兰登和乔纳森·凯利。“用于鲁棒惯性导航的基于 LSTM 的零速度检测。” 2018 室内定位与室内导航国际会议(IPIN) 。IEEE,2018。
状态估计增强的基于深度学习的神经网络训练:应用于姿态估计。 IEEE 仪器仪表与测量汇刊69.1(2019):24–34。
视觉遇上机器人:kitti 数据集。国际机器人研究杂志 32.11(2013):1231–1237。
陈,常浩,等。“Oxiod:用于深度惯性里程计的数据集。” arXiv 预印本 arXiv:1809.07491 (2018)。
基于深度学习的行人惯性导航:方法、数据集和设备上的推断。 IEEE 物联网期刊7.5(2020):4431–4441。
克莱恩、伊茨克和奥姆里·阿斯拉夫。" Step net——用于步长估计的深度学习方法." IEEE 访问8(2020):85706–85713。
移动设备上自然语言处理的深度学习
使用 Expo、React-Native、TensorFlow.js 和 MobileBERT 进行阅读理解
作者照片
随着跨平台 Web 和移动开发语言、库以及 React [1]、React Native [2]和 Expo [3]等工具的进步,移动 app 在机器学习和其他领域找到了越来越多的应用。针对 React Native [4]和 TensorFlow Lite [5]发布的 TensorFlow.js 允许我们直接在跨平台移动设备上训练新的机器学习和深度学习模型和/或使用预训练模型进行预测和其他机器学习。
最近我发表了两篇文章【7】来演示如何使用Expo【3】、React【1】和React Native【2】来开发多页面移动应用程序,这些应用程序利用 TensorFlow.js 进行 React Native【4】和预训练的卷积神经网络模型 MobileNet 和 COCO-SSD 分别用于移动设备上的图像分类和对象检测。
如[6][7]所述,React【1】是一种流行的用于构建 Web 用户界面的 JavaScript 框架,而 Reactive Native 继承并扩展了组件框架(如组件、道具、状态、 JSX 等)。)的 React,使用预建的原生组件,如视图、文本、*可触摸不透明、*等,支持原生 Android 和 iOS 应用的开发。
特定于移动平台的语言(例如 Object-C、Swift、Java 等)中的本机代码。)通常使用 Xcode 或 Android Studio 开发。为了简化移动应用开发,Expo [3]为我们提供了一个围绕 React 原生和移动原生平台构建的框架和平台,允许我们使用 JavaScript/TypeScript 在 iOS、Android 和 web 应用上开发、构建和部署移动应用。因此,任何文本编辑器工具都可以用于编码。
在本文中,与[6][7]类似,我开发了一个多页面移动应用程序,以演示如何使用 TensorFlow.js [5]和一个预先训练好的深度自然语言处理模型 MobileBERT [8][9][10]在移动设备上进行阅读理解。
类似于[6][7],这个移动应用在 Mac 上开发如下:
- 使用 Expo 生成多页面应用程序模板
- 安装库
- 在 React JSX 开发移动应用代码
- 编译和运行
假设最新的 node.js 已经安装在你的本地电脑/笔记本电脑上,比如 Mac。
1.正在生成项目模板
为了使用 Expo CLI 自动生成新的项目模板,首先需要安装 Expo CLI :
npm install *expo-cli*
然后可以生成一个新的 Expo 项目模板,如下所示:
expo init *qna
cd qna*
本文中的项目名称为 qna (即问答)。
如[6][7]所述,我选择世博管理工作流的标签模板来自动生成几个示例屏幕和导航标签。TensorFlow logo 图像文件tfjs.jpg在本项目中使用,需要存储在生成的。/assets/images 目录。
2.安装库
开发阅读理解移动应用程序需要安装以下库:
- @tensorflow/tfjs ,即 TensorFlow.js,一个用于训练和部署机器学习模型的开源硬件加速 JavaScript 库。
- @ tensor flow/tfjs-react-native,TensorFlow.js 在移动设备上新的平台集成和后端。
- @ React-Native-community/async-storage,React Native 的异步、未加密、持久、键值存储系统。
- expo-gl ,提供了一个视图,作为 OpenGL ES 渲染目标,用于渲染 2D 和 3D 图形。
- @tensorflow-models/qna ,预训练的自然语言处理模型 MobileBERT [9][10],它可以将问题和相关段落作为输入,并返回该问题最可能的答案、它们的置信度以及答案在段落中的位置(答案在段落中的开始和结束索引)的数组。
npm install [*@react*](http://twitter.com/react)*-native-community/async-storage* [*@tensorflow/tfjs*](http://twitter.com/tensorflow/tfjs)[*@tensorflow/tfjs-react-native*](http://twitter.com/tensorflow/tfjs-react-native) *expo-gl* [*@tensorflow*](http://twitter.com/tensorflow)*-models/qna*
另外,@ tensor flow/tfjs-react-native/dist/bundle _ resource _ io . js需要react-native-fs(react-native 的一个原生文件系统访问):
npm install *react-native-fs*
由于在@ tensor flow/tfjs-React-native/dist/camera/camera _ stream . js中使用了Expo-camera(一个为设备的前置或后置摄像头渲染预览的 React 组件)也是需要的。
*expo install *expo-camera**
3.开发阅读理解移动应用程序代码
如前所述,首先我使用 Expo CLI 自动生成示例屏幕和导航标签。然后我修改了生成的屏幕,增加了一个新的 Qna (问答)屏幕,用于阅读理解。以下是生成的屏幕:
- 简介屏幕(参见图 2)
- 阅读理解( Qna )屏幕(见图 3)
- 参考屏幕(参见图 4)
屏幕底部有三个相应的选项卡用于导航。
本文重点介绍用于自然语言阅读理解的 Qna screen 类(源代码见【11】)。本节的其余部分将讨论实现细节。
3.1 准备 TensorFlow 和 MobileBERT 模型
生命周期方法componentidmount*()用于初始化 TensorFlow.js,并在 Qna 屏幕的用户界面准备就绪后加载预先训练好的 mobile Bert【9】【10】模型。*
*async componentDidMount() {
await tf.ready(); // preparing TensorFlow
this.setState({ isTfReady: true});
this.model = await qna.load();
this.setState({ isModelReady: true });
}*
3.2 选择文章和问题
一旦 TensorFlow 库和 MobileBERT 模型准备就绪,移动应用程序用户就可以键入一篇文章和一个与这篇文章相关的问题。
为了方便起见,[10]中的段落和问题在本文中作为默认段落和问题重复使用。
默认段落:
*Google LLC is an American multinational technology company that specializes in Internet-related services and products, which include online advertising technologies, search engine, cloud computing, software, and hardware. It is considered one of the Big Four technology companies, alongside Amazon, Apple, and Facebook. Google was founded in September 1998 by Larry Page and Sergey Brin while they were Ph.D. students at Stanford University in California. Together they own about 14 percent of its shares and control 56 percent of the stockholder voting power through supervoting stock. They incorporated Google as a California privately held company on September 4, 1998, in California. Google was then reincorporated in Delaware on October 22, 2002\. An initial public offering (IPO) took place on August 19, 2004, and Google moved to its headquarters in Mountain View, California, nicknamed the Googleplex. In August 2015, Google announced plans to reorganize its various interests as a conglomerate called Alphabet Inc. Google is Alphabet's leading subsidiary and will continue to be the umbrella company for Alphabet's Internet interests. Sundar Pichai was appointed CEO of Google, replacing Larry Page who became the CEO of Alphabet."*
默认问题:
*Who is the CEO of Google?*
3.3 寻找问题的答案
一旦在移动设备上提供了一篇文章和一个问题,用户可以点击“查找答案”按钮来调用方法 findAnswers ()来查找文章中给定问题的可能答案。
在这种方法中,调用准备好的 MobileBERT 模型,以将提供的段落和问题作为输入,并生成问题的可能答案列表及其概率和位置(段落中答案的开始和结束索引)。
*findAnswers = async () => {
try {
const question = this.state.default_question;
const passage = this.state.default_passage;
const answers = await this.model.findAnswers(question, passage);console.log('answers: ');
console.log(answers);return answers;} catch (error) {
console.log('Exception Error: ', error)
}
}*
3.4 报告答案
阅读理解完成后,调用方法 renderAnswer ()在移动设备的屏幕上显示答案。
*renderAnswer = (answer, index) => {
const text = answer.text;
const score = answer.score;
const startIndex = answer.startIndex;
const endIndex = answer.endIndex;return (
<View style={styles.welcomeContainer}>
<Text key={answer.text} style={styles.text}>
Answer: {text} {', '} Probability: {score} {', '} start: {startIndex} {', '} end: {endIndex}
</Text>
</View>
)
}*
4.编译和运行移动应用程序
本文中的移动应用程序由一个 react 本地应用服务器和一个或多个移动客户端组成。移动客户端可以是 iOS 模拟器、Android 模拟器、iOS 设备(例如,iPhone 和 iPad)、Android 设备等。我验证了 Mac 上的移动应用服务器和 iPhone 6+和 iPad 上的移动客户端。
4.1 启动 React 本地应用服务器
如[6][7]中所述,在任何移动客户端可以开始运行之前,移动应用服务器需要启动。以下命令可用于编译和运行 react 本地应用服务器:
*npm install
npm start*
如果一切顺利,应该会出现如图 1 所示的 Web 界面。
图 1: 反应式应用服务器。
4.2 启动移动客户端
一旦移动应用服务器开始运行,我们就可以在移动设备上启动移动客户端。
由于我在本文中使用 Expo [3]进行开发,因此在移动设备上需要相应的 Expo 客户端应用程序。iOS 移动设备的 Expo 客户端应用程序在苹果商店免费提供。
在 iOS 设备上安装 Expo 客户端应用后,我们可以使用移动设备上的摄像头扫描 react 本地应用服务器的条形码(见图 1),以使用 Expo 客户端应用运行移动应用。
图 2 显示了 iOS 设备(iPhone 和 iPad)上移动应用程序的简介屏幕。
***图 2:*iOS 设备上的介绍画面。
图 3 显示了阅读理解的屏幕(段落、问题、“查找答案”按钮和答案)。
***图 3:*iOS 设备上的 Qna 屏幕。
以下是 findAnswers ()方法调用的输出:
*Array [
Object {
"endIndex": 1206,
"score": 12.2890625,
"startIndex": 1186,
"text": "replacing Larry Page",
},
Object {
"endIndex": 1206,
"score": 10.87109375,
"startIndex": 1150,
"text": "Pichai was appointed CEO of Google, replacing Larry Page",
},
Object {
"endIndex": 1206,
"score": 9.658203125,
"startIndex": 1196,
"text": "Larry Page",
},
Object {
"endIndex": 1156,
"score": 5.2802734375,
"startIndex": 1150,
"text": "Pichai",
},
]*
图 4 显示了参考屏幕。
***图 4:*iOS 设备上的参考屏幕。
5.摘要
与[6][7]类似,在本文中,我使用 Expo [3]、React JSX、React Native [2]、React Native 的 TensorFlow.js 和预先训练好的深度自然语言处理模型 MobileBERT [9][10]开发了一个用于移动设备上阅读理解(问答)的多页移动应用。
我验证了 Mac 上的移动应用服务器和 iOS 移动设备(iPhone 和 iPad)上的移动应用客户端。
正如[6][7]和本文所展示的那样,这种移动应用程序有可能被用作开发其他机器学习和深度学习移动应用程序的模板。
本文的移动应用程序项目文件可以在 Github [11]中找到。
参考
- 反应
- 反应土著
- 世博会
- tensor flow . js for React Native
- TensorFlow Lite
- Y.张,面向移动设备的图像分类深度学习
- Y.张,深度学习在移动设备上检测图像中的物体
- J.Devlin,M.W. Chang 等人, BERT:用于语言理解的深度双向转换器的预训练
- Z.孙,于,等, MobileBERT:一个面向资源受限设备的任务无关的精简 BERT
- tensor flow . js 预训 MobileBERT 问答
- Y.张, Github 中的手机 app 项目文件
用 PyTorch 和 Torchtext 实现自然语言处理的深度学习
PyTorch 和 Torchtext 教程
Torchtext 的预训练单词嵌入,数据集 API,迭代器 API,以及带有 Torchtext 和 PyTorch 的训练模型
PyTorch 是我一直在使用的一个非常棒的深度学习框架。然而,说到 NLP,不知何故我找不到像 torchvision 那样好的实用程序库。原来 PyTorch 有这个 torchtext ,在我看来,缺少如何使用它的例子,文档[6]可以改进。此外,有一些很好的教程,如[1]和[2],但是,我们仍然需要更多的例子。
本文的目的是向读者提供关于如何使用 torchtext 的示例代码,特别是使用预先训练的单词嵌入、使用数据集 API、使用迭代器 API 进行小批量,以及最后如何结合使用这些来训练模型。
使用 Torchtext 预训练单词嵌入
在预训练的单词嵌入中有一些替代方法,如 Spacy [3],Stanza (Stanford NLP)[4],Gensim [5],但在本文中,我想重点介绍使用 torchtext 进行单词嵌入。
可用单词嵌入
你可以在 torchtext 看到预训练单词嵌入列表。在撰写本文时,支持 3 个预先训练好的单词嵌入类:GloVe、FastText 和 CharNGram,没有关于如何加载的更多细节。这里的列出了详尽的列表,但我有时会花时间去阅读,所以我会在这里列出列表。
**charngram.100d
fasttext.en.300d
fasttext.simple.300d
glove.42B.300d
glove.840B.300d
glove.twitter.27B.25d
glove.twitter.27B.50d
glove.twitter.27B.100d
glove.twitter.27B.200d
glove.6B.50d
glove.6B.100d
glove.6B.200d
glove.6B.300d**
有两种方法可以加载预训练的单词嵌入:启动单词嵌入对象或使用Field
实例。
使用现场实例
你需要一些玩具数据集来使用它,所以让我们设置一个。
df = pd.DataFrame([
['my name is Jack', 'Y'],
['Hi I am Jack', 'Y'],
['Hello There!', 'Y'],
['Hi I am cooking', 'N'],
['Hello are you there?', 'N'],
['There is a bird there', 'N'],
], columns=['text', 'label'])
然后我们可以构造Field
对象来保存特性列和标签列的元数据。
from torchtext.data import Fieldtext_field = Field(
tokenize='basic_english',
lower=True
)label_field = Field(sequential=False, use_vocab=False)# sadly have to apply preprocess manually
preprocessed_text = df['text'].apply(lambda x: text_field.preprocess(x))# load fastext simple embedding with 300d
text_field.build_vocab(
preprocessed_text,
vectors='fasttext.simple.300d'
)# get the vocab instance
vocab = text_field.vocab
要获得预训练单词嵌入的真实实例,可以使用
vocab.vectors
启动 Word 嵌入对象
对于这些代码中的每一个,它将下载大量的单词嵌入,所以你必须有耐心,不要一次执行下面所有的代码。
快速文本
FastText 对象有一个参数:language,它可以是“simple”或“en”。目前他们只支持 300 个嵌入维度,如上面的嵌入列表中所提到的。
from torchtext.vocab import FastText
embedding = FastText('simple')
查恩格拉姆
from torchtext.vocab import CharNGram
embedding_charngram = CharNGram()
手套
手套对象有两个参数:名称和尺寸。您可以查看每个参数支持的可用嵌入列表。
from torchtext.vocab import GloVe
embedding_glove = GloVe(name='6B', dim=100)
使用单词嵌入
使用 torchtext API 使用单词嵌入超级简单!假设您已经将嵌入存储在变量embedding
中,那么您可以像使用 python 的dict
一样使用它。
# known token, in my case print 12
print(vocab['are'])
# unknown token, will print 0
print(vocab['crazy'])
正如你所看到的,它已经处理了未知的令牌,没有抛出错误!如果您尝试将单词编码成整数,您会注意到,默认情况下,unknown token 将被编码为0
,而 pad token 将被编码为1
。
使用数据集 API
假设变量df
已经如上定义,我们现在通过为特征和标签构建Field
来准备数据。
from torchtext.data import Fieldtext_field = Field(
sequential=True,
tokenize='basic_english',
fix_length=5,
lower=True
)label_field = Field(sequential=False, use_vocab=False)# sadly have to apply preprocess manually
preprocessed_text = df['text'].apply(
lambda x: text_field.preprocess(x)
)# load fastext simple embedding with 300d
text_field.build_vocab(
preprocessed_text,
vectors='fasttext.simple.300d'
)# get the vocab instance
vocab = text_field.vocab
这里有一点警告,
Dataset.split
可能返回 3 个数据集( train,val,test ),而不是定义的 2 个值
使用迭代器类进行小型批处理
我没有找到任何现成的Dataset
API 来加载 pandas DataFrame
到 torchtext 数据集,但是创建一个还是很容易的。
from torchtext.data import Dataset, Example ltoi = {l: i for i, l in enumerate(df['label'].unique())}
df['label'] = df['label'].apply(lambda y: ltoi[y])class DataFrameDataset(Dataset):
def __init__(self, df: pd.DataFrame, fields: list):
super(DataFrameDataset, self).__init__(
[
Example.fromlist(list(r), fields)
for i, r in df.iterrows()
],
fields
)
我们现在可以构建DataFrameDataset
并用熊猫数据帧初始化它。
train_dataset, test_dataset = DataFrameDataset(
df=df,
fields=(
('text', text_field),
('label', label_field)
)
).split()
然后我们使用BucketIterator
类来轻松地构造迷你批处理迭代器。
from torchtext.data import BucketIteratortrain_iter, test_iter = BucketIterator.splits(
datasets=(train_dataset, test_dataset),
batch_sizes=(2, 2),
sort=False
)
记住使用 sort=False 否则当你试图迭代test_iter
时会导致错误,因为我们还没有定义 sort 函数,然而不知何故,默认情况下test_iter
被定义为排序。
小提示:虽然我同意我们应该使用
DataLoader
API 来处理迷你批处理,但是目前我还没有探索过如何使用DataLoader
和 torchtext。
培训 PyTorch 模型的示例
让我们使用 1 个嵌入层和 1 个线性层定义一个任意 PyTorch 模型。在当前的例子中,我没有使用预训练的单词嵌入,而是使用新的未训练的单词嵌入。
import torch.nn as nn
import torch.nn.functional as F
from torch.optim import Adamclass ModelParam(object):
def __init__(self, param_dict: dict = dict()):
self.input_size = param_dict.get('input_size', 0)
self.vocab_size = param_dict.get('vocab_size')
self.embedding_dim = param_dict.get('embedding_dim', 300)
self.target_dim = param_dict.get('target_dim', 2)
class MyModel(nn.Module):
def __init__(self, model_param: ModelParam):
super().__init__()
self.embedding = nn.Embedding(
model_param.vocab_size,
model_param.embedding_dim
)
self.lin = nn.Linear(
model_param.input_size * model_param.embedding_dim,
model_param.target_dim
)
def forward(self, x):
features = self.embedding(x).view(x.size()[0], -1)
features = F.relu(features)
features = self.lin(features)
return features
然后,我可以很容易地重复如下的训练(和测试)例程。
重用预先训练的单词嵌入
很容易将当前定义的模型修改为使用预训练嵌入的模型。
class MyModelWithPretrainedEmbedding(nn.Module):
def __init__(self, model_param: ModelParam, embedding):
super().__init__()
self.embedding = embedding
self.lin = nn.Linear(
model_param.input_size * model_param.embedding_dim,
model_param.target_dim
)
def forward(self, x):
features = self.embedding[x].reshape(x.size()[0], -1)
features = F.relu(features)
features = self.lin(features)
return features
我做了 3 行修改。您应该注意到,我已经更改了构造函数输入以接受嵌入。此外,我还将view
方法改为reshape
,并使用 get 操作符[]
而不是 call 操作符()
来访问嵌入。
model = MyModelWithPretrainedEmbedding(model_param, vocab.vectors)
结论
我已经完成了使用 torchtext 在 PyTorch 中处理文本数据的探索。我开始写这篇文章是因为我在使用互联网上现有的教程时遇到了困难。我希望这篇文章也能减少其他人的开销。
写这段代码需要帮助吗?这里有一个谷歌 Colab 的链接。
参考
[1]聂,A . torch text 教程。2017.http://anie.me/On-Torchtext/
[2]用 TorchText 教程进行文本分类。https://py torch . org/tutorials/初学者/text _ 情操 _ngrams_tutorial.html
[3]节文档。https://stanfordnlp.github.io/stanza/
[4] Gensim 文档。https://radimrehurek.com/gensim/
[5]空间文件。https://spacy.io/
[6] Tor chtext 文档。https://pytorch.org/text/
自然语言处理的深度学习:单词嵌入
简单直观的单词嵌入
介绍
单词嵌入 已经成为最常用的工具之一,也是需要处理语音或文本等自然语言的人工智能任务取得惊人成就的主要驱动力。
在本帖中,我们将揭开它们背后的神奇,看看它们是什么,为什么它们成为了自然语言处理 (NLP 下文)世界中的标准,它们是如何构建的,并探索一些最常用的单词嵌入算法。
一切都将以简单直观的方式进行解释,避免复杂的数学运算,并尽量使帖子的内容易于理解。
这将在以下小节中进行分解:
- 什么是单词嵌入?
- 为什么要使用单词嵌入?
- 单词嵌入是如何构建的?
- 最流行的单词嵌入有哪些?
一旦你准备好了,让我们开始看看什么是单词嵌入。
1)什么是单词嵌入?
计算机把一切都分解成数字。更确切地说是比特(零和一)。当计算机内部的软件(例如机器学习算法)必须操作或处理一个单词时会发生什么?很简单,这个单词需要作为交给计算机,作为它唯一能理解的:数字。
在 NLP 中,最简单的方法是通过创建一个包含大量单词的词汇表(比如说 100,000 个单词),并为词汇表中的每个单词分配一个数字。
我们词汇中的第一个词(苹果也许)将是数字 0。第二个字(香蕉’)将是数字 1,依此类推直到数字 99.998,前一个到最后一个字(国王’)和 999.999 被分配给最后一个字(王后’)。
然后我们将每个单词表示为一个长度为 100.000 的向量,其中每个单项除了其中一项都是零,对应于该单词所关联的数字的索引。
前面段落中一些例子的矢量表示。
这被称为单词的一键编码。
one-hot 编码有各种不同的与效率和上下文相关的问题,我们马上就会看到。
单词嵌入只是另一种形式通过向量表示单词,它通过某种方式抽象每个单词的上下文或高级含义成功地解决了使用一键编码带来的许多问题。
这里的主要要点是,单词嵌入是表示单词的向量,所以意思相似的单词有相似的向量。
2)为什么要使用单词嵌入?
考虑前面的例子,但是我们的词汇中只有三个词:*‘苹果’,【香蕉】,和‘国王’。*这些单词的一个热编码向量表示如下。
我们词汇的一个热门向量表示
如果我们在三维空间中绘制这些单词向量,我们将得到如下图所示的表示,其中每个轴代表我们拥有的一个维度,图标代表每个单词向量的末端。
三维空间中我们的一个热编码字向量的表示。
正如我们所看到的,从任何一个向量(图标的位置)到所有其他向量的距离都是相同的:两个大小为 1 的步长在不同的方向。如果我们将问题扩展到 100.000 维,采取更多的步骤,但在所有单词向量之间保持相同的距离,这将是相同的。
理想情况下,我们希望**具有相似含义或代表相似项目的词的向量靠近在一起,**远离那些具有完全不同含义的词:我们希望苹果靠近香蕉但远离国王。
此外,一个热编码非常低效。仔细想想,它们是巨大的空向量,只有一项的值不为零。它们非常稀疏,会大大降低我们的计算速度。
**总之:**一种热编码不考虑单词的上下文或含义,所有单词向量之间的距离相同,效率非常低。
单词嵌入通过用一个相当小的(150、300、500 维)固定大小的向量表示词汇表中的每个单词来解决这些问题,这个向量被称为嵌入,它是在训练期间学习的。
这些向量是以这样一种方式创建的,即出现在相似上下文中或者具有相似含义的单词靠得很近**,并且它们不像从一键嵌入中导出的那些向量那样是稀疏向量。**
如果我们有一个二维单词嵌入表示我们之前的 4 个单词,并将其绘制在 2D 网格上,它看起来会像下图一样。
我们的示例单词的二维单词嵌入表示
从上图中我们可以清楚地看到,单词’ apple ‘和’ banana ‘之间的单词嵌入表示比单词’ king ‘和’ queen '之间的单词嵌入表示更接近,这适用于相反的情况:当我们使用单词嵌入时,具有相似含义的单词更接近。
这个事实也让我们可以做一些非常非常酷的事情。我们可以操作单词嵌入,使用单词的表示从一个已知单词到另一个单词。
下图显示了如果我们从单词 ’ king ’ 的嵌入中减去单词 ’ royal ’ 的嵌入,我们将到达单词 ’ man ’ 的嵌入附近。以类似的方式,如果我们从皇后的嵌入中减去’ royal’ 的嵌入,我们到达单词 ’ woman ’ 的嵌入附近的某处。爽吧?
单词嵌入操作。国王、王后、男人、女人的例子非常流行来说明这一点。
最后,正如我们在单词嵌入向量中看到的,它们通常具有较小的尺寸(在我们的例子中是 2,但是大多数时候它们具有 150、200、300 或 500 维)并且不是稀疏的,使得使用它们进行计算比使用单热点向量更有效。
3)单词嵌入是如何构建的?
你可能已经猜到了,像机器学习生态系统中的许多元素一样,单词嵌入是通过学习建立的。从数据中学习。
有许多算法可以学习单词嵌入,我们将很快看到它们,但总的目标是构建一个矩阵 E ,它可以将表示单词的一个热点向量转换为固定大小的向量,即该单词的嵌入。
让我们来看一个非常高级的例子。
想想这句话我喜欢喝苹果冰沙’。如果我去掉这个词**’苹果**’我们就剩下下面这个不完整的句子:‘我喜欢喝 __ 思慕雪’。如果我接下来给你这个不完整的句子,并让你猜缺失的单词,你可能会说像’ 香蕉 ‘、 **’ 草莓’、**或’ 苹果 '这样的单词,它们都有相似的意思,并且通常出现在相似的上下文中。
学习单词嵌入的主要方法之一是通过与此非常相似的过程:算法通过在巨大的文本句子语料库中猜测缺失单词来学习在相似上下文中多次出现的单词的相似单词嵌入。
嵌入矩阵 E (将一个热嵌入转换成单词嵌入向量的矩阵)通过训练类似于语言模型(试图预测句子中缺失单词的模型)的东西来计算,使用人工神经网络来预测该缺失单词,其方式类似于如何计算网络的权重和偏差。
在实践中,你可以避免训练你自己的单词嵌入,因为有从各种语料库构建的公开可用的单词嵌入(像维基百科或 Twitter GloVe 单词嵌入),节省你的时间和精力。
最后,让我们简单看看一些最流行的单词嵌入算法。
4)最流行的单词嵌入有哪些?
最常用的两种单词嵌入算法是 Word2Vec 和 GloVe。让我们看看它们是如何工作的。
- **word 2 vec:**word 2 vec是一组相关的模型,它们通过使用两层、浅层的人工神经网络来产生单词嵌入,这些人工神经网络试图使用单词的上下文来预测单词( 连续的单词包 — CBOW),或者仅使用一个单词来预测上下文( Skip-gram 模型)。这是上一节描述的过程。
CBOW 和 Skipgram Word2Vec 型号。在 CBOW 中,我们试图使用上下文来预测单词 apple,而在 Skip-gram 模型中,我们试图预测单词 apple 的上下文。
- GloVe: 是*全局向量的缩写,GloVe 算法通过在单词之间使用共现矩阵来计算单词嵌入。这个矩阵是通过阅读一个巨大的句子语料库并为它找到的每个独特的单词创建一列和一行而构建的。对于每个单词,它使用特定的窗口大小记录它与其他单词在同一个句子中出现的次数,因此它也可以测量两个单词在一个句子中的接近程度。*
窗口大小为 2 的句子“我喜欢喝苹果冰沙”的同现矩阵
结论和额外资源
就是这样!一如既往,我希望你喜欢这篇文章,并且我设法帮助你理解了什么是单词嵌入,它们是如何工作的,以及它们为什么如此强大。
如果您想了解有关该主题的更多信息,您可以在这里找到一些附加资源:
- 一种神经概率模型。 本吉奥等。
- 吴恩达教授关于学习单词嵌入的讲座。
- 机器学习掌握单词嵌入的帖子。
- 单词嵌入及其在语义模型中的应用概述。
如果你喜欢这篇文章,那么请随时关注我的推特@jaimezorno 。还有,你可以看看我其他关于数据科学和机器学习的帖子 这里 。好好读!
如果你想了解更多关于机器学习和人工智能的知识 在 Medium 上关注我 ,敬请关注我的下一篇帖子!另外,你可以查看 这个资源库 获取更多关于机器学习和人工智能的资源!
最后,看看我关于 NLP 深度学习的其他帖子:
** [## NLP 的深度学习:ann,RNNs 和 LSTMs 解释!
了解人工神经网络,深度学习,循环神经网络和 LSTMs 前所未有地使用…
towardsdatascience.com](/deep-learning-for-nlp-anns-rnns-and-lstms-explained-95866c1db2e4) [## NLP 的深度学习:用 Keras 创建聊天机器人!
了解如何使用 Keras 构建递归神经网络并创建聊天机器人!谁不喜欢友好的机器人…
towardsdatascience.com](/deep-learning-for-nlp-creating-a-chatbot-with-keras-da5ca051e051)
- 封面图片来自。
- 图标来自 平面图标 。
- 所有其他图像都是自己制作的。**
语义文本匹配的深度学习
在本文中,我们将讨论语义文本匹配问题,它在信息检索(网络搜索)、问题回答、推荐系统等领域都有应用。
语义文本匹配是估计源文本和目标文本之间语义相似度的任务。让我们用下面这个寻找最接近问题的例子来理解这一点。我们得到了一个大的问题语料库,对于任何提出或搜索的新问题,目标是从这个语料库中找到最相似的问题。语义是这项任务的一个重要方面。例如,在给定的图中,问题“投资房地产市场的逐步指南是什么”与源问题并不十分相关,但仍然与源问题有很高的句法重叠。而这里的句法重叠指的是两者之间的常用词数量。
我们将讨论如何为这样的任务建立一个机器学习系统。
来源:作者图片
下表列出了语义文本匹配在网络搜索、赞助搜索、问题回答和产品推荐领域的一些应用。
来源:作者图片
在本文的剩余部分中,我们将把重点放在新闻搜索上,作为一个说明性的例子,目标是为给定的输入查询找到相关的新闻文章。尽管我们将要讨论的技术适用于任何语义文本匹配任务。
来源:作者图片
下图描述了新闻搜索 IR 系统的高级流程:
IR 系统(新闻搜索)(来源:作者图片)
基线方法
首先,让我们看一个简单的二进制分类方法来构建这样一个检索和排序系统。本质上,我们希望建立一个模型,该模型将查询和文档作为输入,并预测文档与查询相关的概率。
为了训练这个模型,首先我们需要生成带有查询和文档对以及 0/1 标签的训练数据。这种训练数据可以基于人类标记来收集。但是人工标记非常昂贵,而且只能产生有限的数据。这就是为什么通常使用基于历史点击数据的代理标签生成方法。
因此,如果对于给定的查询,当向用户显示文档时,该文档已经接收了最小数量的点击和最小点击率,则查询-文档对被标记为 1。并且对于同一查询,从语料库中随机采样的少量文档被标记为 0,并用于训练模型。
一旦我们收集了这些数据,我们就可以从查询和文档中提取一些特征,并训练一个二元分类模型(SVM/提升树/神经网络),然后将其用于我们的 IR 系统。
对于任何类似“银行存款利率”的查询,我们都会根据语料库中的文档逐一进行评估。首先,我们将查询和文档 1 传递给模型,这将给出该文档与查询相关的概率。然后,我们将传递查询和文档 2,并获得文档 2 的概率,我们将对语料库中的所有文档进行预测。一旦我们有了所有文档的概率,我们就可以根据概率对它们进行排序,并将排名靠前的文档返回给用户。
但是正如您可能已经观察到的,这种方法是不可伸缩的,因为文档语料库可能非常庞大,并且逐个对文档进行评分是不可行的。
来源:作者图片
大规模系统的两步法;
为了平衡规模和质量,大规模语义文本匹配系统通常遵循两步方法:
步骤 1 —候选人生成:
第一步是候选人生成。候选生成步骤的目标是快速检索与输入查询相关的文档子集。这一步有一些假阳性是可以的,如果这有助于使这一步更快。有多种方法可以构建候选生成模块。我们将在本文中讨论两种方法。
候选人生成(来源:作者图片)
步骤 2 —重新分级:
一旦我们有了 100 个候选文档,下一步就是重新排序。重新排序步骤的目标是相对于输入查询对候选文档进行排序,从而可以向用户显示排名靠前的文档。有多种方法可以构建重新排序模块。我们将在本文中讨论两个模型。
重新排名(来源:作者图片)
候选人生成:
基于倒排索引的候选生成:
传统上,基于令牌的倒排索引用于候选生成。倒排索引本质上是一个哈希映射,它将标记或单词映射到包含该标记的文档列表。这种索引构建可以离线完成。
然后,当查询到来时,首先我们将把查询分成标记,然后对于每个标记,我们将查找索引以获得包含该标记的文档列表。这些单个列表与 BM25 得分的联合可用作下一步重新分级的候选文档。
基于倒排索引的候选生成(来源:作者图片)
但是这种基于标记的检索具有局限性,因为它不能捕获单词之间的语义关系。例如,该方法为查询“银行存款利率”检索新闻文章“由于非法采矿在河岸沉积沙子”,因为没有办法区分“金融”银行和“河流”银行。
基于嵌入的候选生成:
最近,使用 DNN 嵌入的候选生成变得流行,因为它们可以更好地捕获查询和文档语义。在深入研究嵌入如何用于候选生成之前,让我们先简要介绍一下嵌入
**单词嵌入:**文献中提出了许多密集嵌入技术,如 word2vec、Glove、fasttext 等。这些技术的目的是通过几个 100 维实数密集向量来表示单词,使得语义相似单词的向量在 n 维空间中是邻近的。预先训练的单词嵌入可从各种 NLP 组下载。
Word2vec CBoW 和 Skip-gram 是两个早期的单词嵌入模型,它们围绕密集单词嵌入产生了很多兴趣。CBoW 将单词周围的上下文作为输入,并试图预测单词,而 skip-gram 将单词作为输入,并试图预测世界各地的上下文。这两种架构的目标都是提取单词共现模式,从而捕获单词之间的语义关系
来源:【word 2 矢量模型的 CBoW 和 Skip-gram 架构
**句子嵌入:**一种生成句子嵌入的方法可以是直接对句子中的单词向量进行平均,但是这种平均嵌入对于像语义匹配这样的下游任务来说执行得不是很好。已经提出了许多模型来学习更好的句子嵌入。BERT 就是这样一个基于 transformer 架构的流行深度学习模型。各种 NLP 小组都提供了在大量文本数据(如维基百科和图书语料库)上训练的预训练 BERT 模型。这些预先训练的模型可以用于为语料库中的文档生成嵌入
有了这个关于嵌入的快速背景,让我们看看如何使用嵌入来生成候选项。首先,我们可以使用像 BERT 这样的技术生成语料库中所有文档的嵌入。现在,当新的查询出现时,我们可以使用相同的 BERT 预训练模型将其转换为数字向量。然后可以基于查询嵌入和每个文档嵌入之间的余弦相似性来检索候选文档。
来源:作者图片
但是计算所有文档嵌入的查询嵌入的余弦相似度是非常昂贵的。这就是类似 FAISS 的相似性搜索库发挥作用的地方。这些库允许在嵌入空间中非常有效的 top-k 检索。本质上,文档向量可以使用像 FAISS 这样的库进行离线索引。现在,当新的查询出现时,我们可以使用相同的 BERT 预训练模型将其转换为数字向量。然后,使用查询嵌入对文档的向量索引运行最近邻搜索,并在嵌入空间中检索前 k 个最近的文档。
密集向量的高效相似性搜索(来源:作者图片)
重新分级:
一旦我们检索到前 k 个候选文档,下一步就是根据查询对这些文档进行排序,这样就可以向用户呈现排名靠前的结果。
为什么我们需要重新排名?
一种方法可以是完全取消重新排序步骤,直接使用由候选生成步骤提供的排序来选择最高的结果。但是这种方法不是最佳的,因为候选生成具有局限性:
- 首先,对于候选生成步骤,需要离线预计算文档嵌入,这意味着只能使用独立于查询和基于嵌入的模型。此外,任何在查询和文档之间使用交叉特征的模型都不能用于候选生成步骤。
- 第二,重新排序模型可用于优化特定任务目标,如赞助搜索中的点击率或产品推荐中的转化率,而通用预训练模型可用于候选生成。
让我们来看看重新排序任务的几个深度学习模型。
二重奏模型
巴斯卡尔·米特拉等人。艾尔。提出了深度学习模型 Duet 用于重排序任务。该模型将查询和文档对中的单词嵌入作为输入,然后是交互层和密集层,以计算给定查询的文档的概率。这个模型可以在查询文档训练数据上进行训练,如基线方法一节中所讨论的。
伯特为排名
戴等。艾尔。提出扩展 BERT 模型进行任务重排序。它建议采用预先训练的 BERT 模型,并在查询文档训练数据上微调该模型。此微调模型可用于重新分级任务。
结论
我们讨论了一种用于处理大规模语义文本匹配问题的端到端深度学习方法。我们还使用了 Kaggle 的识别 Quora 重复问题问题来说明本文讨论的技术的样本代码。
带代码的笔记本在 GitHub 有售。
我们还就此主题举办了一场网络研讨会。同样的录像可以在 youtube 上观看
供应链优化的深度学习|使用自动化机器人分拣包裹
我是如何制造一个自主机器人来帮助你更快地获得在线订单的
自动化是过去几年的主要趋势。现在,随着电子商务需求的不断增长,亚马逊每天处理 576 万份订单(仅在美国!),供应链行业面临一个新的优化问题。
分拣是交付过程中的一个重要步骤,传统上,这一过程是手工进行的。在谷歌上简单搜索“包裹分拣工作,你会看到成千上万家公司为此招聘人力。不用说,手工分拣速度慢,效率低,还会导致延误。在像供应链这样快节奏的行业中,每一分钟的延迟都会导致公司收入的损失。
来源:“ UPS 的 200 亿美元问题:运营停滞在 20 世纪”
因此,公司正在寻找更快、更有效和更可靠的系统。这个问题可以用机器学习来解决。
因此,在冠状病毒封锁期间,我无法进入电子产品和五金店,我决定用我在家里能找到的任何废料制作自己的“自动分拣机”。这台机器能够根据包裹的最终目的地将它们分类。
该视频展示了项目的运作。
它是如何工作的!
- 传送带上方放置了一个摄像头。
- 照相机将包裹的快照发送到计算机。
- 计算机处理输入,并对图像运行深度学习算法(更快的 RCNN)。
- 深度学习模型确定包裹的合适目的地,并自动分拣。
技术方面的东西
- 我用 Tensorflow 对象检测 API 训练了一个基于更快 RCNN 架构的深度学习模型。
更快的 RCNN 架构
- 我在自己的数据集上通过点击数百张要分类的包裹照片来训练它。
- 在使用 Tensorflow 对象检测 API 训练模型之后,OpenCV 使用训练期间生成的推理图和 labelmap 执行分类任务。
从网络摄像头获取视频输入的 OpenCV 脚本
作者照片-深度学习模型对包的分类
- 这就是模型对包进行分类的方式。
- 一旦被识别,算法就向 Arduino 微控制器发送信号。
- 微控制器向适当的伺服电机发出信号,使其迅速进入,并将包裹分拣到所需的目的地。
结论
为了提高速度和效率,减少对手工劳动的依赖并最大限度地提高利润,各行业都在寻求供应链中每一步的自动化。随着世界变得越来越依赖在线服务,机器人,自动驾驶卡车,增强现实,仓库自动化,只是未来技术的一部分,这些技术将改变我们所知的电子商务的面貌。
参考资料:
使用 PyTorch 对表格数据进行深度学习
关于多类分类问题
深度学习已被证明在计算机视觉、自然语言处理、信号处理等许多领域具有开创性。然而,当涉及到由分类或数字变量组成的更结构化的表格数据时,传统的机器学习方法(如随机森林,XGBoost)被认为表现更好。正如所料,神经网络已经赶上来了,并且在许多情况下表现得一样好,有时甚至更好。
用表格数据执行深度学习的最简单方法是通过 fast-ai 库,它给出了非常好的结果,但对于试图了解幕后真正发生了什么的人来说,它可能有点太抽象了。因此,在本文中,我介绍了如何构建一个简单的深度学习模型来处理 Pytorch 中关于多类分类问题的表格数据。
Pytorch 的一点背景
Pytorch 是一个流行的开源机器库。它和 Python 一样使用和学习简单。使用 PyTorch 的其他一些优势是它的多 GPU 支持和自定义数据加载器。如果你对基础知识不熟悉或者需要复习,这里是一个很好的起点:
密码
如果你想遵循代码,这是我的 Jupyter 笔记本:
使用 jovian.ml 共享](https://jovian.ml/aakanksha-ns/shelter-outcome)
资料组
我使用了收容所动物结果 Kaggle 竞赛数据:
帮助改善收容所动物的结果
www.kaggle.com](https://www.kaggle.com/c/shelter-animal-outcomes/data)
这是一个表格数据集,在训练集中包含大约 26k 行和 10 列。除了DateTime
之外的所有列都是分类的。
来自训练集的样本数据
问题陈述
给定庇护所动物的某些特征(如年龄、性别、颜色、品种),预测其结果。
有 5 种可能的结果:Return_to_owner, Euthanasia, Adoption, Transfer, Died
。我们期望找到一个动物的结果属于 5 个类别中的每一个的概率。
数据预处理
尽管这一步骤很大程度上取决于特定的数据和问题,但仍有两个必要的步骤需要遵循:
摆脱Nan
价值观:
Nan
(非数字)表示数据集中缺少值。该模型不接受Nan
值,因此它们必须被删除或替换。
对于数字列,处理这些值的一种流行方法是用 0、均值、中值、众数或其他剩余数据的函数来估算它们。缺失值有时可能表示数据集中的基础要素,因此人们通常会创建一个与缺失值列相对应的新二进制列来记录数据是否缺失。
对于分类列,Nan
值可以认为是自己的类别!
编码所有分类列的标签:
因为我们的模型只能接受数字输入,所以我们将所有的分类元素转换成数字。这意味着我们不用字符串来表示类别,而是用数字。选择代表类别的数字应在 0 到该列中不同类别总数(包括Nan
)的范围内。这是为了当我们为该列创建分类嵌入时,我们希望能够索引到我们的嵌入矩阵中,该矩阵对于每个类别都有一个条目。下面是一个简单的标签编码示例:
我使用了 scikit-learn 库中的[LabelEncoder](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html)
类来编码分类列。您可以定义一个定制的类来完成这项工作,并跟踪类别标签,因为您也需要它们来编码测试数据。
编码目标的标签:
如果目标有字符串条目,我们还需要对其进行标签编码。此外,确保维护一个将编码映射到原始值的字典,因为您将需要它来计算模型的最终输出。
庇护所结果问题的特殊数据处理:
除了上述步骤,我还对示例问题做了一些处理。
- 删除了
AnimalID
栏,因为它很独特,对训练没有帮助。 - 删除了
OutcomeSubtype
列,因为它是目标的一部分,但我们没有被要求预测它。 - 删除了
DateTime
列,因为记录输入时的确切时间戳似乎不是一个重要的特性。事实上,我最初试图将它拆分成单独的月和年列,但后来意识到将该列一起删除会得到更好的结果! - 删除了
Name
列,因为它有太多的Nan
值(缺少 10k 以上)。此外,它似乎不是决定动物结果的一个非常重要的特征。
注意:在我的笔记本中,我堆叠了训练和测试列,然后进行了预处理,以避免必须根据测试集上的训练集标签进行标签编码(因为这将涉及到维护一个编码标签到实际值的字典)。在这里进行堆叠和处理是没问题的,因为没有数字列(因此没有进行输入),并且每列的类别数量是固定的。在实践中,我们绝不能这样做,因为这可能会将测试/验证集中的一些数据泄露给训练数据,并导致对模型的不准确评估。例如,如果您在类似age
的数字列中有缺失值,并决定用平均值对其进行估算,则平均值应仅在训练集(非堆叠训练-测试-有效集)上计算,并且该值也应用于估算验证和测试集中的缺失值。
范畴嵌入
分类嵌入与自然语言处理中常用的单词嵌入非常相似。基本思想是让列中的每个类别都有一个固定长度的向量表示。这与一次性编码的不同之处在于,我们不是使用稀疏矩阵,而是使用嵌入,为每个类别获得密集矩阵,其中相似类别在嵌入空间中具有彼此接近的值。因此,这个过程不仅节省了内存(因为对包含太多类别的列进行一键编码确实会破坏输入矩阵,而且它是一个非常稀疏的矩阵),而且还揭示了分类变量的内在属性。
例如,如果我们有一列颜色,我们为它找到嵌入,我们可以期望red
和pink
在嵌入空间中比red
和blue
更近
分类嵌入层相当于每个独热编码输入之上的额外层:
来源:分类变量的实体嵌入研究论文
对于我们的 shelter outcome 问题,我们只有分类列,但我会将值少于 3 的列视为连续列。为了决定每列嵌入向量的长度,我从 fast-ai 库中取了一个简单的函数:
Pytorch 数据集和数据加载器
我们扩展了 Pytorch 提供的[Dataset](https://pytorch.org/docs/stable/_modules/torch/utils/data/dataset.html#TensorDataset)
(抽象)类,以便在训练时更容易访问我们的数据集,并有效地使用DataLoader
模块来管理批处理。这包括根据我们的特定数据集覆盖__len__
和__getitem__
方法。
因为我们只需要嵌入分类列,所以我们将输入分成两部分:数字和分类。
然后,我们选择批量大小,并将其与数据集一起提供给数据加载器。深度学习一般是批量进行的。DataLoader
帮助我们有效地管理这些批次,并在训练前重组数据。
要进行健全性检查,您可以遍历创建的数据加载器来查看每个批处理:
模型
我们的数据被分成连续的和分类的部分。我们首先根据之前确定的大小将分类部分转换为嵌入向量,并将它们与连续部分连接起来,以馈送到网络的其余部分。这张图片展示了我使用的模型:
住房结果模型
培养
现在我们在训练集上训练模型。我已经使用了 Adam 优化器来优化交叉熵损失。训练非常简单:迭代每一批,向前传递,计算梯度,梯度下降,根据需要重复这个过程。可以看看我的笔记本了解代码。
测试输出
由于我们对找到测试输入的每个类的概率感兴趣,所以我们对模型输出应用了 Softmax 函数。我还提交了一个 Kaggle 来看看这个模型的表现如何:
我们做了很少的功能工程和数据探索,并使用了非常基本的深度学习架构,但我们的模型比大约 50%的解决方案做得更好。这表明这种使用神经网络对表格数据建模的方法非常强大!
参考文献:
- https://www . usfca . edu/data-institute/certificates/fundamentals-deep-learning—第 2 课
- https://jovian.ml/aakashns/04-feedforward-nn
时间序列分类的深度学习(InceptionTime)
用于时间序列分类的新深度学习(类 GoogleNet)模型。
图 InceptionTime 的初始模块。
索引
- 动机
- 用于时间序列分类的机器学习
- 时间序列分类的最佳深度学习实践:InceptionTime
- 了解初始时间
- 结论
1。动机
时间序列数据一直是金融服务的主要兴趣,现在随着实时应用的兴起,零售和编程广告等其他领域正在将注意力转向时间序列数据驱动的应用。在过去几年中,云服务的几个主要参与者,如 Apache Kafka 和 Apache Spark,已经发布了处理时间序列数据的新产品。因此,理解机器学习(ML)在这个新兴领域中的作用和潜力是非常有趣的。
在这篇文章中,我通过跟踪[ 2 作者的一系列出版物,讨论了关于深度学习的时间序列分类(TSC)的(非常)最新发现。
**2。**用于时间序列分类的机器学习
定义问题:
TSC 是 ML 对学习如何给时间序列分配标签感兴趣的领域。更具体地说,我们对训练 ML 模型感兴趣,当输入一系列按时间顺序索引的数据点(例如,金融资产的历史数据)时,它输出标签(例如,资产的行业部门)。
更正式的说法是,让【t8(x,y)】成为一个训练实例,带有 T 观察值 (X,… ,Xᵀ)≡ X (时间序列)和一个离散类变量 y ,它取 k 个可能值(标签)。一个数据集 S 就是一组 n 这样的训练实例: S= { (X₍₁₎,y₍₁₎),…,(X₍ n₎,y₍ n₎)) } 。对时间序列数据进行分类的任务包括在 S 上学习分类器,以便从可能的输入空间 {X} 映射到标签 {y,…,yᵏ} 上的概率分布。
我们真的需要 DL 吗?
提醒我们自己 DL 只不过是一套解决问题的工具,这一点很重要,尽管 DL 可能非常强大,但这并不意味着我们应该盲目地将 DL 技术应用于每一个问题。毕竟,训练和调整神经网络可能非常耗时,所以测试其他 ML 模型的性能,然后寻找任何潜在的缺点总是一个好的做法。
通常,问题的性质是由数据本身决定的;在我们的例子中,选择处理和分类时间序列的方式高度依赖于数据的长度和统计。也就是说,让我们运行一个快速量纲分析来估计我们问题的复杂性。
假设我们希望为我们的 TSC 问题学习一个最近邻分类器(这在文献中很常见)。现在给定一个长度为 T 的 n 时间序列的数据集,我们必须为 ⁿC₂=n(n-1)/2 唯一对计算某种距离度量。此外,为了找到两个时间序列 X₍₁₎ 和 X₍₂₎ 之间的“最佳距离”,我们必须为每一对唯一的训练实例计算 T×T 逐点距离矩阵mʲᵏ=(x₍₁₎ʲ-x₍₂₎ᵏ),然后寻找优化我们的目标函数的路径。正如在[ 3 中所解释的,文献中有几种针对这种设置的优化算法,它们都具有复杂度 O(n ⋅ Tᶜ) ,其中 c=3 或 4 。显然,时间序列的长度真的会损害计算速度。然而,对于某些类型的数据,这个问题可以在不挖掘复杂的机器学习模型(如深度神经网络)的情况下得到缓解。
在信号处理中,通过将信号分解成一系列“基本”信号来分析复杂信号,称为傅立叶模式。例如,下面的方波可以用三个不同频率的正弦信号 (f₁、f₂、f₃)=(ω、3ω、5ω) 来近似,对于某个恒定角频率 ω 。
图 2:方波的傅立叶级数展开(红线)。这里我只介绍前三种模式(蓝色虚线)和它们的加法(绿线)。希望不难看出,通过增加下一个模式,级数很快收敛到方波。
通过对这些信号进行线性求和,我们可以重建原始信号:
方波(t)= w⋅sin(f₁t)+w⋅sin(f₂t)+w⋅sin(f₃t)+…
其中系数 (W,W,W ) = (1,1/3,1/5) 指定每个模式对方波贡献的权重。
现在考虑一个数据集,在该数据集内,最初由一系列 T 时间有序数据点表示的任何时间序列也可以由三个基本频率模式所跨越的空间中的权重向量来表示:
X=(X,…,Xᵀ ) → W = (W,w,w,…)。
从我们的时间序列数据的“时间”表示到“频率”表示被称为傅立叶变换,虽然傅立叶空间在理论上是无限维的(而不是三维的),但我们可以应用各种近似技术将傅立叶级数截断到有限维。最重要的是,我们可以将时间序列数据的 T 维表示减少到多个维度(在傅立叶空间),这使得我们的分类问题在计算上是可跟踪的。总的来说,我们可以在数据预处理阶段应用傅立叶变换,以将输入时间序列转换成权重向量,然后继续构建我们的分类模型(例如,1-最近邻分类器)。使用这种“行为良好”的时间序列,我们可以在不使用 DL 的情况下实现高性能。
现在,前述处理方法假设任何输入信号都可以用基本(谐波)函数的傅立叶级数来近似。然而,许多现实世界的时间序列数据是如此嘈杂(如金融数据),不允许这样一个优雅的分解(或任何形式的数学预处理)。正是针对这种类型的数据,DL 前来救援:在处理非结构化噪声数据时,让模型自己学习如何处理时间序列数据是一个更有前途的解决方案。
3。TSC 的最佳 DL 实践:开始时间
迄今为止,TSC 有两种最先进的 DL 型号。最古老的模型称为 HIVE-COTE [ 4 ],它基于最近邻算法和动态时间弯曲相似性度量。尽管该算法在基准数据集[ 5 ]上取得了优异的性能,但其时间复杂度为 O(n ⋅ T ⁴) 。最近[ 6 ]的作者介绍了一种深度卷积神经网络(CNN),称为 InceptionTime,它不仅比 HIVE-COTE 的精度更高,而且速度也快得多。InceptionTime 的高精度及其可扩展性使其成为产品开发的完美候选!
为此,让我们介绍一下 InceptionTime 最重要的组件,以及这些组件是如何在 Keras 中实现的。
3.1 输入层
一般来说,时间序列 X 的每个数据观测值 Xʲ (j=1,…,T) 可以是一个或多个数据测量值的列表,即 Xʲ = ( X₁ʲ,…,X_m ʲ ) 对于 m 数据测量值,都是在第 j 时刻进行的。例如,一个质点在三维空间中运动的速度由三个空间分量组成: V =(V₁,V₂,V₃) 。跟踪粒子的速度达 T 秒,每秒一次观测,相当于收集一系列数据:( V ,…,vᵀ)。
定义 1: 安米-维多元时间序列【MTS】*x =(x,…,x【ᵀ】*由 T 有序元素 X
定义二:一个长度为 T 的单变量时间序列 X 简单来说就是一个 m=1 的 MTS,即xʲ→xʲ∈ℝ和 X**
就像在图像分类问题中一样,我们可以将输入 MTS 视为一个形状数组( 1,T,m) ,其中 m 表示通道的数量(深度)。事实上,抑制输入的宽度并直接使用 input_shape = (T,m)是很方便的。
3.2 初始模块
InceptionTime 的主要构件是初始模块,如下图所示:
图 InceptionTime 的初始模块。框中的第一个数字表示内核大小,而第二个数字表示步幅大小。“(S)”指定填充类型,即“相同”。
这包括以下几层:
- 一个瓶颈层,用于减少输入的维度(即深度)。这减少了计算成本和参数数量,加快了训练速度,提高了泛化能力。
- 瓶颈的输出被馈送到核大小为 10、20 和 40 的三个一维卷积层。
- 初始模块的输入也通过大小为 3 的最大池层,并依次通过瓶颈层。
- 最后一层是深度级联层,其中步骤 2 的四个卷积层的输出沿着深度维度被级联。
所有层(不包括连接层)都有步距 1 和【相同】填充。此外,所有的卷积层都有 32 个 T4 过滤器。
Keras 实现
3.3 盗梦空间网络
InceptionTime 的网络架构与 GoogleNet 的[ 7 ]高度相似。具体而言,该网络由一系列初始模块组成,其后是一个全局平均池层和一个具有 softmax 激活功能的密集层。
图 4:用于时间序列分类的初始网络。
然而,InceptionTime 在其网络层中引入了一个额外的元素:剩余连接在每三个初始模块中。
图 5:初始网络中的剩余连接。
Keras 实施
3.4 初始时间:用于 TSC 的神经网络集成
正如[ 6 ]中所解释的,事实证明,单个初始网络在准确性方面表现出很大的差异。这可能是因为与随机权重初始化以及随机优化过程本身相关联的可变性。为了克服这种不稳定性,提出的最先进的 InceptionTime 模型实际上是由 5 个初始网络组成的**,每个预测都被赋予一个均匀的权重(有关 TSC 的深度神经网络集成的更多信息,请参见[ 8 )。模型的完整实现可以在 Github 上找到。**
4。了解开始时间
正如前面提到的,InceptionTime 主要是受计算机视觉问题的 CNN 的启发,因此,我们希望我们的模型以类似的方式学习功能。例如,在图像分类中,底层的神经元学习识别低级(局部)特征,如线条,而高层的神经元学习检测高级(全局)特征,如形状(如眼睛)。同样,我们期望 InceptionTime 的底层神经元能够捕捉到一个时间序列的局部结构,比如直线和曲线,顶层神经元能够识别各种形状模式,比如“山谷”和“山丘”。
图 6:过滤器中神经元的感受野。
神经元所依赖的输入信号区域被称为该特定神经元的感受野。在物体识别中,更大的感受野用于捕捉更多的上下文。因此,在处理非常长的时间序列数据时,选择更大的感受域是很自然的,这样我们的认知时间将学会检测更大的模式。
5.结论
TSC 的一个重要方面是时间序列的长度,因为这可能会降低训练速度。虽然有各种数学处理方案可以用来解决这样的问题,但 InceptionTime 是 TSC 的主要算法,特别是对于长时间的噪声时间序列数据。
InceptionTime 是一组 CNN,它学习识别时间序列数据集中的局部和全局形状模式(即低级和高级特征)。不同的实验 6 表明 InceptionTime 的时间复杂度与训练集大小和时间序列长度均呈线性增长,即 *O(n ⋅ T)!*总的来说,InceptionTime 将 TSC 问题与图像分类问题放在了同一立足点上,因此探索其在工业领域的不同应用是令人兴奋的。
在接下来的一篇文章中,我将讨论我如何使用 InceptionTime 根据不同的属性(如行业/类别、位置和绩效)对金融资产进行分类和聚类。
参考
[ 1 ] 通过错误传播学习内部表示
2时间序列分类的深度学习:综述
[ 3 ] 伟大的时间序列分类烘焙:对最近提出的算法的实验评估。扩展版
[ 4 ] HIVE-COTE:用于时间序列分类的基于变换的集成的层次投票集合
【5】UCR 时间序列分类存档
[ 6 ] 开始时间:寻找 AlexNet 进行时间序列分类
[ 7 ] 用卷积更深入(GoogleNet)
[ 8 ] 用于时间序列分类的深度神经网络集成
(深入)从 Kaggle 竞赛中学习
为什么是 Kaggle?
几个月前,当我参加 SIIM-ISIC 黑素瘤分类竞赛时,我开始认真使用 Kaggle 。
我认为,最初的原因是我想要一种严肃的方式来测试我的机器学习(ML)和深度学习(DL)技能。当时,我正在为 Coursera 医学专业学习,我对将 DL 应用于医学能够实现什么很感兴趣(现在仍然如此)。我还在读埃里克·托普写的美丽的书:《深度医学》,书中充满了有趣的想法。
几年前,我开了一个 Kaggle 账户,但还没做过什么大事。然后,我发现了黑色素瘤挑战,这似乎是一个用真实数据开始一项艰巨任务的好方法。
因此,我开始致力于比赛,我陷入了比赛。我认为这更容易。
我所学内容的总结。
我学会掌握的第一件事是如何**高效地读取许多图像,**而不需要 GPU(或 TPU)等待。
事实上,在一开始,我试图在 2-GPU 机器上训练我的第一个模型,训练似乎太慢。GPU 利用率非常低,大约 20%。为什么?
因为我正在使用 Keras ImageDataGenerator ,从目录中读取图像。看了 Kaggle 上的几个讨论(是的,这是一个重要的建议:看讨论)我发现一个非常有效的方法是将图片(最终经过预处理,调整大小)打包成 TFRecord 格式 的文件。通过这种方式,我已经能够将 GPU 利用率提高到 90%以上。
是的,我知道随着 TF 2.3 的到来,预处理和数据加载功能将会有所改进(参见:imagedatasetfromdirect),但是如果您需要进行大量的图像(或数据)预处理,那么您应该考虑将结果打包成 TFRecord 格式。
第二件重要的事情是使用一个现代预训练的 ConvNet 。
再次,从 Kaggle 的讨论中,我发现了效率网家族。这些是卷积网络,在 Imagenet 上预先训练,由谷歌研究人员在 2019 年提出。这些 CNN 非常高效,如果与旧 CNN 相比,你可以用更少的计算能力获得更高的精确度。令人惊讶的是,你可以简单地使用一个高效网络作为卷积层(特征提取器)来提高精确度。
(来源:谷歌 AI 博客,https://AI . Google blog . com/2019/05/efficient net-improving-accuracy-and . html)
第三件事是开发一种健壮的交叉验证方法。像往常一样,你希望有一个尽可能大的训练集。但是,与此同时,您需要足够大的验证集,以便对训练模型在看不见的数据上的性能(准确性、AUC 等)有一个公平的想法。如果验证集太小,您对分数的估计很大程度上取决于您在训练集和验证集之间划分的方式。唯一可行的方法是采用健壮的交叉验证(CV)模式。例如,我经常使用具有 5 个折叠的 CV:训练集被分成 5 个折叠,并且我重复训练(对于整个历元数)五次,每次取训练集的五分之一进行验证。对于每一次折叠,我估计最终的准确度(或者你选择的任何度量标准),最好的估计(在验证阶段)是平均值。如果训练集和测试集中的分布是相同的,你应该得到一个 CV 分数,这是对公开分数 LB 的一个很好的估计(你也希望得到最终的私有 LB 分数)。
第四:学会使用 TPU 。TPU 是由 Google 专门设计和开发的专用(ASIC)处理器,用于处理神经网络。如果你知道怎么做,你可以在 TPU 上使用 Tensorflow,以比使用 2-GPU 机器快十倍的速度训练你的模型。更好的是能够在 1/10 的时间内测试模型中的变化,以及它们在准确性方面的结果。这样你就不会因为等太久而感到无聊,也可以做更多的检查。在 Kaggle 上,你每周有 30 个小时的 TPU 时间是免费的(目前唯一的缺点是他们还不支持 TF 2.3,但我相信不会花太长时间来支持它)。
一般来说,你应该知道如何在多 GPU 和 TPU 机器上训练。这并不困难,即使乍一看配置代码看起来有点晦涩。
第五:温柔对待自己的学习速度。
学习率(LR)可能是最重要的超参数。但是,如果你阅读一本关于深度学习的介绍性书籍,你不会找到任何关于你可以采用的策略的详细描述,以使用 LR 来充分利用你的数据。
一些快速的考虑:如果你正在进行迁移学习(参见 EfficientNet ),你可以在不冻结卷积层的情况下开始训练,但之后你应该非常小心地采用非常小的学习速率,以避免来自“未训练的”分类尾部的梯度破坏预训练卷积头的权重。然后你应该随着时代逐渐提高学习速度。但是,当损失的改善开始减少时,你应该开始降低学习率。很难把它做好。通常,在 Kaggle 比赛中,我看到它采用了时变学习率,使用 Keras LearningRateScheduler。
更多细节请见https://www.jeremyjordan.me/nn-learning-rate/
我一直在使用的代码示例可以在这里找到:
完整的例子。
我已经准备了一个相当完整的例子,使用的数据来自一个旧的竞争:糖尿病视网膜病变检测。你可以在我的 Github 仓库中找到代码:https://github.com/luigisaetta/diabetic-retinopathy。
我有:
- 预处理所有图像,将尺寸缩小到 512x512
- 应用一个过滤器,高斯模糊,增强细节显示博士的迹象
- 将处理后的图像打包到 TFRecord 文件中
- 开发了一个 CNN 模型,使用高效的网络 B4 进行五级分类(根据比赛要求)
- 应用前面详述的所有内容
您可以在 Github 存储库中找到重现结果的所有细节,数据集(带有 TFRecord 文件)可在 ka ggle:https://www.kaggle.com/luigisaetta/tfrecord512上找到。
一些结论。
经过大约 24 小时的训练,我的最佳模型显示出了 0.856 的 CV 精度。
下图显示了其中一个 CV 折叠的准确度随着时期的增加而增加(对于其他折叠,情况类似)。
图:acc。vs 时代(按作者)。
但是,有趣的是,最终的提交(你可以在 Kaggle 的封闭比赛中使用延迟提交)获得了 0.79369 的私人 LB 分数**。这个分数会让我排在第 14 位。**
(作者)。
嗯,这并不意味着我已经是一个大师,但可以肯定的是,这是一个证明,与今天的技术和技巧,这是更容易得到的结果,需要几个月的辛勤工作五年前。关于这一说法,仅给出一个细节:五年前,效率网不可用(它们已在 2019 年发表)。
这就是我们所说的:进步。
ai4 医学。
我真的认为人工智能和人工智能可以为发展一个更美好的世界做出巨大贡献的一个领域是医学。它不仅应用了计算机视觉领域的结果(人工智能支持的诊断)。特别是在最不发达国家,那里仍然有太多的人遭受疾病之苦,如果及时正确诊断,这些疾病是可以治愈的。
正如我所说,这并不容易。超过 3000 名参与者,最后一个惊喜是:私立学校与公立学校非常不同。
我以前 20%的成绩结束了比赛,这对于一个 Kaggle 初学者来说已经不错了。
原载于 2020 年 8 月 24 日https://luigisaeta . it。
深度学习的硬件:了解你的选择
在部署神经网络时,GPU(图形处理单元)之外还有选项,即 FPGA (现场可编程门阵列)。在深入研究 FPGAs 及其实现之前,最好先了解一下 GPU 架构,以及为什么 GPU 是神经网络的主要组成部分。
Tensorflow 等流行的库使用 CUDA(计算统一设备架构)在 GPU 上处理数据,利用它们的并行计算能力。这项工作被称为 GPGPU(通用 GPU)编程。它已经适应了需要至少数千次算术运算的深度学习模型。
如下所示,深度卷积神经网络要求滤波器在像素区域上滑动,同时在每次迭代时输出加权和。对于每一层,这一过程重复数千次,不同的过滤器大小相同。从逻辑上讲,深度模型计算量变大,GPU 派上了用场。
来源:Hinton G.E .等人通过研究论文;第一层包含 253,440 个权重,因此至少有那么多计算
Tensorflow 可以构建在 CUDA 的基础上,这使得最终用户无需实施并行代码和理解其芯片的架构。它的便利性和高度优化使它非常适合广泛使用。
FPGAs 早期没有提供这样一个方便的解决方案,使用它们需要对硬件如何工作有深入的理解。但是最近的进展使它们变得更容易接近,以后还会有更多的进展。
概观
本文的内容假设对不同的硬件模型如何工作知之甚少或一无所知。它包括以下内容:
- GPU、CPU 和 CUDA
- FPGAs 的优势与设计
- HDL 作为一种 FPGA 部署方法
- HLS 作为一种 FPGA 部署方法
- 使用 LeFlow 的 FPGA 部署
- LeFlow 的优化特性
为什么 GPU 有时候比 CPU 好?
CPU(中央处理器)设计用于串行操作并支持高级逻辑。这反映在他们的设计中,包含更少的内核和更多的高速缓存以快速获取复杂的指令。
资料来源:Elkaduwe 等人。via 研究论文;一个字母决定一切
GPU、拥有数百个更小的内核用于简单计算,因此与 CPU 相比具有更高的吞吐量。
来源:自我;内核< < <网格,1 > > > () 符号表示并行进程运行的数量,等于变量网格的大小。运行名为内核的函数。
CUDA 通过将 GPU 的众多内核抽象成块来访问它们。每个块包含多达 512 个可访问的线程,可能有 65 535 个块能够同时运行。每个线程执行一个短程序,问题是它可以与其他线程并行运行。 Tensorflow 利用这种模式来提高处理能力,通常会同时运行数百到数千个线程。
要了解更多关于使用 CUDA 的信息,请访问 Nvidia 的开发者博客 或查阅《CUDA 示例》一书。
神经网络硬件
Tensorflow 分为两个部分:库和运行时。
库是计算图(神经网络)的创建,运行时是它在某个硬件平台上的执行。
首选平台是 GPU,但也有一个替代方案:FPGAs。
为什么要用 FPGAs?
FPGAs 可以产生具有数千个存储单元的电路来进行计算,因此它们的工作方式类似于 CUDA 中的 GPU 及其线程。FPGAs 具有自适应架构,支持额外优化以提高吞吐量。因此,可能的计算量使 FPGAs 成为 GPU 的可行解决方案。
相比之下,FPGAs 功耗较低,最适合嵌入式应用。它们也是汽车 ADAS(高级驾驶辅助系统)等安全关键操作的公认标准。
来源:福特汽车公司 via 维基媒体(CC);FPGAs 安全关键任务的理想应用:碰撞报警系统
此外,FPGAs 可以实现自定义数据类型,而 GPU 受到架构的限制。随着神经网络以多种方式转变并延伸到更多行业,FPGAs 提供的自适应能力非常有用。
现在你一定想知道,什么是 FPGAs?
FPGA(现场可编程门阵列)是一种可定制的硬件设备。它可以被认为是浮动逻辑门的海洋。一个设计师走过来,用一种硬件描述语言* (HDL),比如 Verilog 或 VHDL,写下一个程序。该程序规定了连接方式以及如何使用数字元件实现连接。HDL 的另一个词是 RTL (寄存器传输级)语言。***
FPGAs 很容易被发现,找一个超大的 Arduino。
来源:保罗马蒂亚斯 via 维基媒体(CC);altera DE2–115 板,可使用的众多 FPGAs 之一
开玩笑,它们有各种形状和大小。
使用类似于编译器的软件,HDL 被合成(找出使用什么门),然后被路由(将部件连接在一起)以形成优化的数字电路。这些工具(HDL、综合、路由、时序分析、测试)都包含在一个软件套件中,有些包括 Xilinx 设计工具和 Quartus Prime。
目前,模型使用 GPU 进行训练,但随后部署在 FPGA 上进行实时处理。
那我们为什么不用 FPGAs 来代替呢?
对于 FPGAs 来说,棘手的部分是实现用 Python 等高级语言编写的 ML 框架。 HDL 本身并不是一个编程平台,它是用来定义硬件组件(如寄存器和计数器)的代码。一些 HDL 语言包括:Verilog,VHDL。
下面显示的是用于创建串行位检测器的一些代码片段。
如果你不熟悉它,试着猜猜它是做什么的。
来源:Self
完成了吗?即使你盯着它看一会儿,它也不明显。
大多数情况下,FSM(有限状态机)用于将任务分解成具有输入相关转换的状态。所有这些都是在编程之前完成的,以确定每个时钟周期电路将如何工作。然后这个图,如下所示,被转换成 HDL 代码块。
来源:Maggyero via 维基媒体(CC);可能的 FSM 图
回到主题:主要的一点是,没有直接的翻译将 Python 中的一个循环转换成 Verilog 中的一束电线。
考虑到设计的复杂性,很难对其进行进一步的优化调试。没有像 CUDA 中那样的抽象来简化过程,在 CUDA 中可以选择和修改线程。
那么我们应该坚持使用 GPU 吗?
不,FPGAs 并非一无是处。
解决编程问题的一种方法是使用 HLS (高级综合)工具,如 LegUp 来在 Verilog 中生成程序进行部署。HLS 工具允许设计者避免从头开始编写 HDL,而是使用更加直观的算法式编程语言*©。***
HLS 工具抽象出硬件级设计;类似于模型运行时 CUDA 如何自动设置并发块和线程。
HLS 工具需要 C 代码作为输入*,该输入将映射到 LLVM IR (中间表示)以供执行。这些工具用于将程序描述转换成硬件实现。***
它们在 FPGA 设计中的作用如下所示。
来源:Greg S. via 佛罗里达大学幻灯片; HLS 工具产生 HDL* ,允许寄存器传输(RT)合成成数字电路,最终部署在 FPGA 上***
关于 LLVM IRs 的更多信息
LLVM 不是首字母缩写,是构造* 类汇编指令 (IRs)的库。这些程序对于 HLS 工具来说更容易处理,并可用于为 FPGA 创建可综合的代码。***
IRs 用于以通用格式描述源代码*,允许各种程序使用。***
要了解更多关于 LLVM 和 IRs 的信息,请参考Chisnall 博士的幻灯片 。
来源:戴维斯·奇斯纳尔博士 via 讲稿;从 LLVM IR 到 x86 架构汇编指令的转换,显然两种格式非常相似证明 IR 的适应性****
回到 FPGAs 的问题
主要的问题是将程序和为 Python 编写的库转换成 C 语言,以便 HLS 工具运行。目前 C 语言不支持 Tensorflow,所以这个解决方案非常困难。显然,布局和创建硬件的要求是在深度学习中使用 FPGAs 的一大障碍*。***
我们的英雄勒弗洛
来源:Daniel H.N .等人通过研究论文; LeFlow pipeline 显示它是 LLVM IR 和 HLS 之间的中介
LeFlow Toolkit 允许工程师使用 Python 设计、训练和测试他们的模型,然后将其直接部署到 FPGA 中使用。 LeFlow 通过允许 HLS 工具与 Python 和 Tensorflow 兼容来简化设计过程,充当适配器*。*****
该软件由不列颠哥伦比亚大学 ECE(电气和计算机工程)系的研究人员 T21 设计,他们是丹尼尔·h·诺罗尼亚和史蒂文 J.E 威尔逊。
以下部分详细介绍了 LeFlow 如何与 Tensorflow 和 FPGA 集成,如果您只对实现中的感兴趣,请跳过到:调优时间。******
LeFlow 工具包如何与 Tensorflow 一起工作
为 Tensorflow 设计的 XLA(加速线性代数)编译器输出一个 LLVM IR。LeFlow 重组IR 和优化与 HLS 工具配合使用。****
在此基础上,HLS 工具完成了将 IR 转换为部署到 FPGAs 上的程序的所有工作,如部分所述:我们应该坚持使用 GPU 吗?
勒弗洛投入产出模型
LeFlow 将 IR 作为输入。算法 1 是 Tensorflow 加载两个浮点数的 IR。
来源:Daniel H.N .等人通过研究论文;输入到 LeFlow,需要重组。获取指向每个 float 的元素指针(第 5、6 行),解引用它们并加载(第 7、8 行)。
这个节目很难跟上,而且看起来很乱。勒弗洛会把它清理干净,然后换掉。
它的目标是创建全局变量,然后将它们映射为硬件接口的输入和输出。下图概述了 LeFlow 重新格式化并将 IR 通过 LegUp 后的合成电路。****
来源:Daniel H.N .等人通过研究论文;硬件实施所需的变量和设置由 LegUp、LeFlow 生产,必须易于识别变量
显然,硬件接口需要额外的模块和信号,如时钟、复位、内存和内存控制器。 LegUp 处理这些部件的创建*,包括时钟的计时规范。*****
转换 IR 以实现最佳执行
LeFlow 为 FPGA 寄存器设置了一个可变负载。这允许变量访问,以及当高级代码改变时自动电路修改。变化主要在线 1、6、7* 明显。*****
来源:Daniel H.N .等人通过研究论文;重组 LLVM IR ,为 HLS 合成做准备
如算法 2 的改进 IR 所示,LeFlow 完成了它的工作,剩下的由 HLS 工具处理!
调音时间!
LeFlow 的一个有趣的特性是可以更换硬件。LeFlow 提供了展开和内存分区参数,这些参数在正确使用时会加速计算*。这与 FPGAs 固有的低延迟相结合,使它们能够以极高的效率工作。*****
最棒的是,这些参数可以在 Python 中指定,指令可以直接传递到电路级。
展开还是不展开
展开用于循环,是一种小心的平衡行为。想法是在每次迭代中进行多次计算(或复制)并采取更大的步骤。
这看起来与常规的 for 循环相同,但在硬件级别添加了更多组件,以在每个时钟周期(或循环迭代)执行更多计算。有关展开的更多信息,请参见 Keil 的用户指南 。
*****int sum = 0;for(int i = 0; i < 10; i+=2) sum += a[i]; sum += a[i+1];*****
从上面看,我们可以展开两倍,这意味着一次进行两次迭代,循环增加两步。
来源:Daniel H.N .等人通过研究论文;将 32×32 输入图像上的 3×3 卷积的简化循环展开为 5 个 32×32 输出
这利用了 FPGA 的并行性,工作起来更像 GPU ,显然每个示例的周期减少了 13%。
请记住,额外添加的硬件可能会导致效率低下或尺寸受限。
用内存分区分割它
LeFlow 管道中使用的 HLS 需要一个双端口 RAM(随机存取存储器)来存储值。
这是有问题的,因为 RAM 被设计成存储大量数据,但代价是非常慢。从其中提取值可能需要十倍的时钟周期。
幸运的是,FPGAs 包含许多其他独立的存储单元,因此 LeFlow 可以将其数据划分到多个唯一的存储点。在某种意义上,这类似于在处理器中添加更多的内核。它通过允许更多的指令同时执行来减少时钟周期。****
假设任务是将两个大小为 8 的数组的元素相乘。在并行计算中,任务被分成组同时执行。循环分解意味着某一组步骤同时重复。
使用内存分区可以提高 FPGAs 的运行效率。以下计划已经运行了八个时钟周期。
来源:Daniel H.N .等人通过研究论文;加载两个数组的时钟周期分解
在(a)中,没有内存分区,所以每个周期从每个数组中加载、相乘并存储一个元素。该过程继续,并花费八个周期*直到完成。*******
在(b)中,数组被循环划分到两个独立的存储器中。每个数组中的两个元素在每个周期被加载、相乘并存储。较大的块表示进程同时发生,尽管是在硬件的不同部分。这将其减少到六个周期。****
在 c)中,数组被循环划分到四个独立的存储器中,并且减少到五个周期。每个周期加载、相乘并存储来自每个数组的四个元素*。***
在 Python 中使用 LeFlow
来源:Daniel H.N .等人通过研究论文;实现一个 CNN 。输入被分配为单个 32×32 图像(第 4 行),并且网络输出五个图像(每个图像应用了 3×3 滤波器;第 5 行)。
一旦 LeFlow 设置正确,它只需运行一个设备选择行,无需任何额外的配置(如展开):
***with tf.device("device:XLA_CPU:0")***
它表示 XLA 编译器将用于生成 LLVM 并启动 LeFlow 转换过程。
尝试一下!
现在你是了解 LeFlow 工作原理的专家,也许 FPGAs 适合你。
在 Github 上有很多 LeFlow 及其具体安装的例子。丹尼尔·霍兰达(合著者之一)有关于 MNIST 数字识别 的源代码,所以拿起 FPGA 试一试吧!****
【深度学习】如何建立一个有情感的聊天机器人
实践教程
第 1 部分:伯特情绪预测器
随着如今对话系统的成熟,我们可以下载并应用经过高级训练的聊天机器人,如 GPT-3 、 DialoGPT 、 Plato 和 OpenNMT 等。然而,与传统的聊天机器人不同,建立一个能够产生情感和积极反应的聊天机器人仍然是一个热门的研究领域。(类似于新闻中提到的人工智能,我们希望人工智能说一些积极的东西(例如,我的创造者告诉我说‘我为和平而来’))
此外,一个有情感的聊天机器人在商业中是非常可取的,例如改善客户服务。
在这两篇文章中,我将基于 HKUST 的论文 HappyBot:通过改善用户体验前瞻生成移情对话响应和我的尝试,介绍如何构建一个情感聊天机器人(基于深度神经网络的对话系统)。
这个想法是建立一个结合强化学习的对话系统,奖励积极的反应,惩罚消极的反应。
从技术上来说,这个任务涉及到建立深度学习模型,迁移学习(BERT),情感分析,强化学习,以及它们的实现(在 PyTorch 中),这些都是机器学习的热门话题。
用于情感分析的微调预训练 BERT 模型
在第 1 部分中,我们将以一种现代的方式构建一个情感预测器(使用来自预训练的 BERT 模型的迁移学习)。
回想一下,我们的目标是:建立一个结合强化学习的对话系统,奖励产生的积极响应,惩罚产生的消极响应。 有些我们需要一个“判官”来决定每个生成的句子的一个情感得分。 ( 感情分析 )
BERT 目前是 Google 在 2018 年发布的 NLP 任务中的显著模型之一。BERT 的关键思想是通过使用具有变换器架构的双向深度神经网络来构建自然语言的表示。BERT 模型经常被用作其他 NLP 任务的预训练模型。
要构建一个 BERT 情感预测器(PyTorch ),可以遵循这里的文章:第 2 部分:在语言可接受性(COLA)数据集的语料库上使用 PyTorch 进行文本分类的 BERT 微调教程。
斯坦福情感树库 v2 (SST2)
我们在任务中使用了斯坦福情感树库 v2 (SST2)数据集,可以在这里下载。SST2 数据集提供了 239,232 个句子,其中每个句子包含从 1 到 25(从最负面到最正面)的最多 6 个情感标签。我们计算了每个句子的平均情绪得分,并将其分为“负面”(得分≤10)、“中性”(得分≤10<和“正面”(得分> 16)。最终的训练/验证/试验数据分成 50/25/25。
构建 BERT 情感分类器
每个句子都将被分词,长度大于 160 个单词的句子将被删减。我们使用包装变压器中准备好的记号赋予器。
然后,我们从预训练的 BERT 模型建立多类(正面、中性和负面)分类模型(softmax 函数),损失函数作为交叉熵。注意,我们采用渐变裁剪来避免渐变爆炸。以下是训练/有效数据的结果:
模型训练表明一个历元已经足够,而更多的历元仅提高训练精度,但有效精度保持不变。
在模型训练之后,我们将我们的模型应用于具有 75.2%准确度的测试数据(类似于我们的模型训练) :
因为我们的预测是获得“正面”、“自然”和“负面”标签的概率,所以我们需要将其转换为 0-1 的情感分数作为奖励:
情绪得分= 1P(正)+ 0.5P(自然)+ 0*P(负)
其中输出 1 =高度正,0 =高度负)
以下是一些例子:
这一结果将在下一部分的情感对话系统中得到应用。
参考
- Devlin,j .,Chang,M. W .,Lee,k .,& Toutanova,K. (2018 年)。Bert:用于语言理解的深度双向转换器的预训练。arXiv 预印本 arXiv:1810.04805。
- 申洁敏、徐鹏、安德里亚·马多托和帕斯卡尔·冯。Happybot:通过提高用户体验前瞻性来产生移情对话响应。arXiv 预印本 arXiv:1906.08487,2019。
- 理查德·索彻、亚历克斯·佩雷金、让·吴、贾森·庄、克里斯托弗·曼宁、和克里斯托弗·波茨。2013.情感树库语义合成的递归深度模型。2013 年自然语言处理经验方法会议论文集,第 1631-1642 页。
【深度学习】如何建立一个有情感的聊天机器人
情感聊天机器人
第二部分:基于深度学习和强化学习的对话系统
从第一部分,我们已经建立了伯特情绪预测器。我们现在开始结合它,建立情感对话系统。在进入细节之前,让我们先介绍一些先决条件。(但我仍然无法解释这里的所有术语……)
深度学习的先决条件
- seq 2 seq model
seq 2 seq model是一种高级神经网络,旨在将一个序列变成另一个序列。Seq2seq 由两个神经网络组成:EncoderRNN(为了避免消失梯度问题,更常被称为 LSTM 或 GRU )对源句子进行编码,为解码器 RNN 提供隐藏状态。另一方面,解码器生成目标句子。
-
注意力是你需要的全部 尽管 Seq2Seq 模型在 NLP 中带来了巨大的突破,但一个普通的 Seq2Seq 模型仍然遭受瓶颈和消失梯度问题。注意力模型是 Seq2Seq 之上的一项著名技术,它允许解码器直接专注于源的某些部分,这通过提供到遥远状态的捷径来缓解消失梯度问题。
更多详情可以参考 NLP 从无到有:带序列到序列网络的翻译及注意。
- PyTorch & Texar 包
另外,推荐阅读:PyTorch 中的聊天机器人教程和帮助你轻松构建复杂深度学习模型(尤其是 NLP 任务)的 Texar 包,。最后但同样重要的是,确保你有一个 GPU 来构建聊天机器人。
移情对话数据集
来自 ParlAI 的 EmpatheticDialogues 数据集包含大约 33090 个对话,其中每个对话包含几个句子,并被分类为不同的情绪情况。为简单起见,没有应用验证数据集。训练/测试被分割为 90/10%(跳过了验证数据集)。
下面是一个守恒的例子(转换成一对源句和目标句):
我们准备的数据如下:
- 5 个字以内 30 个字以上的句子去掉。
- 标记数据,包括符号。英语中的许多缩写形式也被替换了。例如,“不能”将被转换为“不能”
- 构建所有单词的词汇表。词汇表的大小是 24,408,完全基于训练数据。
对话系统设计(编码器和损失函数)
基于 HKUST 的论文“ HappyBot:通过改善用户体验前瞻产生移情对话响应”,现在让我们来关注最有趣的部分。
结合情感预测器的网络结构
- MLE 损失
模型结构如下。左边是注意力模型的结构,正常的对话系统。目标是嵌入每个句子输入(长度为 T ),然后从 vocab 列表生成输出概率分布(w_t)。响应生成中的训练目标是最大化单词 y*的可能性,并且其损失函数被写为:
- 线性回归损失
在我们结合情感的强化学习(RL)部分之前,我们引入另一个线性回归作为基线回报模型,估计每个句子的情感得分 R 如下:
其中 m_t 是编码器在步骤 t 的隐藏状态,R 是该句子的情感得分(奖励),W_r 和 b_r 是可训练参数。这种线性回归的目的是减少报酬 r 的方差。
- 强化学习损失 我们通过贪婪解码来解码我们预测的句子(我们这样做是为了时间有效性。我们将在下一节介绍“解码策略”)。之后,BERT 模型将预测该句子的情感得分 R。RL 损耗计算如下:
其中 w_t 是在步骤 t 单词的预测概率分布
**RL 的含义:**线性回归的输出(Rˇt)作为 R 的一个均值,当涉及到一个很大的情绪得分(即 R>Rˇt)时,最小化 L_RL 就是最大化 w_t,也就是说我们要增加获得一个很大奖励的机会。另一方面,当 R<Rˇt 时,需要最小化 wt 以减少损耗。这就是强化学习的原理:你想获得奖励的几率更高。(就像心理学中的操作性条件反射一样)
最后,这三个损失函数组合如下:
MLE、RL 和 B 的λ(权重)是决定权重的三个超参数。
对话系统设计(解码策略)
在用损失函数训练模型之后。为了从 w_t 的概率分布生成预测的句子,我们需要解码部分。这里我们将应用并比较两种解码策略:
- 贪婪解码 每一步都取最可能的单词(由 argmax)而不回溯。
- **优点:**快速
**-缺点:**无法追溯生成过程,可能会引起一些奇怪的反应。(生成:我爱……,哦其实“爱”这个词不是我想要的!)
- **优点:**快速
- 前 K 个采样解码
从 w_t 中随机采样,仅限于前 K 个最可能的单词。使用 top-k 采样,尤其是使用较大的 k,响应将更加通用和多样。(注意,如果你想用 AI 写诗或小说,你需要 top-k 采样,而不是贪婪解码)
有关解码策略的更多信息,可以阅读下面的文章“您需要了解的响应生成解码策略”
如果您采用 Texar 包的解码,您可以通过“助手”实例轻松实现不同的解码策略。
模特培训
培训期间采用了几种策略:
- 稍后启用强化学习部分的训练 刚开始的时候,生成的句子不够精细,无法进行情感评分。所以我们在第 19 纪元开始 RL 部分。换句话说,聊天机器人通常在开始时学习,然后再考虑情感。
- RL 的最小权重
注意到 loss_RL 的斜率较高(因为当输入为负时对数函数的斜率较高,因此其梯度下降)。我们采用了 RL 和 B 的一个极小的 lambda(权重)来平衡它们与 MLE 的 lambda。
b 损失和 RL 损失将在训练中占主导地位。
- 提前停止
由于 loss_RL 占优势,模型可能会以 loss_MLE 为代价降低它。因此,在我们的模型中采用了提前停止。如果 loss_MLE 大于其在添加 loss_RL 之前的平均值,则模型训练将终止。我们的模特训练在 20 世纪就结束了。
以下是模型 20 个时期的最终训练历史:
模型评估
为了评估我们的方法,我们将构建另一个基线模型(没有强化学习部分)进行比较。我们将在回应生成中使用两个标准指标:
- BLEU metric
双语评估替角评分(BLEU) 评估 n-grams 在地面实况和系统响应中的同现。n-gram 精度计算如下:
r 是基础真实响应,r^是系统响应,k 索引所有可能的长度为 n 的 n 元文法,h(k,r)是 r 中 n 元文法的数量。选择 BLEU-1(单元文法)和 BLEU-2(双元文法)用于我们的评估。
-
Distinct metric Distinct metric 衡量生成句子的多样性,定义为不同 n 元语法的数量除以生成单词的总量。我们选择 Distinct-1 (uni-gram)进行评估。
-
基于指标的评估 我们已经训练了两组模型,基线模型(带有我们的强化学习部分)和非基线模型。对于解码策略,我们还评估了贪婪和 top-k (k=5)来测试解码策略的影响。
在下表中,发现我们的非基线模型通过在训练和测试数据集中具有最高的情感分数 BLEU-1/2 和独特分数(略好于基线模型)而胜过基线模型。
对训练/测试数据的 BLEU、独特和平均情感评分评估
- 生成实例
括号内的分数是伯特的情感分数。
结论
与基线模型相比,我们的方法在保持高语言性能的同时,成功地生成了更多的积极响应。
令人惊讶的是,我们发现贪婪方法不仅在语言性能方面与 top-k 采样(k=5)表现相似,而且由于 top-k 采样更有利于通用响应,因此它还产生了更多的正面响应。
参考
- Ashish Vaswani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、AidanNGomez、Lukasz Kaiser 和 Illia Polosukhin。2017.你需要的只是关注。神经信息处理系统进展,6000-6010 页。
- H.拉什金,E. M .史密斯,m .李,y .布鲁走向共情的开放领域对话模式:一个新的基准和数据集
- 申洁敏、徐鹏、安德里亚·马多托和帕斯卡尔·冯。Happybot:通过提高用户体验前瞻性来产生移情对话响应。arXiv 预印本 arXiv:1906.08487,2019。
- K.Papineni、S. Roukos、T. Ward 和 W. J. Zhu。BLEU:一种自动评估机器翻译的方法。在 ACL,2002 年。
- Sutskever,I .,Vinyals,o .,和 Le,Q. (2014 年)。用神经网络进行序列间学习。神经信息处理系统进展(NIPS 2014)。
基于 Fastai 的深度学习图像分类
精疲力尽地学习复杂的机器学习概念和复杂的术语?通过构建一个简单的图像分类器来检测 x 射线中的肺炎,重新点燃您的热情!
瓦迪姆·萨多夫斯基在 Unsplash 上拍摄的照片
TL;速度三角形定位法(dead reckoning)
如果你开始对学习一门学科感到筋疲力尽,走出杂草通常是有益的。我喜欢做一些有趣又容易的事情,以便在我的学习旅程中重新获得积极的动力。这个项目让我的创造力再次迸发。将我的笔记本从我的 GitHub 库加载到 Google Colab,并上传 Kaggle 数据集来学习如何使用 fastai 软件构建图像分类器!别忘了把硬件加速器设置成 GPU!
P.S .进入文件→上传笔记本→GitHub Tab→BSA maha/Chest-x ray-FastAI 直接上传笔记本到 Colab
如何轻松将 GitHub 笔记本上传到 Google Colab
介绍
邓宁-克鲁格效应
你设定了一个目标,比如想成为一名数据科学家或数据工程师。当你浏览你能找到的关于这个主题的所有材料时,你的热情和精力会达到顶点。也许你甚至开办了一个编码训练营或 Coursera 课程,作为你掌握数据之路的向导。当你快速赢得胜利时,你的大脑会充满多巴胺。首先,这是基本的 python 编程。然后你用 sci-kit learn 做了你的第一个线性回归——机器学习毕竟没那么差!你很快吸收了扔给你的所有信息。没有什么能阻止你。
我去过那里,现在仍然去那里。我毕竟是人。我指的是邓宁-克鲁格效应中“愚笨山”的顶峰。有了完美的数据集合,线性回归很容易,但这并不现实。最后,在轻松地浏览了一两个月之后,你碰到了一堵名为统计的墙。你苦苦思索,几乎无法理解——除非你觉得自己没有保留任何东西。人们还记得所有这些分发的东西吗?剧透警告:是的,你会被问到关于他们的问题。当你继续学习的时候,你会意识到你的 python 技能远没有达到应有的水平。你决定看几个招聘启事,然后突然想到。你没有计算机科学的高级研究生学位,你不知道该工作的一些要求如何发音,更不知道它们是什么——Hadoop?欢迎来到绝望之谷。你想退出,继续你的生活。
邓宁-克鲁格效应
解药
我的教官,上士·里维拉,在 T2 的海军陆战队新兵训练营——曾经说过,
“动力就像咖啡因一样,最终会消失。你真正寻找的是灵感。”
每当我发现自己在新的学习旅程中走向绝望之谷时,我都会记得这句话。回到游戏中的最好方法是记住最初是什么让你兴奋。给自己找一个速战速决的机会,重新获得一些积极的动力。
这个项目是我的速赢之作。它让我重新认识到机器学习的惊人力量,以及它可以多么简单。我的想象力开始变得天马行空,想到了我可以制造的所有工具来帮助世界上的其他人。我再次找到了灵感,激情重燃。我希望这对你也一样。
是时候建造了
这篇博文的目标并不是高度技术性的,并教你关于深度学习的一切。我希望你去跟大师本人学习,杰瑞米·霍华德在 Fast.ai。我目前正在学习这门课程,我怎么推荐都不为过。我喜欢他自上而下的教学理念和他让深度学习对每个人都可用的目标。最棒的是它是免费的!
欢迎光临!如果你是所有这些深度学习的新手,那么不要担心-我们将带你一步一步地完成它…
course.fast.ai](https://course.fast.ai/)
这篇文章的目标是通过快速构建一个具有非常明显的用例的深度学习模型来激励你。这个项目将需要大约 10 分钟的编码。 然而,由于数据集较大以及您的硬件,我们的卷积神经网络(CNN)学习器的训练可能需要 30 分钟。
平台:Google Colab
我强烈推荐 Google Colab 用于所有需要 GPU 的任务——这就是其中一个例子。如果你熟悉 Jupyter 笔记本,那么你会很快意识到它几乎是一个复制品。如果你不熟悉这些,那么请做谷歌 Colab 的教程。
编辑描述
colab.research.google.com](https://colab.research.google.com/notebooks/welcome.ipynb)
在 Colab 中,确保进入运行时→更改运行时类型→将硬件加速器设置为 GPU。
数据集:Kaggle 胸部 x 光肺炎数据集
我在这个项目中使用的数据集是在 Kaggle 上找到的。它有 1 GB 多一点,所以我把它下载到我的本地驱动器,然后上传到我的谷歌驱动器。这允许我从本地硬盘上删除文件。
5,863 张图片,2 个类别
www.kaggle.com](https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia)
数据集是超过 5,800 JPGs 的胸部 x 光片。这些照片由文件夹标注,分别是“肺炎”和“正常”。这将在以后证明是有益的。
这个数据集有点独特。通常,对于 Kaggle 比赛,一个验证数据集测量你的模型在整个训练中的表现。当你准备好了,你就可以使用测试数据集来做出你的预测,并提交给竞赛评分。**对于这个特例,我们将使用我们的测试数据集作为我们的验证数据集来衡量我们的模型表现如何。**该数据集没有竞争,验证集只有 16 幅图像,太小了。
密码
首先,你可能需要在谷歌 Colab 笔记本中安装 fastai 软件。在第一个单元格中运行下面的代码,如果它说已经安装了,我们就可以开始了。
!pip install fastai
现在我们需要导入所有必要的库和一些附加功能。下面的代码将导入运行代码所需的所有库。最后两行是可选的。
如果你已经将数据集上传到 Google drive 文件夹中,我推荐你只运行最后两行。您必须执行一个身份验证操作,才能将您的 Google Drive 安装到 Colab。
from fastai.vision import *
from fastai.metrics import error_rate, accuracyimport warnings
warnings.filterwarnings('ignore')from google.colab import drive
drive.mount('/content/drive')
数据集应该是一组父文件夹和子文件夹,如下图所示。非常重要的是,你的文件结构反映了我的。整个项目最困难的部分是组织你的数据。我假设从现在开始你已经把数据上传到 Google Colab 了。
我的项目 Google Drive 根目录中的数据集文件夹
每个测试、训练和评估文件夹子文件夹
一旦你把所有的数据组织好了,乐趣就可以开始了。我们将设置存储您数据的根目录。这是 test、train 和 val 文件夹所在的文件夹路径。当我们稍后保存我们的训练模型时,它们将被保存在这个目录中。
# Set path to root directory
path = Path('/content/drive/My Drive/Colab Notebooks/chest_xray')# View all files in directory
path.ls()
然后我们必须创建一个针对 fastai 软件的 “ImageDataBunch” 对象。**这个对象汇集了我们所有的训练数据、测试数据和验证数据,并对图像执行必要的转换。**ds _ tfms 正在指定超出本博客范围的转换,要了解更多相关信息,我建议完成 Fast.ai 课程。
# We are creating a fastai DataBunch from our dataset
# Preprocessing takes place when creating the databunch
# May need to decrease batch size and num_workers depending on GPUdata = ImageDataBunch.from_folder(path, train='train', valid='test', ds_tfms=get_transforms(do_flip=False), size=224, bs=64, num_workers=8)
现在你可以明白为什么像我们之前做的那样组织文件夹是重要的。这允许我们使用 from_folder 方法来正确标记所有的图像,同时保持我们的数据集分离,因此没有数据泄漏。所有图像都被标准化为 224 像素乘 224 像素的大小。“bs”代表批量大小,即同时向模型显示的图像数量。如果您的 GPU 没有足够的内存,您可能需要减少“bs”——尝试 32 或 16。
使用下面的代码块来查看图像,并了解 ImageDataBunch 是如何对它们进行更改的。
# Show what the data looks like after being transformed
data.show_batch()# See the classes and count of classes in your dataset
print(data.classes,data.c)# See the number of images in each data set
print(len(data.train_ds), len(data.valid_ds)
上面代码的输出应该类似于我下面的输出。
show_batch 代码单元格的输出
现在我们将建立我们的神经网络。在 fastai 中,被训练的模型被称为“学习者”。学习者是一个可以学习适应模型的一般概念。我们正在使用 cnn_learner,它将使用 ResNet34 架构。如果你好奇,这里有一篇描述 ResNet34 的好文章。
这个帖子可以在这里找到 PDF 格式。
towardsdatascience.com](/understanding-and-visualizing-resnets-442284831be8)
创建我们的学习器的代码是一个简单的一行程序。一旦我们创建了学习者,我们将使用 fit_one_cycle 方法在我们的数据集上训练模型。resnet 34 模型是一个预先训练好的模型,我们正在对其数据进行微调。这被称为迁移学习,也是 fastai 建立的前提。
# Build the CNN model with the pretrained resnet34
# Error rate = 1 - accuracy
learn = cnn_learner(data, models.resnet34, metrics = [accuracy])# Train the model on 4 epochs of data at the default learning rate
learn.fit_one_cycle(4)
学习者的培训结果
因为我们用我们的测试数据集替换了我们的验证数据集,所以我们可以确切地看到我们的模型在每个时期结束时有多精确。结果显示,我们可能在 2 个时期后停止训练。在第二个历元之后,您可以看到有效损失增加,精度降低。然而,列车损失在每个时期都在减少。这是过度拟合训练数据的一个很好的例子。我们的结果显示准确率为 87.6%!更令人惊奇的是,这里的编码是如此简单!
# Save the model
learn.save('stage-1')# Load the Model
learn.load('stage-1')
不要忘记保存您的模型。这样,如果你在不影响模型的“第一阶段”部分的情况下进行修正,你可以重新加载它,而不用浪费时间重新训练它。当你重新加载你的模型时,你会看到一个很长的输出,详细描述了 CNN 的内部工作,这是正常的。
现在,除了最后一层,所有的层都被冻结了。当我们在这些冻结层上调用 fit_one_cycle 时,我们只训练了最后一层,这是将 x 射线图像分类为“正常”或“肺炎”的部分。
现在我们将解冻 CNN 中的所有图层,并对其进行更多的重新训练。这将改变模型评估图像的方式,而不仅仅是分类图像的方式。在我们进行更多的训练之前,让我们来看看什么是好的训练学习率。
# Unfreeze all layers of the CNN
learn.unfreeze()# Find the optimal learning rate and plot a visual
learn.lr_find()
learn.recorder.plot(suggestion=True)
学习与损失函数图
该图显示了学习率如何影响模型的准确性。我们可以看到,随着学习率的增加,我们的模型的损失也在增加。现在,我们已经解冻了学习者中的所有层,我们将使用这些最佳学习率进行重新培训。我们使用的 slice()函数输入学习率。选择一个好的学习率似乎是一门艺术而不是科学,Fastai 课程帮助你学习经验法则。
既然我们对自己的学习速度有了一个概念,让我们根据我们的数据再次训练我们学习者的所有层次。
# Fit the model over 2 epochs
learn.fit_one_cycle(2, max_lr=slice(3e-7, 3e-6))
阶段 2 的模型输出
我们现在已经将准确率提高到了 89.1% 。换句话说,我们每检查 10 次,只能预测 1 次不正确的 x 射线。它并不完美,但对于我们投入的工作量来说已经很不错了!我们再多训练几次,看看能不能多挤出几个百分点。
第三阶段的模型输出
太好了!我们从模型中又挤出了 2%的精确度!现在,让我们来探究一下这个模型出了什么问题。在许多情况下,这允许您更好地理解您的数据,这可能导致使用不同的预处理技术或架构。
解释
首先,我们需要创建一个解释器对象。从这个“interp”对象,我们可以调用 plot_confusion_matrix 和 plot _ top _ losses 等方法。
# Rebuild interpreter and replot confusion matrix
interp = ClassificationInterpretation.from_learner(learn)interp.plot_confusion_matrix(figsize=(12,12), dpi=60)
上面的混淆矩阵显示我们错误地预测了总共 53 幅图像。50 个图像我们错误地预测为肺炎,3 个图像我们预测正常有肺炎。他的图也适用于多标签分类。如果你有很多职业,混淆矩阵通常很难解释。幸运的是,fastai 有一个混淆矩阵的文本版本,可以使用 most_confused 方法访问**。**
most _ 混淆方法输出(预测/实际/总和)
另一个非常有用的方法是 plot _ top _ losses。这允许您检查您的模型最有信心预测正确,但模型是错误的图像。这通常可以显示数据集中的错误。例如,如果图像被错误地贴错标签,您应该正确地给图像贴标签。
show _ top _ losses 方法的输出
现在你有了如何使用强大的 fastai 软件构建图像分类器的框架!我希望这个模型能启发你使用这些技术来创建各种工具。Fast.ai 小组正在整理一个很棒的程序,我强烈建议你去看看!
现在,将这个模型部署为一个 web 应用程序,允许人们为您的模型上传 x 光片,以预测诊断结果!如果有,当然请不要用这种模式代替咨询医生。**如果你有兴趣了解如何将这个模型部署为一个 web 应用程序,请告诉我!**如果有人对关于部署的后续帖子感兴趣,我会试一试!
谢谢你花时间阅读我的博客。如果您有任何问题或有建设性的批评,请随时联系我!
领英:
www.linkedin.com/in/blakesamaha
个人网站:
推特:
深度学习图像增强对损失函数工程的见解
对超分辨率、色彩和风格转换的技术和损失函数工程的见解。
这些是我从使用深度学习进行各种图像处理技术的实验中获得的关于损失函数工程和深度神经网络架构的一些见解,这些技术包括超分辨率、着色(将颜色修补到黑白图像中)和风格转换。
这篇文章扩展了我的文章中描述的损失函数基于特征激活和风格损失的损失函数,我在我的研究中使用了基于深度学习的图像增强,用于超分辨率和黑白图像的着色。事实证明,这些文章比我预想的要受欢迎得多,尤其是在过去的几个月里,我的文章在谷歌搜索“超级分辨率”的结果中名列前茅。
我在过去一年的研究中发现了一些有趣的发现和见解。有效损失函数在训练有效模型中是重要的,在某些情况下,它们可能比模型的架构更重要。
理论上,损失函数也可以申请专利。随着深度学习的成长和兴起,未来看到损失函数工程师这样的工作成为角色也就不足为奇了。
在本文的后半部分,有一些使用这些损失函数技术生成图像的例子,用于超分辨率、着色和风格转换。
用于训练图像增强的深度学习模型的损失函数中的常见评估度量
对于图像增强,损失函数旨在评估模型的预测/生成输出离目标/地面真实图像有多远,以训练模型来最小化该损失。
传统上,在学术和研究论文中,通常使用基于均方误差(MSE)、均方根误差(RMSE)或峰值信噪比(PSNR)的像素损失来对此进行评估。
像素损失本质上是目标图像的像素距离预测/生成图像的像素有多远的度量。
峰值信噪比(PSNR)
来自维基百科:PSNR 最容易通过均方差(MSE)来定义。给定无噪声的 m×n 单色图像 I 及其有噪声的近似 K,MSE 定义如下。
均方差(MSE)/ L2 损耗
这里的数学让这比看起来更复杂。
均方误差
这是在 RGB 图像中的三个通道之间进行比较。MSE 用于比较目标图像的像素距离预测/生成图像的像素有多远。取每个像素差值的平均值,然后平方。
对于 L2 损失,目标是最小平方偏差,以最小化地面真实和预测/生成图像之间的平方差之和。
如果取均方误差的平方根,这允许考虑所生成的图像和待评估的地面真实图像之间的距离。
峰值信噪比定义(PSNR)
峰值信噪比
峰值信噪比定义(PSNR)最常用于对不同编解码器和图像压缩造成的质量损失进行质量评估,其中信号是原始图像,噪声是压缩图像产生的误差。
PSNR 非常常用于评估图像增强技术,例如超分辨率,其中信号是原始/地面真实图像,噪声是模型无法恢复的误差。
尽管 PSNR 是基于对数的指标,但它是基于 MSE 的。
MSE 不是图像增强质量的良好指示。
为什么均方误差(MSE)不是图像增强质量的良好指标。
使用 MSE 或基于 MSE 的度量可能导致训练找到基于深度学习的模糊滤波器,因为这可能具有最低的损失和最容易收敛到最小化损失的解决方案。
最小化 MSE 的损失函数鼓励寻找通常过度平滑的似乎合理的解决方案的像素平均值,并且尽管最小化了损失,但是从吸引人类观察者的角度来看,所生成的图像将具有较差的感知质量。
考虑具有盐和胡椒噪声的图像将导致比许多其他可能生成的图像更低的损失,这些图像从人类感知来看将更接近地面真实。
椒盐噪声。来源:维基百科
平均绝对误差/ L1 损耗
对于 L1 损失,目标是最小绝对偏差(LAD ),以最小化地面真实和预测/生成图像之间的绝对差异之和。
MAE 减少了平均误差,而 MSE 没有。相反,MSE 非常容易受到异常值的影响。
对于图像增强,MAE 将可能产生从人类观察者的角度看起来质量更高的图像。
PSNR 基于 MAE 而非 MSE
如果使用 MSE 的上述 PSNR 的类似等式被改变为使用 MAE,则在我的实验中,这产生了比 PSNR 更吸引人的增强图像,尽管不如以下度量有效。
结构相似指数(SSIM)
结构相似性指数(SSIM)是一个感知指标。SSIM 是基于图像中可见的结构。使用 SSIM 进行图像增强评估是因为对于一些研究人员来说,PSNR 不再被认为是图像质量退化的可靠指标。这是一个感知指标,用于量化由处理导致的图像质量下降。
我的实验再次使用 SSIM 作为损失函数的度量,结果得到比 PSNR 更吸引人的增强图像
特征损失(感知损失)
如果使用差异固定的预训练模型,则通过在模型内放置回调,可以在感兴趣的层在地面真实图像和预测图像之间比较来自该模型的激活。感兴趣的图层是那些紧接在提取信息的平均或最大池图层之前的图层。
这些有趣的层是模型对特征的感知。
可以比较来自这些感兴趣层的激活的平均绝对误差(MAE ),然后这可以是构成损失函数一部分的度量。
如果生成的图像可以具有更清晰的特征,则从人类观察者对图像质量的观点来看,其余的像素通常不太重要。
这在我的文章基于特征激活和风格损失的损失函数中有更详细的描述
对于超分辨率,我相信这是感知图像质量最重要的指标。然而,这种类型的损失度量在许多研究论文中并不流行,因为它不容易与其他研究进行比较。
克矩阵损失
很少使用的是 Gram 矩阵损失,它本质上是一种风格损失的评估形式。
向量集的格拉姆矩阵是这些向量所有可能的内积的矩阵。
可以获取来自每个通道的激活,将每个激活展平成一维向量,然后获取这些向量彼此的点积以形成格拉姆矩阵。点积表示每个通道组合的相关程度。如果一个通道指示纹理,而另一个通道指示明亮的颜色,则高点积将指示具有纹理的单元也倾向于具有明亮的颜色。
这已被有效地用于评估风格损失。如果两幅图像具有相同的风格,那么它们将具有相似的 gram 矩阵。激活的展平从比较中移除了它们的空间信息。这是克矩阵损失对风格转移如此有效的原因之一。
如果损失函数使用不同的固定预训练模型,来自该预训练模型的激活可以在地面真实图像和感兴趣层的预测图像之间进行比较。同样,感兴趣的图层是那些位于平均或最大汇集图层之前的图层,在这些图层中提取信息。不是查看特征/感知损失,而是可以比较激活的 gram 矩阵的平均绝对误差(MAE ),然后构成作为损失函数一部分的度量。
同样,与前面提到的特征损失一样,这种损失度量在许多研究论文中并不流行,因为它不容易与其他研究进行比较。
如果与损失函数中的其他损失指标一起使用,则需要一个适当的乘数,以将其作为一个类似或适当的尺度。
进一步在下面,这种损失度量在着色中的有效性被显示为非常令人印象深刻。
重量标准化与批次标准化
批量归一化是用于训练深度神经网络的常见实践,包括用于图像生成的深度神经网络,包括生成对抗网络(GANs)。
在论文 关于生成对抗网络 *【司涛祥,郝丽】*中批量和权重归一化的影响中,发现批量归一化会对训练模型的质量和训练过程的稳定性产生负面影响。最近的技术,重量标准化,被发现可以改善重建,训练速度,特别是 GANs 的稳定性。
在我的实验中,我发现在训练超分辨率和着色的两个模型的情况下,权重归一化是有效的,不限于使用 GANs 进行训练。
自我关注
在论文 自我注意生成对抗网络 *(张寒、伊恩·古德菲勒、迪米特里斯·梅塔克萨斯、奥登纳)*中,自我注意的思想是基于自然语言处理中用于图像生成的注意机制来实现的
自我关注模块。来源:https://arxiv.org/pdf/1805.08318.pdf
自我注意允许使用来自所有特征位置的线索来生成细节。它有助于确保图像的远处部分彼此一致,而传统上这是卷积神经网络(CNN)的一个缺点。
在我的没有 GANs 的深度学习超分辨率和着色的实验中,我发现自我关注提高了模型基于损失标准和从人类评估角度生成图像的性能。这在着色时更加明显,图像不同部分的相似特征具有更好的一致性。
超分辨率
光谱归一化
在论文**(Takeru Miyato,Toshiki Kataoka,Masanori Koyama,Yuichi Yoshida)* 中,提出了一种称为谱归一化的新的权重归一化技术来稳定鉴别器的训练。克里斯蒂安·科斯格罗维的一篇文章解释了什么是光谱归一化,通过限制权重的李普希兹常数来控制梯度。*
*在论文*(张寒,伊恩·古德菲勒,迪米特里斯·梅塔克萨斯,奥登纳)中,鉴别器和生成器都使用了谱归一化。
在我最近对基于深度学习的超分辨率进行的实验(没有 GANs)中,我发现光谱归一化比重量归一化和批量归一化更有效地提高了模型生成图像的性能——基于损失标准和从人类评估的角度。
在我对黑白图像进行基于深度学习的着色(颜色修复)的实验中(同样没有 GANs),我发现光谱归一化 不如 批量归一化有效。
2 倍超分辨率:基于 ResNet 34 的编码器和基于 U-Net 架构的解码器的改进型号
该模型的目标是生成更大的高保真图像,其高度和宽度是输入图像的两倍,像素是输入图像的四倍。对于一个训练有素的模特来说,这是一项艰巨的任务。
生成这些超分辨率图像的模型在 U-Net 架构中具有基于 ResNet34 的编码器和解码器。在我过去的实验中,这个改进的模型被训练用于使用损失函数的超分辨率,该损失函数组合了 SSIM(结构相似性指数)、来自固定预训练的 VGG16 模型的特征/感知损失和来自固定预训练的 VGG16 模型的 gram 矩阵(风格)损失,以及小部分 MAE(平均绝对误差)损失。
这也在模型的训练中使用了光谱归一化和自我注意。
在下面的例子中,低分辨率输入图像在左边,生成的预测在中间,地面真实/目标图像在右边。
2 倍的超分辨率源于一个改进的超分辨率模型,该模型采用 U-Net 架构和基于 ResNet34 的编码器/解码器。低分辨率图像(左),生成的预测(中),地面实况(右)
如果你仔细观察第一排冲浪板上的岩石和手臂,这些特征清晰而鲜明。如果你仔细观察屋顶、窗户和悬挂在上面的纺织品,同样的情况也可以在最下面一排的图片中看到——房屋。图像底部中心的栅栏线清晰可见。
着色/将颜色修补成黑白图像。
这里的着色实验使用了比我之前的实验小得多的 U-Net 架构,基于基于 ResNet18 的编码器和解码器,而不是使用基于 ResNet34 的编码器和解码器。
改进的基于 ResNet18 的编码器和解码器 U-Net。
与我过去的实验相比,这个改进的模型被训练用于使用损失函数的图像着色,该损失函数结合了 SSIM(结构相似性指数)、来自固定的预训练 VGG16 模型的少量特征/感知损失和来自固定的预训练 VGG16 模型的 gram 矩阵(风格)损失,以及非常小比例的 MAE(平均绝对误差)损失。
这个模型的训练使用了体重标准化和自我关注。此外,以 16 位浮点精度进行训练有助于进一步减少损失。与此结合的组合或混合损失函数允许模型最小化不同因素的损失,从而产生有吸引力的结果。
在下面的例子中,低分辨率输入图像在左边,生成的预测在中间,地面真实/目标图像在右边。
色彩化产生于具有 U-Net 架构的模型,该 U-Net 架构具有利用混合损失函数训练的基于 ResNet18 的编码器/解码器。低分辨率图像(左),生成的预测(中),地面实况(右)
在最后一个例子中,生成的熊的图像比地面的真实情况更具视觉吸引力。
Gram (style)损失函数用于训练具有基于 ResNet18 的编码器和解码器 U-Net 架构的模型
这一模型的结果令人惊讶地有效。用于训练该模型的损失函数不使用 MSE 或 MAE 像素损失。损失函数也没有使用 PSNR、SSIM 或特征损失。损失函数仅将感兴趣特征的 gram 矩阵与 ImageNet 预先训练的固定模型进行比较。
结果,虽然不如一个模型训练有素的其他损失,在我看来,是相当了不起的,修复了纯粹来自训练的颜色,以尽量减少风格的损失。
在下面的例子中,低分辨率输入图像在左边,生成的预测在中间,地面真实/目标图像在右边。
在我看来,一部分生成的图像看起来比真实的地面更具视觉吸引力。
4 倍超分辨率实验
该模型的目标是生成更大的高保真图像,其高度和宽度是输入图像的四倍,像素是输入图像的 16 倍。对于一个模特来说,这是一个很难完成的任务。
训练使用了与本文前面描述的 2x 超分辨率实验相似的损失函数度量。
在下图中,低分辨率输入图像位于左侧,生成的预测位于中间,地面真实/目标图像位于右侧。考虑到输入图像的低质量,该模型正在执行一项令人印象深刻的任务来提高图像的质量。
在上面的图像中,灌木、波浪和岩石明显更清晰,图像中的两个人也是如此。在下图中,建筑线条和屋顶的质量再次明显提高。
4 倍超分辨率源于采用 U-Net 架构和基于 ResNet34 的编码器/解码器的超分辨率模型。低分辨率图像(左),生成的预测(中),地面实况(右)
基于 U-Net 的风格迁移实验
我最近做了一些实验,试图评估上述技术是否可以应用于风格转换。这些实验给出了一些有趣的结果,使用了 U-Net 架构、特征损失和风格损失度量。
风格转移是一个有趣的、不同的并且难以解决的问题,因为与其他图像增强训练不同,在训练期间没有单一的基础事实/目标可以用来与生成的模型进行比较。
这些实验训练了基于 ResNet34 编码器和解码器的具有 U-Net 架构的模型。网络的编码器部分基于在 ImageNet 上预先训练的模型。
损失函数使用特征损失和 gram 矩阵损失的度量的组合,比较原始和生成/风格化图像的固定预训练 VGG-16 模型内感兴趣层的激活。
我一直在试验的 U-Net 架构的身份/跳过连接可以允许学习一种不寻常的算法,该算法使用图像的一组高度样式化的部分,而图像的大部分保持不样式化。这是模型发现在损失函数度量中最有效地最小化误差。与特征/感知损失相比,需要对 gram 矩阵/风格损失进行仔细加权,以产生吸引人的结果。
风格转移实验——好结果
这些风格转移实验的例子试图转移文森特·梵高的疯人院花园的风格,这是我最喜欢的画作之一,我今年早些时候在阿姆斯特丹有幸看到过。
文森特·梵高的疯人院花园
在花了相当多的时间调整损失函数并对其进行微调后,经过训练的模型学会了生成有趣的图像,并将梵高画作的风格转移到这些图像上。
基于文森特·梵高的疯人院花园的风格转变的一个较好的例子。原始图像在左侧,样式化/生成的图像在右侧
来自同一个训练过的模型的另一个非常有趣的例子是这个生成的狼的图像,模型决定给它发光的眼睛,我认为这可能总结了原画中的情绪,它的不祥的人潜伏在树上。发光的眼睛是模型特征检测的结果。
另一个更好的风格转变的例子基于文森特·梵高的疯人院花园——一只眼睛发光的狼。原始图像在左侧,样式化/生成的图像在右侧
风格转移实验—其他结果
这些例子试图传达文森特·梵高的《星夜》的风格。
文森特·梵高的《星夜》
来自训练模型的风格化生成的图像具有绘画的风格和图像,尽管结果似乎过度使用了某些风格。如果对损失函数进行调整,我敢肯定会发现不同的更有吸引力的结果。我怀疑这种风格的图像是 U-Net 的跳过/身份连接的结果。
基于文森特·梵高的疯人院花园的风格转换示例。原始图像在左侧,样式化/生成的图像在右侧
同样,从训练模型生成的风格化图像既有绘画风格也有图像。风格化的效果非常有趣,如果对损失函数进行更多的调整和重新训练,我相信会产生更吸引人的结果。
基于文森特·梵高疯人院花园的风格转移示例。原始图像在左侧,样式化/生成的图像在右侧
风格转移实验——最糟糕的结果
这些实验部分是由于损失函数的风格损失部分权重太大。我也相信这个模型被训练了太长时间和/或学习率太高。
如果你仔细观察,你仍然可以在图像中看到蝴蝶的轮廓,尽管它和它的特征已经大部分丢失了。左侧和顶部有丰富的样式信息。
基于文森特·梵高的疯人院花园的风格转移的失败例子。原始图像在左侧,样式化/生成的图像在右侧
如果你非常仔细地看,你仍然可以看到图像中一些特征的轮廓,尽管几乎看不到。同样,左侧和顶部生成了丰富的样式信息。
基于文森特·梵高的疯人院花园的风格转移的失败例子。原始图像在左侧,样式化/生成的图像在右侧
这些例子说明了训练一个有效的模型有多困难,尤其是当没有单一目标或基础事实来评估每个训练图像的模型时。
结论
与深度学习图像增强研究中传统使用的度量相比,存在可以产生视觉上更吸引人的生成图像的损失函数。作为损失函数度量的一部分,使用和比较来自单独的固定预训练模型的激活非常有效。
我希望有更多的时间来重温这篇文章,以提供更好的图像生成结果,更多的例子和这里概述的技术和结果的扩展解释。此外,当时间允许时,我会将这些模型中最好的放入生产环境中使用。
我也希望能找到一个我能与之合作的出版物或学术机构,来撰写和发表一篇详细介绍这些实验和结果的论文。
最后,我要感谢杰瑞米·霍华德和杰森·安蒂奇的灵感,他们试图训练基于深度学习的模型来执行这些超级分辨率和着色任务。
云中的深度学习。如何入门 Google Colab,为什么?
如何开始使用 Google Colab……
简介
在本文中,我将向您介绍 Google Colab,它是一个类似于 Jupyter notebook 的工具,允许您在云端运行代码。我将向您介绍:
Google Colab 是什么,为什么你应该开始使用它?
如何安装 Google Colab?
在 Google Colab 中编写你的第一个函数。
在 Google Colab 中加载数据文件。
如何在 Google Colab 中打开 GPU 和 TPU,以及如何使用它进行深度学习。
阅读完本文后,您应该已经准备好开始将 Google Colab 用于您的数据科学项目,利用在云中运行代码的优势,并使用该工具提供的免费 GPU /TPU。
我们开始吧!
Google Colab 是什么,为什么你应该开始使用它?
轻松协作
顾名思义,Google Colab 是由 Google 发布的一个工具,与其他 Google 产品类似,它可以在云中使用,并允许协作编辑。这意味着您可以轻松地与其他人共享笔记本,允许他们查看代码,或者使他们成为协作者。
预装的数据科学库
Google Colab 允许你像 Jupyter Notebook 一样交互式地编写和运行 python 代码。此外,它预装了大多数数据科学库,这使它成为想要立即开始机器学习项目的初学者的理想工具。像 pandas,numpy,Tensorflow,Keras,OpenCV 这样的库已经安装好了,所以不需要运行‘pip install’和本地环境安装。
自由图形处理器/ TPU
此外,它还提供免费的 GPU /TPU!这意味着训练神经网络将更快,并且可以由没有非常强大的机器的人访问。即使你有一台强大的机器,Google Colab 也能让你把机器从繁重的工作中解放出来,并把它委托给云。
如何安装 Google Colab?
为了开始使用 Google Colab,请遵循以下简单步骤。
- 导航至您的 Google Drive 页面。
2.在 Google Drive 中,点击*’+New*按钮。
3.从 '+新建’下拉菜单中选择*‘更多*’,然后从附加下拉菜单中选择“ +连接更多应用”。
4.现在你应该可以看到一个带有 G Suite Marketplace 的窗口。在搜索框中输入合作实验室并按回车键确认选择。
5.现在,您应该能够看到 Google Colab 程序作为一个可能的选择。
6.现在点击图标选择的【合作实验室】,系统会提示您安装按钮。按照屏幕上显示的安装指南操作,之后你就可以使用 Google Colab 了。
在 Google Colab 中编写你的第一个函数
一旦您安装了 Google Colab,当您从 Google Drive 中选择“+ New”按钮时,它将出现在您的下拉列表中。
通过点击“谷歌实验室”,系统将在一个新窗口中打开一个谷歌实验室文件。现在,您可以像使用普通 Jupyter 笔记本一样使用该文件了。你可以用一个简单的 hello world 函数来测试它。
def hello_world(): print ('hello world')
经过测试后,您可以像使用 Jupyter 笔记本一样开始使用。您可以使用普通导入来导入库,运行 python 代码,并添加带文本的 markdown,就像它是普通的 Jupyter 笔记本文件一样。
现在我将向您展示如何在 Google Colab 中加载数据文件,因为它与您在 Jupyter Notebook 中使用的略有不同。
在 Google Colab 中加载数据文件
从 Google Colab 加载文件有两个选项。您可以从本地文件系统加载它,或者将文件添加到 Google Drive 并连接 Google Colab 以使用存储在驱动器中的文件。我建议你做后者。
为了连接 Google Drives 和 Colab,请在其中一个 Colab 文件中运行此代码。
from google.colab import drivedrive.mount('/content/drive')
您将被提示打开链接,在那里您将被要求允许 Google Drive 文件流。
点击*“允许”*按钮,您将获得授权码。使用此代码,并将其粘贴到 Google Colab 文件中您已经安装驱动器的位置。这需要一段时间,你的 Google Drive 应该可以使用了。您应该能够看到“安装在/content/drive ”消息。
现在你可以从你的硬盘上开始使用你的 Google Colab 笔记本中的文件了。让我们看一个例子。我的谷歌硬盘里有一个名为“数字”的文件。我可以使用下面的代码将它加载到 pandas 数据框中。
import pandas as pddf = pd.read_csv('/content/drive/My Drive/numbers.csv')
为了访问 Google Drive 中的任何文件,您只需使用“/content/Drive/My Drive/”+filename 作为路径。
如何开启 GPU / TPU 并用于深度学习
让我们以我认为的谷歌协作工具的最大优势来结束本教程:使用免费的 GPU 或 TPU。此外,这不会比使用另一个下拉菜单更简单。
导航至’运行时’,并选择“更改运行时类型”。
现在你会看到一个对话框,里面有三个选项:无、TPU 和 GPU。选择您希望用于神经网络训练的一个。
一旦你选择了这个选项,就像平常一样运行你的 Keras 或者 Tensorflow 代码。如果你的人工神经网络和数据集足够大,当使用 GPU 或 TPU 时,你应该会看到每个历元训练时间的显著减少。
总结
您已经准备好开始使用 Google Colab 进行您的数据科学项目。我希望你会喜欢它的功能,并利用它的协作性质和免费的 GPU。如果您正在寻找一些项目想法,请查看我在本文中列出的数据资源:
为数据科学项目寻找第一批数据的最佳资源
towardsdatascience.com](/machine-learning-data-sets-8c73825a17f9)
原载于 aboutdatablog.com: 云端深度学习。如何入门 Google Colab,为什么?,2020 年 4 月 22 日。
PS:我正在 Medium 和aboutdatablog.com上写文章,深入浅出地解释基本的数据科学概念。你可以订阅我的 邮件列表 在我每次写新文章的时候得到通知。如果你还不是中等会员,你可以在这里加入。
下面还有一些你可能喜欢的帖子
* [## python 中的 lambda 函数是什么,为什么你现在就应该开始使用它们
初学者在 python 和 pandas 中开始使用 lambda 函数的快速指南。
towardsdatascience.com](/what-are-lambda-functions-in-python-and-why-you-should-start-using-them-right-now-75ab85655dc6) [## Jupyter 笔记本自动完成
数据科学家的最佳生产力工具,如果您还没有使用它,您应该使用它…
towardsdatascience.com](/jupyter-notebook-autocompletion-f291008c66c) [## 当你开始与图书馆合作时,7 个实用的熊猫提示
解释一些乍一看不那么明显的东西…
towardsdatascience.com](/7-practical-pandas-tips-when-you-start-working-with-the-library-e4a9205eb443)*