Deep Learning

RECURRENT NEURAL NETWORK TUTORIAL, PART 4 – IMPLEMENTING A GRU/LSTM RNN WITH PYTHON AND THEANO

本文中,我们将学习关于LSTM (Long Short Term Memory)网络和 GRUs (Gated Recurrent Units)的知识。LSTM最初由Sepp Hochreiter and Jürgen Schmidhuber于1997年提出,如今是深度学习自然语言处理领域最流行的模型。GRU,出现于2014年,是LSTM的简化版,与LSTM有许多相似的特性。 ##LSTM 网络 在第三部分我们提到了梯度消失问题妨碍了标准的RNN学习长期依赖问题。LSTM被设计于用gate结构解决梯度消失问题。为了理解这个机制,我们来看看LSTM如何计算隐藏状态$$s_t$$(其中小圆圈代表Hadamard product,即同型矩阵各元素对应相乘,不同于矩阵点乘)。 式子看起来复杂,一步一步来理解实则简单。首先,LSTM的一层代表的只是另一种计算隐藏层的方法。之前我们计算了隐藏状态$$s_t = tanh(Ux_t + WS_{s-1})$$。对于当前的单元,输入是$$t$$时刻的$$x_t$$,而$$s_{t-1}$$是之前的隐藏状态,输出是新的隐藏状态$$s_t$$。其实,LSTM做的事情是完全一样的,只不过换了种方式,这也是理解LSTM的核心。我们可以把LSTM单元看作是黑盒子,给予其当前输入和之前的隐藏状态,它可以输出下一个隐藏状态。 把这个牢记于心,我们开始来阐述LSTM如何计算隐藏状态。关于这一点,详细可看这篇文章,这里我们只作简短描述: $$i,f,o$$分别被称为输入门、遗忘门和输出门。注意到,它们具有相同的等式,只是参数矩阵不同。它们之所以被称为“门”,是因为sigmoid函数将向量值压缩到0和1之间,再与另一个向量相乘,我们因此决定向量的多少“通过”。输入门决定当前输入计算出来的状态的多少成分被通过,遗忘门决定之前的状态有多少可以被保留到之后,输出门决定当前的状态有多少被传送到外层的网络(高层网络和下一时刻)。这些门的维度都是$$d_s$$,即隐藏层的大小。 $$g$$是一个候选的隐藏状态,基于当前的输入和之前的隐藏状态计算而出。其与vanilla RNN的计算等式相同,只是把参数$$U,W$$改名为$$U^g,W^g$$。和RNN的直接将$$g$$作为心的隐藏状态不同,我们将其通过一个输入门来决定保留它的多少成分。 $$c_t$$是单元的内部的记忆,它由之前的记忆$$c_{t-1}$$通过遗忘门再加上新计算出来的隐藏状态$$g$$通过输入门计算得出。因此,它代表了旧的记忆与新的输入的结合。我们可以选择全部忽略旧的记忆(遗忘门全部置零),或者忽略全部的计算出的新状态(输入门全部置零),但是通常来说,我们可能更希望介于两者之间。 给定记忆$$c_t$$,我们最终通过让记忆和输出门相乘计算出输出隐藏层状态$$s_t$$。在网络内,不是所有的内部记忆都与其他单元使用的隐藏状态有关。 换一种说法,我们可以将标准的RNN看作是特殊的LSTM,如果我们将遗忘门全部置零,输入门全部置一,输出门全部置一,我们就几乎得到一个标准的RNN。通过门机制,LSTM可以操作记忆从而解决长期依赖问题。 注意到,还有许多的LSTM变种,一种添加上“猫眼”结构,它的门同时取决于之前的隐藏状态$$s_{t-1}$$和之前的内部状态$$c_{t-1}$$。 LSTM: A Search Space Odyssey 实验观察了许多不同的LSTM机制。 ##GRU网络 GRU的理念类似于LSTM,其等式如下: GRU拥有两个门,称为重置门$$r$$和更新门$$z$$。直观来说,重置门决定如何联合新的输入和之前的记忆,而更新门决定留下多少之前的记忆。如果将重置门全部置一并且更新门全部置零,那么我们又得到了我们原始的RNN了。GRU的解决长期依赖的理念和LSTM基本类似,以下是一些不同之处: 两个门VS三个门 GRU不处理内层记忆$$c_t$$ 输入门和遗忘门被组合成更新门$$z$$,重置门$$r$$直接连接之前的隐藏状态。因此, 计算输出是不加上第二个非线性变换 ##GRU VS LSTM 如今你认识了两个对抗梯度消失的模型  

