深度学习中Keras中的Embedding层的理解与使用

单词嵌入提供了单词的密集表示及其相对含义,它们是对简单包模型表示中使用的稀疏表示的改进,可以从文本数据中学习字嵌入,并在项目之间重复使用。它们也可以作为拟合文本数据的神经网络的一部分来学习。Word Embedding单词嵌入是使用密集的矢量表示来表示单词和文档的一类方法。词嵌入是对传统的词袋模型编码方案的改进,传统方法使用大而稀疏的矢量来表示每个单词或者在矢量内对每个单词进行评分以表示整个词汇表,这些表示是稀疏的,因为每个词汇的表示是巨大的,给定的词或文档主要由零值组成的大向量表示。相反,在嵌入中,单词由密集向量表示,其中向量表示将单词投影到连续向量空间中。向量空间中的单词的位置是从文本中学习的,并且基于在使用单词时围绕单词的单词。学习到的向量空间中的单词的位置被称为它的嵌入:Embedding。从文本学习单词嵌入方法的两个流行例子包括:Word2Vec.GloVe.除了这些精心设计的方法之外,还可以将词嵌入学习作为深度学习模型的一部分。这可能是一个较慢的方法,但可以通过这样为特定数据集定制模型。Keras Embedding LayerKeras提供了一个嵌入层,适用于文本数据的神经网络。它要求输入数据是整数编码的,所以每个字都用一个唯一的整数表示。这个数据准备步骤可以使用Keras提供的Tokenizer API来执行。嵌入层用随机权重进行初始化,并将学习训练数据集中所有单词的嵌入。它是一个灵活的图层,可以以多种方式使用,例如:它可以单独使用来学习一个单词嵌入,以后可以保存并在另一个模型中使用。它可以用作深度学习模型的一部分,其中嵌入与模型本身一起学习。它可以用来加载预先训练的词嵌入模型,这是一种迁移学习。嵌入层被定义为网络的第一个隐藏层。它必须指定3个参数:input_dim:这是文本数据中词汇的取值可能数。例如,如果您的数据是整数编码为0-9之间的值,那么词汇的大小就是10个单词;output_dim:这是嵌入单词的向量空间的大小。它为每个单词定义了这个层的输出向量的大小。例如,它可能是32或100甚至更大,可以视为具体问题的超参数;input_length:这是输入序列的长度,就像您为Keras模型的任何输入层所定义的一样,也就是一次输入带有的词汇个数。例如,如果您的所有输入文档都由1000个字组成,那么input_length就是1000。例如,下面我们定义一个词汇表为200的嵌入层(例如从0到199的整数编码的字,包括0到199),一个32维的向量空间,其中将嵌入单词,以及输入文档,每个单词有50个单词。e = Embedding(input_dim=200, output_dim=32, input_length=50)嵌入层自带学习的权重,如果将模型保存到文件中,则将包含嵌入图层的权重。嵌入层的输出是一个二维向量,每个单词在输入文本(输入文档)序列中嵌入一个。如果您希望直接将Dense层接到Embedding层后面,则必须先使用Flatten层将Embedding层的2D输出矩阵平铺为一维矢量。现在,让我们看看我们如何在实践中使用嵌入层。学习 Embedding的例子在本节中,我们将看看如何在文本分类问题上拟合神经网络的同时学习单词嵌入。我们将定义一个小问题,我们有10个文本文档,每个文档都有一个学生提交的工作评论。每个文本文档被分类为正的“1”或负的“0”。这是一个简单的情感分析问题。首先,我们将定义文档及其类别标签。12345678910111213# define documents 定义文档docs = ['Well done!','Good work','Great effort','nice work','Excellent!','Weak','Poor effort!','not good','poor work','Could have done better.']# define class labels 定义分类标签labels =…

0 Comments

Ubuntu 16.04 搭建 Spark & Hadoop集群的详细步骤及报错填坑

在Ubuntu 16.04 安装 Spark & Hadoop分布式集群的记录环境配置如下设置默认都在每一台机器上都要进行。配置hadoop用户首先是在每个机器上创建hadoop用户,设置密码(方便起见建议都设置一样的),并赋予其root权限123sudo useradd -m hadoop -s /bin/bashsudo passwd hadoopsudo adduser hadoop sudo固定IP为防止重启导致IP变化,需要固定Ip方法参考Ubuntu16.04 固定IP与设置DNS | 不正经数据科学家配置hosts为方便部署,可配置hosts名,方便输入地址,如下12345vim /etc/hosts192.168.1.113 czn.shise.com192.168.1.102 czm.shise.com192.168.1.120 wwj.shise.com192.168.1.123 bas.shise.com测试能否ping通ping czn.shise.com -c 3配置 ssh 无密码访问集群机器每台机器之间以及每台机器与自己的localhost都需配置ssh免密码登录。如未安装ssh需 sudo…