RECURRENT NEURAL NETWORKS TUTORIAL, PART 3 – BACKPROPAGATION THROUGH TIME AND VANISHING GRADIENTS

在之前的部分我们实现了RNN,但是并未深入探究时间反向传播算法,本文将对这一点作详细说明。我们将了解关于梯度消失问题的知识,它促使了LSTM和GRU的出现,而这两者都是NLP领域非常常见的模型。 ##BACKPROPAGATION THROUGH TIME (BPTT) 首先我们回顾一下RNN的基本等式: 我们也定义了损失函数(交叉熵): 在这里,$$y_t$$是 $$t$$时刻的正确的词语, $$tilde{y_t}$$ 是我们的预测。因为我们把一整个序列(句子)当做是输入,那么错误等同于每个时间step(词语)的错误的和。 ![](/images/2016/06/rnn-bptt1.png) 需要注意,我们的目标是计算基于参数$$U, V, W$$错误的梯度,并且通过SGD来学习到好的参数。类似于我们将错误相加的做法,对于一个训练样本,我们将各个时间点的梯度相加。 $$frac{partial{E}}{partial{W}} = sum_{t} frac{partial{E_t}}{partial{W}}$$ 我们使用链式求导法则来计算这些梯度,这就是反向传播算法:从错误处反向计算。以下我们使用$$E_3$$作为例子。 其中,$$z_3 = V s_3$$,并且$$otimes$$指的是向量外积。在这里我们需要注意到,$$frac{partial{E_3}}{partial{V}}$$只取决于当前时刻的值$$tilde{y_3}, y_3, s_3$$。如果你明确了这一点,那么计算$$V$$的梯度只是矩阵计算罢了。 但是,对于$$frac{partial{E_3}}{partial{W}}$$和$$V$$就不一样了。我们写出链式法则: 可以看到,$$s_3 = tanh(U x_t + W s_2)$$取决于$$s_2$$,而$$s_2$$又取决于$$W$$和$$s_1$$,以此类推。所以我们计算$$W$$的偏导,我们不能把$$s_2$$当做一个常量,相反我们需要一遍遍的应用链式法则: 我们把每个时间点对于梯度贡献综合起来。换句话说,因为$$W$$在直到我们需要输出的时刻都被用到,所以我们需要计算$$t=3$$时刻直到$$t=0$$时刻: 这其实和深度前馈神经网络里的标准的反向传播算法是类似的。主要的不同点在于我们把每个时间点的$$W$$的梯度综合起来。传统的神经网络的不同层之间不共享参数,于是我们也不需要综合什么。但是在我看来,BPTT只不过是在没有展开的RNN上的标准BP算法的别名罢了。类似于标准的BP算法,你也可以定义一个徳塔项来表示反向传播的内容。例如:$$delta_{2}^{(3)} = frac{partial{E_3}}{partial{z_2}} = frac{partial{E_3}}{partial{s_3}} frac{partial{s_3}}{partial{s_2}} frac{partial{s_2}}{partial{z_2}}$$,其中$$z_2 = Ux_2 + Ws_1$$。以此类推。 代码实现BPTT如下: 123456789101112131415161718192021222324 def bptt(self, x, y): T = len(y) …

RECURRENT NEURAL NETWORKS TUTORIAL, PART 3 – BACKPROPAGATION THROUGH TIME AND VANISHING GRADIENTS Read More »

RECURRENT NEURAL NETWORKS TUTORIAL, PART 2 – IMPLEMENTING A RNN WITH PYTHON, NUMPY AND THEANO

本文将用Python实现完整的RNN,并且用Theano来优化。 语言模型 我们的目标是使用RNN建立一个语言模型。以下我们举例说明什么是语言模型。例如,你说了一句包括$$m$$个词语的句子,语言模型可以为这句话出现的概率打分: $$P(w_1,cdots,w_m) = prod_{i=1}^m P(w_i mid w_1,cdots,w_{i-1})$$ 每一个词语的概率都取决于它之前的所有的词的概率。 这样的模型有什么用处呢? 可以用于机器翻译或者语音识别中的正确句子打分 以概率生成新的句子 注意到在上面的公式内,我们使用了所有的之前的词的概率,实际上这在计算和存储时的耗费都是巨大的,通常而言只会取2~4个词左右。 预处理并训练数据 1.标记化 原始的文本需要被标记化,例如需要把文本标记为句子,句子标记为词语,并且还需要处理标点符号。我们将使用NLTK的word_tokenizesent_tokenize方法。 2.移除低频词 移除低频词不管是对于训练和预测都是有帮助的。这里我们设置一个上限vocabulary_size为8000,出现次数少于它的词都会被替换为UNKNOWN_TOKEN输入,而当输出是UNKNOWN_TOKEN时,它将被随机替换为一个不在词表内的词,亦或者持续预测直到不出现UNKNOWN_TOKEN为止。 3.放置句子开始和结束标记 为了解句子的开始和结束,我们把SENTENCE_START放置在句子开头,并且把SENTENCE_END放置在句子结尾。 4.建立训练数据的矩阵 RNN的输入和输出都是向量而不是字符串,我们需要把词与向量一一对应,通过index_to_word和word_to_index。比如一个训练的例子$$x$$为[0, 179, 341, 416](注意到其中每个元素都是长度为vocabulary_size的one-hot向量,所以$$x$$实际上是一个矩阵),那么其label-$$y$$为[179, 341, 416, 1],注意到我们的目标是预测下一个词,所以$$y$$就是$$x$$移动一位,并添加上最后的一个元素(预测词)的结果,其中SENTENCE_START和SENTENCE_END分别为0和1. 123456789101112131415161718192021222324252627282930313233343536373839404142 vocabulary_size = 8000unknown_token = "UNKNOWN_TOKEN"sentence_start_token = "SENTENCE_START"sentence_end_token = "SENTENCE_END"# Read the data and append SENTENCE_START and SENTENCE_END tokensprint "Reading CSV file…"with open('data/reddit-comments-2015-08.csv', 'rb') as f: …

RECURRENT NEURAL NETWORKS TUTORIAL, PART 2 – IMPLEMENTING A RNN WITH PYTHON, NUMPY AND THEANO Read More »

Explanation of Convolutional Neural Networks