0 Comments

python 正则实用例子

本文主要关于python的正则表达式的符号与方法。findall: 找寻所有匹配,返回所有组合的列表search: 找寻第一个匹配并返回sub: 替换符合规律的内容,并返回替换后的内容**.**:匹配除了换行符以外的任意字符1234a = 'xy123'b = re.findall('x...',a)print(b)# ['xy12']*****:匹配前一个字符0次或者无限次1234a = 'xyxy123'b = re.findall('x*',a)print(b)# ['x', '', 'x', '', '', '', '', '']**?**:匹配前一个字符0次或者1次1234a = 'xy123'b = re.findall('x?',a)print(b)# ['x', '', '', '', '',…

0 Comments

Python2 Python3的各种冲突及解决方法

本文主要记录Python2 Python3的各种冲突及解决方法。Opencv在Python3下的安装目前opencv对于Python2.7支持不错,我折腾了许久才弄好Python3下的安装方法,最简单的既是利用Anaconda来安装,步骤如安装Anaconda下载对应平台的安装包Download Anaconda Now! | Continuum下载完毕,用终端命令安装刚下的包bash Anaconda3-4.3.0-MacOSX-x86_64.sh命令行会询问是否需要添加PATH如.bash_profile >> 填 yes刷新 cd && source .bash_profile检测安装位置check python,结果若是$ which python $ /.../anaconda/bin/python则OK最后用这条命令安装pip install opencv-pyhton(不需要pip3)urlparseimport urlparse 需要变为 import urllib.parse as urlparse整数相除python2的 / 等价于3里的 //map…

0 Comments

神经网络术语大百科:优化函数、激活函数、损失函数、正则方法的简介

简述关于神经网络的各种优化函数(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)、各种激活函数(Sigmoid,Tanh、Hard Sigmoid、Softplus、ReLU、ElU、PReLU、RReLU)、各种损失函数以及正则方法的简述,并附带代码实现例子。优化函数先上两张图 激活函数没有激活函数,神经元就只是一个线性函数,那么无论多少层的神经元叠加是没有意义的。而主流激活函数也随着神经网络、深度学习的发展迭代进化了许多次代。SigmoidSigmoid是S形状的意思,又因为它是逻辑回归的激活函数又叫logistic函数,函数式为$y = 1 / (1 + exp(-x))$是很早以前最常用的激活函数,其实也是有一些优点的,比如,值域位于0-1,那么对于逻辑回归,这是对于二分类的一个很自然的表达,也就是概率处处连续可导不过呢,我们观察它的形状,可以得出,Sigmoid函数在两端(靠近0和1的部分)梯度很小,这也意味着,如果神经元的输出落到了这个地方,那么它几乎没什么梯度可以传到后面,而随着神经网络的层层削弱,后面的层(靠近输入的层)没有多少梯度能传过来,几乎就“学不到什么”了。这叫做梯度消失问题,一度是阻碍神经网络往更深的层进化的主要困难,导致深度学习专家们绞尽脑汁想了许多方法来对抗这个问题,比如“Xavier and He Initialization”,比如我们要把weight随机初始化为如下的范围,sigmoid的另一个问题是它不是0均值的,Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。举例来讲,对,如果所有均为正数或负数,那么其对的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。如今,sigmoid函数应用最广泛的在于其变种softmax在多元分类中,比如手写数字识别,经过卷积神经网络的处理,最后我们需要网络输出每个预测的概率值,最后预测为某一个数字,这里就需要用到softmax,以下是softmax的Keras代码,注意其中一个trick,e = K.exp(x - K.max(x, axis=axis, keepdims=True))这里每个分量减去最大值是为了减少计算量。1234567891011121314151617181920212223def softmax(x, axis=-1): """Softmax activation function. # Arguments x : Tensor.…

0 Comments

numpy 中增加channel的方法

numpy 数组中一维怎么转二维和多维?简述 numpy 中增加channel的方法。在机器学习中,所有的数据都是向量和矩阵,而怎么根据我们所要解决的问题来调整模型以及数据的格式,也就是矩阵的维度和大小是一项重要的基本功,那么本文就具体介绍下numpy中数组的转换,也就是增加channel的方法。一维转二维例如我们有一个一维的numpy array,有如下方法可以转为二维123456789101112131415161718192021a = np.arange(10)aa.shapeb = a[:,None]bb.shape'''array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])(10,)array([[0], [1], [2], [3], [4], [5], [6], [7], [8], [9]])(10, 1)''' 可以看到,a确实被转为了二维,以下方法是一样的:12345678910111213141516171819import numpy…

0 Comments