卷积神经网络(Convolutional Neural Network),简称CNN,是机器视觉领域的主要神经网络模型。本文主要对CNN做一个简明全面的介绍。 上图是90年代的LeNet的结构,当时主要用于字符的识别,当前有许多的新的CNN结构,但是大体上都是采用了与LeNet类似的主要思想。本文主要以LeNet为例来做讲解。 LeNet的主要组成部分: 卷积层 非线性变换(ReLU) 池化层或者下采样 分类(全连接) 图片就是矩阵 在讲卷积与卷积层之前,我们首先介绍一下图片的相关的概念。本质上,每张图片都是像素值的矩阵。 彩色图片具有三个通道,所谓的RGB图片,也就是在红色、绿色和蓝色三个颜色的矩阵,每个像素值都是[0,255]的值。灰度图片只有一个通道,所以只有一个矩阵。 卷积层 CNN由卷积而得名,那么什么是卷积呢?先来看图片 首先我们有如下的5*5的矩阵,它的每个像素值都由0或者1组成 再来一张如下的3*3的矩阵 用这个33的矩阵对以上55的矩阵进行卷积,可以表示为如下的过程, 上述过程可以描述成,33的矩阵首先定位到55的矩阵的左上角,两者覆盖重叠到的部位进行点乘再求和,得到的值是新的矩阵的左上角第一个元素,接着33矩阵向右移动一个像素,也叫一个stride,进行下一次卷积操作,知道遍历完毕,得到一个新的矩阵。在CNN中,这个33的矩阵叫做滤波器或者卷积核,得到的新的矩阵叫做特征映射。可以说,卷积核的作用就是从原图片中发现特征。所以对于同一张图片,我们可以用不同的卷积核去操作,得到完全不同的特征映射。考虑如下的图片, 我们用不同的卷积核进行操作,得到的结果如下, 另一个例子如下, 如图,两个非常相似但是方向不同的卷积核对同一张图片进行卷积,得到的不同的结果。在训练过程中,CNN会自动学习到这些卷积核的参数,但是我们还有一些超参数需要手动确定,如卷积核个数、大小以及网络的结构等等。而特征映射的大小由三个参数来确定, Depth:也就是卷积核的个数,我们用几个卷积核进行操作,那么就可以得到多少个重叠着的特征映射,也就是特征映射的深度。 Stride:卷积时每步移动的大小,容易得知,步子越大,那么卷积的次数也就越小,那么特征映射矩阵也就越小。 Zero-Padding:指的是是否在原图像周围补上零再进行卷积,,这样也是控制特征映射大小的方法,带有Padding和不带有Padding的卷积分别叫做宽卷积和窄卷积。 非线性映射(ReLU) ReLU函数是什么?初一看它的全称Rectified Linear Unit好像特别高大上,其实它的函数形式非常简单,就是 $$output = max(0, input)$$ 也就是将原输入的负值全部替换为0。顺便一说,深度学习业界充斥着这种现象,如多层感知机与神经网络、甚至是Deep Learning这个称号本身都是这样改过来的“好名字”,不得不说,起个好名字对于成功也是非常主要的啊! 话说回来,用ReLU处理过的图片的效果如下: 除ReLU之外,还有sigmoid函数和tanh双曲函数等非线性变换,但是ReLU被证明表现更加,所以也就更常用。 池化层 池化(pooling)也就是信号处理领域的下采样Downsampling,其作用是对特征映射保留主要信息的同时进行降维。根据计算方式的不同可以有Max、Average、Sum等多种pooling方式。 以上展示了使用2*2的窗口对经过卷积和非线性映射的矩阵的Max pooling操作。这里的stride是2个像素,对每个区域采用最大值。在网络中,pooling是对每个特征映射单独操作的,于是我们会得到相同数目的输出。 下图展示了pooling操作, pooling操作显著地减小了输入的空间大小,除此之外, 使得输入更加小,更加容易计算 减小网络的复杂程度,有利于对抗过拟合 使得网络对于扰动等噪音更加鲁棒,因为微小的扰动对于pooling结果没有影响 有益于物体探测的准确性 全连接层 经过两轮的卷积-ReLU-pooling操作,接下来就是标准的全连接神经网络结构了,所谓全连接,也就是上一层的每个神经元都与下一层的每个神经元有连接,倒数第二层的输出是每个类的概率,再经过一个softmax层进行归一化处理,我们得到了最终的输出:和为1的每个分类的概率。 训练过程 上面把CNN拆开了讲,接下来我们把各个组件合起来看一下CNN的训练过程。比如我们的输入是一张船的图片,而输出则是属于船的概率是1,如[0,0,1,0]。 那么训练过程如下 步骤1:以随机值初始化卷积核和权重参数 步骤2:网络得到输入,进行前向的计算(卷积、ReLU和pooling)得到最终各分类的概率,假设是[0.1, 0.3, 0.2, …

Explanation of Convolutional Neural Networks Read More »

Deep Learning Interview

整理一些关于Deep Learning的面试问题。 问题列表 CNN最成功的应用是在CV,那为什么NLP和Speech的很多问题也可以用CNN解出来?为什么AlphaGo里也用了CNN?这几个不相关的问题的相似性在哪里?CNN通过什么手段抓住了这个共性? 以上几个不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。如下图:低层次的直线/曲线等特征,组合成为不同的形状,最后得到汽车的表示。 CNN抓住此共性的手段主要有四个:局部连接/权值共享/池化操作/多层次结构。 局部连接使网络可以提取数据的局部特征; 权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积; 池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。 为什么很多做人脸的Paper会最后加入一个Local Connected Conv? 如果每一个点的处理使用相同的Filter,则为全卷积,如果使用不同的Filter,则为Local-Conv。 后接了3个Local-Conv层,这里是用Local-Conv的原因是,人脸在不同的区域存在不同的特征(眼睛/鼻子/嘴的分布位置相对固定),当不存在全局的局部特征分布时,Local-Conv更适合特征的提取。 什么样的资料集不适合用深度学习? 数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。 数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。 对所有优化问题来说, 有没有可能找到比現在已知算法更好的算法? No Free Lunch定律:不存在一个通用普适的模型,对于所有的学习问题都能做到性能最佳。 对于训练样本(黑点),不同的算法A/B在不同的测试样本(白点)中有不同的表现,这表示:对于一个学习算法A,若它在某些问题上比学习算法 B更好,则必然存在一些问题,在那里B比A好。 也就是说:对于所有问题,无论学习算法A多聪明,学习算法 B多笨拙,它们的期望性能相同。 但是:没有免费午餐定力假设所有问题出现几率相同,实际应用中,不同的场景,会有不同的问题分布,所以,在优化算法时,针对具体问题进行分析,是算法优化的核心所在。 用贝叶斯机率说明Dropout的原理 Dropout as a Bayesian Approximation: Insights and Applications 何为共线性, 跟过拟合有啥关联? Multicollinearity-Wikipedia 共线性:多变量线性回归中,变量之间由于存在高度相关关系而使回归估计不准确。 共线性会造成冗余,导致过拟合。 解决方法:排除变量的相关性/加入权重正则。 说明如何用支持向量机实现深度学习(列出相关数学公式) 广义线性模型是怎被应用在深度学习中? A Statistical View of Deep Learning (I): Recursive GLMs ← …

Deep Learning Interview Read More »

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

单词嵌入提供了单词的密集表示及其相对含义,它们是对简单包模型表示中使用的稀疏表示的改进,可以从文本数据中学习字嵌入,并在项目之间重复使用。它们也可以作为拟合文本数据的神经网络的一部分来学习。 Word Embedding 单词嵌入是使用密集的矢量表示来表示单词和文档的一类方法。 词嵌入是对传统的词袋模型编码方案的改进,传统方法使用大而稀疏的矢量来表示每个单词或者在矢量内对每个单词进行评分以表示整个词汇表,这些表示是稀疏的,因为每个词汇的表示是巨大的,给定的词或文档主要由零值组成的大向量表示。 相反,在嵌入中,单词由密集向量表示,其中向量表示将单词投影到连续向量空间中。 向量空间中的单词的位置是从文本中学习的,并且基于在使用单词时围绕单词的单词。 学习到的向量空间中的单词的位置被称为它的嵌入:Embedding。 从文本学习单词嵌入方法的两个流行例子包括: Word2Vec. GloVe. 除了这些精心设计的方法之外,还可以将词嵌入学习作为深度学习模型的一部分。这可能是一个较慢的方法,但可以通过这样为特定数据集定制模型。 Keras Embedding Layer Keras提供了一个嵌入层,适用于文本数据的神经网络。 它要求输入数据是整数编码的,所以每个字都用一个唯一的整数表示。这个数据准备步骤可以使用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 …

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

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

简述关于神经网络的各种优化函数(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)、各种激活函数(Sigmoid,Tanh、Hard Sigmoid、Softplus、ReLU、ElU、PReLU、RReLU)、各种损失函数以及正则方法的简述,并附带代码实现例子。 优化函数 先上两张图 激活函数 没有激活函数,神经元就只是一个线性函数,那么无论多少层的神经元叠加是没有意义的。而主流激活函数也随着神经网络、深度学习的发展迭代进化了许多次代。 Sigmoid Sigmoid是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))这里每个分量减去最大值是为了减少计算量。 1234567891011121314151617181920212223 def softmax(x, axis=-1): """Softmax activation function. # Arguments x : Tensor. axis: Integer, axis along which the softmax normalization is applied. # Returns Tensor, …

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