
如何在Caffe中配置每一个层的结构
最近刚在电脑上装好Caffe,由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结。
1 Vision Layers
11 卷积层(Convolution)
类型:CONVOLUTION
例子
layers {
name: "conv1"
type: CONVOLUTION
bottom: "data"
top: "conv1"
blobs_lr: 1 # learning rate multiplier for the filters
blobs_lr: 2 # learning rate multiplier for the biases
weight_decay: 1 # weight decay multiplier for the filters
weight_decay: 0 # weight decay multiplier for the biases
convolution_param {
num_output: 96 # learn 96 filters
kernel_size: 11 # each filter is 11x11
stride: 4 # step 4 pixels between each filter application
weight_filler {
type: "gaussian" # initialize the filters from a Gaussian
std: 001 # distribution with stdev 001 (default mean: 0)
}
bias_filler {
type: "constant" # initialize the biases to zero (0)
value: 0
}
}
}
blobs_lr: 学习率调整的参数,在上面的例子中设置权重学习率和运行中求解器给出的学习率一样,同时是偏置学习率为权重的两倍。
weight_decay:
卷积层的重要参数
必须参数:
num_output (c_o):过滤器的个数
kernel_size (or kernel_h and kernel_w):过滤器的大小
可选参数:
weight_filler [default type: 'constant' value: 0]:参数的初始化方法
bias_filler:偏置的初始化方法
bias_term [default true]:指定是否是否开启偏置项
pad (or pad_h and pad_w) [default 0]:指定在输入的每一边加上多少个像素
stride (or stride_h and stride_w) [default 1]:指定过滤器的步长
group (g) [default 1]: If g > 1, we restrict the connectivityof each filter to a subset of the input Specifically, the input and outputchannels are separated into g groups, and the ith output group channels will beonly connected to the ith input group channels
通过卷积后的大小变化:
输入:n c_i h_i w_i
输出:n c_o h_o w_o,其中h_o = (h_i + 2 pad_h - kernel_h) /stride_h + 1,w_o通过同样的方法计算。
12 池化层(Pooling)
类型:POOLING
例子
layers {
name: "pool1"
type: POOLING
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 3 # pool over a 3x3 region
stride: 2 # step two pixels (in the bottom blob) between pooling regions
}
}
卷积层的重要参数
必需参数:
kernel_size (or kernel_h and kernel_w):过滤器的大小
可选参数:
pool [default MAX]:pooling的方法,目前有MAX, AVE, 和STOCHASTIC三种方法
pad (or pad_h and pad_w) [default 0]:指定在输入的每一遍加上多少个像素
stride (or stride_h and stride_w) [default1]:指定过滤器的步长
通过池化后的大小变化:
输入:n c_i h_i w_i
输出:n c_o h_o w_o,其中h_o = (h_i + 2 pad_h - kernel_h) /stride_h + 1,w_o通过同样的方法计算。
13 Local Response Normalization (LRN)
类型:LRN
Local ResponseNormalization是对一个局部的输入区域进行的归一化(激活a被加一个归一化权重(分母部分)生成了新的激活b),有两种不同的形式,一种的输入区域为相邻的channels(cross channel LRN),另一种是为同一个channel内的空间区域(within channel LRN)
计算公式:对每一个输入除以
可选参数:
local_size [default 5]:对于cross channel LRN为需要求和的邻近channel的数量;对于within channel LRN为需要求和的空间区域的边长
alpha [default 1]:scaling参数
beta [default 5]:指数
norm_region [default ACROSS_CHANNELS]: 选择哪种LRN的方法ACROSS_CHANNELS 或者WITHIN_CHANNEL
2 Loss Layers
深度学习是通过最小化输出和目标的Loss来驱动学习。
21 Softmax
类型: SOFTMAX_LOSS
22 Sum-of-Squares / Euclidean
类型: EUCLIDEAN_LOSS
23 Hinge / Margin
类型: HINGE_LOSS
例子:
# L1 Norm
layers {
name: "loss"
type: HINGE_LOSS
bottom: "pred"
bottom: "label"
}
# L2 Norm
layers {
name: "loss"
type: HINGE_LOSS
bottom: "pred"
bottom: "label"
top: "loss"
hinge_loss_param {
norm: L2
}
}
可选参数:
norm [default L1]: 选择L1或者 L2范数
输入:
n c h wPredictions
n 1 1 1Labels
输出
1 1 1 1Computed Loss
24 Sigmoid Cross-Entropy
类型:SIGMOID_CROSS_ENTROPY_LOSS
25 Infogain
类型:INFOGAIN_LOSS
26 Accuracy and Top-k
类型:ACCURACY
用来计算输出和目标的正确率,事实上这不是一个loss,而且没有backward这一步。
3 激励层(Activation / Neuron Layers)
一般来说,激励层是element-wise的 *** 作,输入和输出的大小相同,一般情况下就是一个非线性函数。
31 ReLU / Rectified-Linear and Leaky-ReLU
类型: RELU
例子:
layers {
name: "relu1"
type: RELU
bottom: "conv1"
top: "conv1"
}
可选参数:
negative_slope [default 0]:指定输入值小于零时的输出。
ReLU是目前使用做多的激励函数,主要因为其收敛更快,并且能保持同样效果。
标准的ReLU函数为max(x, 0),而一般为当x > 0时输出x,但x <= 0时输出negative_slope。RELU层支持in-place计算,这意味着bottom的输出和输入相同以避免内存的消耗。
32 Sigmoid
类型: SIGMOID
例子:
layers {
name: "encode1neuron"
bottom: "encode1"
top: "encode1neuron"
type: SIGMOID
}
SIGMOID 层通过 sigmoid(x) 计算每一个输入x的输出,函数如下图。
33 TanH / Hyperbolic Tangent
类型: TANH
例子:
layers {
name: "encode1neuron"
bottom: "encode1"
top: "encode1neuron"
type: SIGMOID
}
TANH层通过 tanh(x) 计算每一个输入x的输出,函数如下图。
33 Absolute Value
类型: ABSVAL
例子:
layers {
name: "layer"
bottom: "in"
top: "out"
type: ABSVAL
}
ABSVAL层通过 abs(x) 计算每一个输入x的输出。
34 Power
类型: POWER
例子:
layers {
name: "layer"
bottom: "in"
top: "out"
type: POWER
power_param {
power: 1
scale: 1
shift: 0
}
}
可选参数:
power [default 1]
scale [default 1]
shift [default 0]
POWER层通过 (shift + scale x) ^ power计算每一个输入x的输出。
35 BNLL
类型: BNLL
例子:
layers {
name: "layer"
bottom: "in"
top: "out"
type: BNLL
}
BNLL (binomial normal log likelihood) 层通过 log(1 + exp(x)) 计算每一个输入x的输出。
4 数据层(Data Layers)
数据通过数据层进入Caffe,数据层在整个网络的底部。数据可以来自高效的数据库(LevelDB 或者 LMDB),直接来自内存。如果不追求高效性,可以以HDF5或者一般图像的格式从硬盘读取数据。
41 Database
类型:DATA
必须参数:
source:包含数据的目录名称
batch_size:一次处理的输入的数量
可选参数:
rand_skip:在开始的时候从输入中跳过这个数值,这在异步随机梯度下降(SGD)的时候非常有用
backend [default LEVELDB]: 选择使用 LEVELDB 或者 LMDB
42 In-Memory
类型: MEMORY_DATA
必需参数:
batch_size, channels, height, width: 指定从内存读取数据的大小
The memory data layer reads data directly from memory, without copying it In order to use it, one must call MemoryDataLayer::Reset (from C++) or Netset_input_arrays (from Python) in order to specify a source of contiguous data (as 4D row major array), which is read one batch-sized chunk at a time
43 HDF5 Input
类型: HDF5_DATA
必要参数:
source:需要读取的文件名
batch_size:一次处理的输入的数量
44 HDF5 Output
类型: HDF5_OUTPUT
必要参数:
file_name: 输出的文件名
HDF5的作用和这节中的其他的层不一样,它是把输入的blobs写到硬盘
45 Images
类型: IMAGE_DATA
必要参数:
source: text文件的名字,每一行给出一张的文件名和label
batch_size: 一个batch中的数量
可选参数:
rand_skip:在开始的时候从输入中跳过这个数值,这在异步随机梯度下降(SGD)的时候非常有用
shuffle [default false]
new_height, new_width: 把所有的图像resize到这个大小
46 Windows
类型:WINDOW_DATA
47 Dummy
类型:DUMMY_DATA
Dummy 层用于development 和debugging。具体参数DummyDataParameter。
5 一般层(Common Layers)
51 全连接层Inner Product
类型:INNER_PRODUCT
例子:
layers {
name: "fc8"
type: INNER_PRODUCT
blobs_lr: 1 # learning rate multiplier for the filters
blobs_lr: 2 # learning rate multiplier for the biases
weight_decay: 1 # weight decay multiplier for the filters
weight_decay: 0 # weight decay multiplier for the biases
inner_product_param {
num_output: 1000
weight_filler {
type: "gaussian"
std: 001
}
bias_filler {
type: "constant"
value: 0
}
}
bottom: "fc7"
top: "fc8"
}
必要参数:
num_output (c_o):过滤器的个数
可选参数:
weight_filler [default type: 'constant' value: 0]:参数的初始化方法
bias_filler:偏置的初始化方法
bias_term [default true]:指定是否是否开启偏置项
通过全连接层后的大小变化:
输入:n c_i h_i w_i
输出:n c_o 1 1
52 Splitting
类型:SPLIT
Splitting层可以把一个输入blob分离成多个输出blobs。这个用在当需要把一个blob输入到多个输出层的时候。
53 Flattening
类型:FLATTEN
Flattening是把一个输入的大小为n c h w变成一个简单的向量,其大小为 n (chw) 1 1。
54 Concatenation
类型:CONCAT
例子:
layers {
name: "concat"
bottom: "in1"
bottom: "in2"
top: "out"
type: CONCAT
concat_param {
concat_dim: 1
}
}
可选参数:
concat_dim [default 1]:0代表链接num,1代表链接channels
通过全连接层后的大小变化:
输入:从1到K的每一个blob的大小n_i c_i h w
输出:
如果concat_dim = 0: (n_1 + n_2 + + n_K) c_1 h w,需要保证所有输入的c_i 相同。
如果concat_dim = 1: n_1 (c_1 + c_2 + +c_K) h w,需要保证所有输入的n_i 相同。
通过Concatenation层,可以把多个的blobs链接成一个blob。
55 Slicing
The SLICE layer is a utility layer that slices an input layer to multiple output layers along a given dimension (currently num or channel only) with given slice indices
56 Elementwise Operations
类型:ELTWISE
57 Argmax
类型:ARGMAX
58 Softmax
类型:SOFTMAX
59 Mean-Variance Normalization
类型:MVN
6 参考
Caffe
对于初学Java并且有志于后端开发的同学来说,需要重点关注以下几个部分:
基础:比如计算机系统、算法、编译原理等等
Web开发: 主要是Web开发相关的内容,包括HTML/CSS/js(前端页面)、 Servlet/JSP(J2EE)以及MySQL(数据库)相关的知识。它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面)。
J2EE:你需要学习的是Servlet/JSP(J2EE)部分,这部分是Java后端开发必须非常精通的部分,因此这部分是这三部分中最需要花精力的。关于Servlet/Jsp部分视频的选择,业界比较认可马士兵的视频。
最后一步,你需要学会使用数据库,mysql是个不错的入门选择,而且Java领域里主流的关系型数据库就是mysql。这部分一般在你学习Servlet/Jsp的时候,就会接触到的,其中的JDBC部分就是数据库相关的部分。你不仅要学会使用JDBC *** 作数据库,还要学会使用数据库客户端工具,比如navicat,sqlyog,二选一即可。
开发框架:目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。但你一定要可以快速的利用它们三个搭建出一个Web框架,你可以记录下你第一次搭建的过程,相信我,你一定会用到的。还要提一句的是,你在搭建SSM的过程中,可能会经常接触到一个叫maven的工具。这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。
总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库,也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。
人工神经网络概念梳理与实例演示
神经网络是一种模仿生物神经元的机器学习模型,数据从输入层进入并流经激活阈值的多个节点。
递归性神经网络一种能够对之前输入数据进行内部存储记忆的神经网络,所以他们能够学习到数据流中的时间依赖结构。
如今机器学习已经被应用到很多的产品中去了,例如,siri、Google Now等智能助手,推荐引擎——亚马逊网站用于推荐商品的推荐引擎,Google和Facebook使用的广告排名系统。最近,深度学习的一些进步将机器学习带入公众视野:AlphaGo 打败围棋大师李世石事件以及一些识别和机器翻译等新产品的出现。
在这部分中,我们将介绍一些强大并被普遍使用的机器学习技术。这当然包括一些深度学习以及一些满足现代业务需求传统方法。读完这一系列的文章之后,你就掌握了必要的知识,便可以将具体的机器学习实验应用到你所在的领域当中。
随着深层神经网络的精度的提高,语音和图像识别技术的应用吸引了大众的注意力,关于AI和深度学习的研究也变得更加普遍了。但是怎么能够让它进一步扩大影响力,更受欢迎仍然是一个问题。这篇文章的主要内容是:简述前馈神经网络和递归神经网络、怎样搭建一个递归神经网络对时间系列数据进行异常检测。为了让我们的讨论更加具体化,我们将演示一下怎么用Deeplearning4j搭建神经网络。
一、什么是神经网络?
人工神经网络算法的最初构思是模仿生物神经元。但是这个类比很不可靠。人工神经网络的每一个特征都是对生物神经元的一种折射:每一个节点与激活阈值、触发的连接。
连接人工神经元系统建立起来之后,我们就能够对这些系统进行训练,从而让他们学习到数据中的一些模式,学到之后就能执行回归、分类、聚类、预测等功能。
人工神经网络可以看作是计算节点的集合。数据通过这些节点进入神经网络的输入层,再通过神经网络的隐藏层直到关于数据的一个结论或者结果出现,这个过程才会停止。神经网络产出的结果会跟预期的结果进行比较,神经网络得出的结果与正确结果的不同点会被用来更正神经网络节点的激活阈值。随着这个过程的不断重复,神经网络的输出结果就会无限靠近预期结果。
二、训练过程
在搭建一个神经网络系统之前,你必须先了解训练的过程以及网络输出结果是怎么产生的。然而我们并不想过度深入的了解这些方程式,下面是一个简短的介绍。
网络的输入节点收到一个数值数组(或许是叫做张量多维度数组)就代表输入数据。例如, 图像中的每个像素可以表示为一个标量,然后将像素传递给一个节点。输入数据将会与神经网络的参数相乘,这个输入数据被扩大还是减小取决于它的重要性,换句话说,取决于这个像素就不会影响神经网络关于整个输入数据的结论。
起初这些参数都是随机的,也就是说神经网络在建立初期根本就不了解数据的结构。每个节点的激活函数决定了每个输入节点的输出结果。所以每个节点是否能够被激活取决于它是否接受到足够的刺激强度,即是否输入数据和参数的结果超出了激活阈值的界限。
在所谓的密集或完全连接层中,每个节点的输出值都会传递给后续层的节点,在通过所有隐藏层后最终到达输出层,也就是产生输入结果的地方。在输出层, 神经网络得到的最终结论将会跟预期结论进行比较(例如,中的这些像素代表一只猫还是狗)。神经网络猜测的结果与正确结果的计算误差都会被纳入到一个测试集中,神经网络又会利用这些计算误差来不断更新参数,以此来改变中不同像素的重要程度。整个过程的目的就是降低输出结果与预期结果的误差,正确地标注出这个图像到底是不是一条狗。
深度学习是一个复杂的过程,由于大量的矩阵系数需要被修改所以它就涉及到矩阵代数、衍生品、概率和密集的硬件使用问题,但是用户不需要全部了解这些复杂性。
但是,你也应该知道一些基本参数,这将帮助你理解神经网络函数。这其中包括激活函数、优化算法和目标函数(也称为损失、成本或误差函数)。
激活函数决定了信号是否以及在多大程度上应该被发送到连接节点。阶梯函数是最常用的激活函数, 如果其输入小于某个阈值就是0,如果其输入大于阈值就是1。节点都会通过阶梯激活函数向连接节点发送一个0或1。优化算法决定了神经网络怎么样学习,以及测试完误差后,权重怎么样被更准确地调整。最常见的优化算法是随机梯度下降法。最后, 成本函数常用来衡量误差,通过对比一个给定训练样本中得出的结果与预期结果的不同来评定神经网络的执行效果。
Keras、Deeplearning4j 等开源框架让创建神经网络变得简单。创建神经网络结构时,需要考虑的是怎样将你的数据类型匹配到一个已知的被解决的问题,并且根据你的实际需求来修改现有结构。
三、神经网络的类型以及应用
神经网络已经被了解和应用了数十年了,但是最近的一些技术趋势才使得深度神经网络变得更加高效。
GPUs使得矩阵 *** 作速度更快;分布式计算结构让计算能力大大增强;多个超参数的组合也让迭代的速度提升。所有这些都让训练的速度大大加快,迅速找到适合的结构。
随着更大数据集的产生,类似于ImageNet 的大型高质量的标签数据集应运而生。机器学习算法训练的数据越大,那么它的准确性就会越高。
最后,随着我们理解能力以及神经网络算法的不断提升,神经网络的准确性在语音识别、机器翻译以及一些机器感知和面向目标的一些任务等方面不断刷新记录。
尽管神经网络架构非常的大,但是主要用到的神经网络种类也就是下面的几种。
31前馈神经网络
前馈神经网络包括一个输入层、一个输出层以及一个或多个的隐藏层。前馈神经网络可以做出很好的通用逼近器,并且能够被用来创建通用模型。
这种类型的神经网络可用于分类和回归。例如,当使用前馈网络进行分类时,输出层神经元的个数等于类的数量。从概念上讲, 激活了的输出神经元决定了神经网络所预测的类。更准确地说, 每个输出神经元返回一个记录与分类相匹配的概率数,其中概率最高的分类将被选为模型的输出分类。
前馈神经网络的优势是简单易用,与其他类型的神经网络相比更简单,并且有一大堆的应用实例。
32卷积神经网络
卷积神经网络和前馈神经网络是非常相似的,至少是数据的传输方式类似。他们结构大致上是模仿了视觉皮层。卷积神经网络通过许多的过滤器。这些过滤器主要集中在一个图像子集、补丁、图块的特征识别上。每一个过滤器都在寻找不同模式的视觉数据,例如,有的可能是找水平线,有的是找对角线,有的是找垂直的。这些线条都被看作是特征,当过滤器经过图像时,他们就会构造出特征图谱来定位各类线是出现在图像的哪些地方。图像中的不同物体,像猫、747s、榨汁机等都会有不同的图像特征,这些图像特征就能使图像完成分类。卷积神经网络在图像识别和语音识别方面是非常的有效的。
卷积神经网络与前馈神经网络在图像识别方面的异同比较。虽然这两种网络类型都能够进行图像识别,但是方式却不同。卷积神经网络是通过识别图像的重叠部分,然后学习识别不同部分的特征进行训练;然而,前馈神经网络是在整张上进行训练。前馈神经网络总是在的某一特殊部分或者方向进行训练,所以当的特征出现在其他地方时就不会被识别到,然而卷积神经网络却能够很好的避免这一点。
卷积神经网络主要是用于图像、视频、语音、声音识别以及无人驾驶的任务。尽管这篇文章主要是讨论递归神经网络的,但是卷积神经网络在图像识别方面也是非常有效的,所以很有必要了解。
33递归神经网络
与前馈神经网络不同的是,递归神经网络的隐藏层的节点里有内部记忆存储功能,随着输入数据的改变而内部记忆内容不断被更新。递归神经网络的结论都是基于当前的输入和之前存储的数据而得出的。递归神经网络能够充分利用这种内部记忆存储状态处理任意序列的数据,例如时间序列。
递归神经网络经常用于手写识别、语音识别、日志分析、欺诈检测和网络安全。
递归神经网络是处理时间维度数据集的最好方法,它可以处理以下数据:网络日志和服务器活动、硬件或者是医疗设备的传感器数据、金融交易、电话记录。想要追踪数据在不同阶段的依赖和关联关系需要你了解当前和之前的一些数据状态。尽管我们通过前馈神经网络也可以获取事件,随着时间的推移移动到另外一个事件,这将使我们限制在对事件的依赖中,所以这种方式很不灵活。
追踪在时间维度上有长期依赖的数据的更好方法是用内存来储存重要事件,以使近期事件能够被理解和分类。递归神经网络最好的一点就是在它的隐藏层里面有“内存”可以学习到时间依赖特征的重要性。
接下来我们将讨论递归神经网络在字符生成器和网络异常检测中的应用。递归神经网络可以检测出不同时间段的依赖特征的能力使得它可以进行时间序列数据的异常检测。
递归神经网络的应用
网络上有很多使用RNNs生成文本的例子,递归神经网络经过语料库的训练之后,只要输入一个字符,就可以预测下一个字符。下面让我们通过一些实用例子发现更多RNNs的特征。
应用一、RNNs用于字符生成
递归神经网络经过训练之后可以把英文字符当做成一系列的时间依赖事件。经过训练后它会学习到一个字符经常跟着另外一个字符(“e”经常跟在“h”后面,像在“the、he、she”中)。由于它能预测下一个字符是什么,所以它能有效地减少文本的输入错误。
Java是个很有趣的例子,因为它的结构包括很多嵌套结构,有一个开的圆括号必然后面就会有一个闭的,花括号也是同理。他们之间的依赖关系并不会在位置上表现的很明显,因为多个事件之间的关系不是靠所在位置的距离确定的。但是就算是不明确告诉递归神经网络Java中各个事件的依赖关系,它也能自己学习了解到。
在异常检测当中,我们要求神经网络能够检测出数据中相似、隐藏的或许是并不明显的模式。就像是一个字符生成器在充分地了解数据的结构后就会生成一个数据的拟像,递归神经网络的异常检测就是在其充分了解数据结构后来判断输入的数据是不是正常。
字符生成的例子表明递归神经网络有在不同时间范围内学习到时间依赖关系的能力,它的这种能力还可以用来检测网络活动日志的异常。
异常检测能够使文本中的语法错误浮出水面,这是因为我们所写的东西是由语法结构所决定的。同理,网络行为也是有结构的,它也有一个能够被学习的可预测模式。经过在正常网络活动中训练的递归神经网络可以监测到入侵行为,因为这些入侵行为的出现就像是一个句子没有标点符号一样异常。
应用二、一个网络异常检测项目的示例
假设我们想要了解的网络异常检测就是能够得到硬件故障、应用程序失败、以及入侵的一些信息。
模型将会向我们展示什么呢?
随着大量的网络活动日志被输入到递归神经网络中去,神经网络就能学习到正常的网络活动应该是什么样子的。当这个被训练的网络被输入新的数据时,它就能偶判断出哪些是正常的活动,哪些是被期待的,哪些是异常的。
训练一个神经网络来识别预期行为是有好处的,因为异常数据不多,或者是不能够准确的将异常行为进行分类。我们在正常的数据里进行训练,它就能够在未来的某个时间点提醒我们非正常活动的出现。
说句题外话,训练的神经网络并不一定非得识别到特定事情发生的特定时间点(例如,它不知道那个特殊的日子就是周日),但是它一定会发现一些值得我们注意的一些更明显的时间模式和一些可能并不明显的事件之间的联系。
我们将概述一下怎么用 Deeplearning4j(一个在JVM上被广泛应用的深度学习开源数据库)来解决这个问题。Deeplearning4j在模型开发过程中提供了很多有用的工具:DataVec是一款为ETL(提取-转化-加载)任务准备模型训练数据的集成工具。正如Sqoop为Hadoop加载数据,DataVec将数据进行清洗、预处理、规范化与标准化之后将数据加载到神经网络。这跟Trifacta’s Wrangler也相似,只不过它更关注二进制数据。
开始阶段
第一阶段包括典型的大数据任务和ETL:我们需要收集、移动、储存、准备、规范化、矢量话日志。时间跨度的长短是必须被规定好的。数据的转化需要花费一些功夫,这是由于JSON日志、文本日志、还有一些非连续标注模式都必须被识别并且转化为数值数组。DataVec能够帮助进行转化和规范化数据。在开发机器学习训练模型时,数据需要分为训练集和测试集。
训练神经网络
神经网络的初始训练需要在训练数据集中进行。
在第一次训练的时候,你需要调整一些超参数以使模型能够实现在数据中学习。这个过程需要控制在合理的时间内。关于超参数我们将在之后进行讨论。在模型训练的过程中,你应该以降低错误为目标。
但是这可能会出现神经网络模型过度拟合的风险。有过度拟合现象出现的模型往往会在训练集中的很高的分数,但是在遇到新的数据时就会得出错误结论。用机器学习的语言来说就是它不够通用化。Deeplearning4J提供正则化的工具和“过早停止”来避免训练过程中的过度拟合。
神经网络的训练是最花费时间和耗费硬件的一步。在GPUs上训练能够有效的减少训练时间,尤其是做图像识别的时候。但是额外的硬件设施就带来多余的花销,所以你的深度学习的框架必须能够有效的利用硬件设施。Azure和亚马逊等云服务提供了基于GPU的实例,神经网络还可以在异构集群上进行训练。
创建模型
Deeplearning4J提供ModelSerializer来保存训练模型。训练模型可以被保存或者是在之后的训练中被使用或更新。
在执行异常检测的过程中,日志文件的格式需要与训练模型一致,基于神经网络的输出结果,你将会得到是否当前的活动符合正常网络行为预期的结论。
代码示例
递归神经网络的结构应该是这样子的:
MultiLayerConfiguration conf = new NeuralNetConfigurationBuilder(
seed(123)
optimizationAlgo(OptimizationAlgorithmSTOCHASTIC_GRADIENT_DESCENT)iterations(1)
weightInit(WeightInitXAVIER)
updater(UpdaterNESTEROVS)momentum(09)
learningRate(0005)
gradientNormalization(GradientNormalizationClipElementWiseAbsoluteValue)
gradientNormalizationThreshold(05)
list()
layer(0, new GravesLSTMBuilder()activation("tanh")nIn(1)nOut(10)build())
layer(1, new RnnOutputLayerBuilder(LossFunctionsLossFunctionMCXENT)
activation("softmax")nIn(10)nOut(numLabelClasses)build())
pretrain(false)backprop(true)build();
MultiLayerNetwork net = new MultiLayerNetwork(conf);
netinit();
下面解释一下几行重要的代码:
seed(123)
随机设置一个种子值对神经网络的权值进行初始化,以此获得一个有复验性的结果。系数通常都是被随机的初始化的,以使我们在调整其他超参数时仍获得一致的结果。我们需要设定一个种子值,让我们在调整和测试的时候能够用这个随机的权值。
optimizationAlgo(OptimizationAlgorithmSTOCHASTIC_GRADIENT_DESCENT)iterations(1)
决定使用哪个最优算法(在这个例子中是随机梯度下降法)来调整权值以提高误差分数。你可能不需要对这个进行修改。
learningRate(0005)
当我们使用随机梯度下降法的时候,误差梯度就被计算出来了。在我们试图将误差值减到最小的过程中,权值也随之变化。SGD给我们一个让误差更小的方向,这个学习效率就决定了我们该在这个方向上迈多大的梯度。如果学习效率太高,你可能是超过了误差最小值;如果太低,你的训练可能将会永远进行。这是一个你需要调整的超参数。
design consideration
[英][diˈzain kənˌsidəˈreiʃən][美][dɪˈzaɪn kənˌsɪdəˈreʃən]
设计根据;
网络
设计考虑;
双语例句
1
Normalization is an essential design consideration for database schemas
规格化对于数据库格式设计来说是一个重要的设计考虑。
2
The design consideration of high power and high frequency Magnetically insulated Transmission Line Oscillator ( MILO) was made
初步考虑了高频率与高功率的磁绝缘线振荡器的设计问题。
DNA微阵列 (DNA Microarrays)技术/基因芯片(Genechip)技术是一种在上世纪80年代开始研制,90年代成熟和推广并得到广泛应用的生物学检测技术。目前英文中大多使用DNA微阵列(DNA Microarrays)来表示基因芯片,而Genechip已经被美国昂飞(Affymetrix)公司申请商用专利。
DNA微阵列(基因芯片)技术的出现是生物学相关领域的一个里程碑事件。它使得生物学、医学等领域研究快速发展,与之相关的科学论文数以万记(未统计具体数字,表示很多的意思)。而且,这项产生于上个世纪的基因芯片技术目前仍然是生物科学领域最具应用价值的技术之一(80年代-克隆,90年代-PCR,21世纪-芯片)。
DNA微阵列(基因芯片)技术和传统的Southern杂交、Northern杂交等技术一样,均基于核酸之间的互补结合特性开发,但是传统技术只能针对单个基因来分析,而微阵列技术则开启了高通量模式。
如果是第一次接触这个概念,你可以先简单的把微阵列理解成是一种和计算机芯片(如中央处理器,Central Processing Unit,CPU)在体积上类似(都很小),并主要用于定性或定量测定生命体内物质的检测技术。区别在于微阵列(如DNA Microarrays)并不能用来进行加减乘除等数学运算,而CPU可以)。
所涉及的名词和技术
如果你有知识体系构建的习惯,可以将这次所要学习的内容大致与以下名词做一些关联:
生物学
生物学过程
基因及其产物
标记、杂交以及显微成像技术
定性和定量检测技术
计算机自动处理技术
相关知识所依赖的场所:
生物体内(in vivo)
生物体外(in vitro)
计算机内(in silico)
学习它的重要性
如果你参加过与生物信息学相关的培训或者导读课程,就会知道,DNA微阵列(基因芯片)技术常常是作为这些课程的必修内容之一。
通过学习DNA微阵列(基因芯片)技术的相关概念、基本原理、数据分析方法及其注意事项,将是你入门生物信息学的最好的一次机会。
了解芯片技术有助于大家进一步学习生物信息学涉及到的其他新型技术,比如全外显子测序和靶向测序、全基因组测序、全转录组测序、单细胞测序等。
在学习相关的数据分析过程中,你将会积累一部分编程经验(如R和Bash),这对于以后熟练掌握编程技术也非常有意义。而编程技术的掌握与否则是衡量一个人生物信息学入门的最基本的指标之一。
掌握它之后,你可以利用公共芯片数据进行数据挖掘,用于验证你de想法或者发现新的知识。你现在可以搜索一下GEO(Gene Expression Omnibus)中和微阵列(基因芯片)相关的数据,试着回答一下上面的数据都有哪些类型?
两个“简单”问题
生物和非生物体的主要区别在哪里?
生物体内的遗传信息传递依赖哪些物质?它的流动顺序是怎样的?
我建议在这里你可以稍微发动一下你的想象力,尽量基于你已有的知识或者凭空猜一猜看。
如果你已经有自己的答案或者实在想不出来则可以继续往下(这样会加深你对这两个问题的印象)。
生物和非生物体的主要区别在哪里?
生物的九大基本特征:
生物体具有严整的结构(细胞是生物体结构和功能的基本单位)。
生物体能进行新陈代谢。
生物体能生长。
生物体具有应激性。
生物体能生殖和发育。
生物体具有遗传和变异的特性。
生物体能在一定程度上适应环境并影响环境。
生物体能跟外界进行物质交换。
生物体可以呼吸。
自主阅读,并回答:
生物、细胞、遗传物质以及代谢产物之间的关系?
生物主要分为几大类?人属于哪一类?
真核生物和原核生物的区别有哪些?它们的遗传物质的种类是否相同?
病毒属不属于生物?它有没有遗传物质?如果它不属于生物,原因是什么?
微生物能不能呼吸?它的呼吸方式有哪些?
生物体内的遗传信息传递依赖哪些物质?它的流动顺序是怎样的?
这里要引入一个非常重要的概念:中心法则:生物体内的遗传信息沿着DNA-RNA-蛋白质轴流动,DNA->DNA:DNA复制,DNA->RNA:转录,RNA->RNA:RNA复制,RNA->DNA:逆转录,RNA->蛋白质:翻译。掌握这个生物体内的信息流动过程对于你理解基因芯片技术有重要帮助。
补充一点,以后你会经常碰到“扩增(amplification)”这个概念,其实它主要对应于中心法则中的DNA复制过程,如基因芯片技术大多有互补脱氧核糖核酸(complementary DNA,cDNA)的扩增步骤。
图一 真核生物的中心法则示意图(DNA,RNA和蛋白质)。
什么是微阵列?
微阵列的概念和方法(抗体微阵列,也称为抗体基质)最早由Tse Wen Chang于在1983年发表在《J Immunol Methods》的科学论文进行了论述。
微阵列主要是基于固体基质(通常是载玻片或硅薄膜)上的二维阵列,使得人们可以高通量地定性或定量的测定生物分子(如DNA、RNA、蛋白质等)。
图二 抗体微阵列示意图
微阵列的分类
微阵列主要类型包括:
Antibody microarrays
DNA microarrays:如cDNA微阵列, 寡核苷酸微阵列, BAC微阵列和SNP微阵列
MMChips, 用于检测microRNA
Protein microarrays
Peptide microarrays, 用于分析蛋白质-蛋白质相互作用
Tissue microarrays
Cellular microarrays,又称转染微阵列
Chemical compound microarrays
Glycan arrays (carbohydrate arrays)
Phenotype microarrays
Reverse phase protein lysate microarrays, microarrays of lysates or serum
Interferometric reflectance imaging sensor (IRIS)
这里可以看到,微阵列技术除了使用DNA、RNA、蛋白质,还可以使用其他诸如比DNA等大一点的组织、细胞,或者更小一点的肽、碳水化合物等物质。你需要记住的是DNA和RNA是基因芯片技术使用最多的两种物质,后面我们将对DNA微阵列(基因芯片)进行部分展开。如果想了解其他芯片技术,你可以快速地比较一下其他微阵列技术,如蛋白质微阵列和肽微阵列。
DNA微阵列(基因芯片)
DNA微阵列(基因芯片)是属于微阵列技术应用中的一种,主要是用于定性或定量测量存在于生物体内的核酸。其用于定性和定量的探针由数kb(cDNA芯片)或者几十个(寡核苷酸)特定类型的核苷酸所构成。该技术之所以可行的一个重要原理就是碱基之间的互补配对作用,以及互补的核苷酸单链间的杂交作用。
DNA微阵列(基因芯片)的发展历史
上个世纪80年代中期提出基因芯片的原型开始,因其依赖的相关技术还不成熟,基因芯片技术还一直处于实验室阶段,并未进行大规模商用。
1991年,美国的Affymetrix公司开始进一步对基因芯片技术进行研发。次年(1992年)Affymetrix公司制成了首张商业化寡核苷酸芯片,并使用前面提到的Genechip作为其基因芯片的商业名称。
1995年斯坦福大学的 Ron Davis and Pat Brown 实验室首次在《Science》杂志上发表基因表达谱芯片的论文之后,DNA微阵列即基因芯片技术开始迎来它的黄金发展期。
1996年,Affymetrix公司运用激光共聚焦及分子生物学技术研制出首块cDNA芯片,从此拉开了基因芯片技术研究与开发的帷幕,这一年也被称为基因芯片的元年。Affymetrix(昂飞),Agilent(安捷伦),Illumina等商业公司的成立对于基因芯片技术的进一步和大范围推广应用发挥了重要作用。
1998年,美国科学促进会将基因芯片技术列为年度自然科学领域十大进展之一,同年美国政府正式启动生物芯片计划。
2001年人类第一个基因组发布之后,随着二代测序技术时代的到来,在一部分生物检测领域(如基因表达谱分析)逐渐替代了基因芯片成为首选技术(如全转录组测序)。
2016年占据基因表达谱芯片市场绝大多数份额的美国Affymetrix(昂飞)公司被另一家美国公司赛默飞世尔科技(Thermo Fisher Scientific)以13亿美元的价格收购。
图三 Affymetrix(昂飞)基因芯片实物图
左:Human Genome U133 Plus 20 右:Mouse Genome 430 20
应用场景及其技术路线
来源:Wiki
扩展阅读:
Schena, M; Shalon, D; Davis, R W; Brown, P O (1995) "Quantitative Monitoring of Gene Expression Patterns with a Complementary DNA Microarray" Science 270 (5235): 467–70
cDNA基因芯片和寡核苷酸基因芯片
图四 基因芯片流程概览(一)
图五 基因芯片流程概览(二)
图六 基因芯片标记后核酸杂交示意图
图七 Affymetrix Human Genome U133A基因芯片示意图
Affymetrix 原位光刻技术
美国著名的Affymetrix公司率先开发了寡聚核苷酸原位光刻技术,并申请相关专利。它是生产高密度寡核苷酸基因芯片的核心关键技术。该技术的最大优点在于用很少的步骤可合成大量的DNA阵列(主要步骤:固基羟基化-光敏基团保护-避光膜透光聚合-光照活化-碱基结合-反应合成-不断循环)。Affymetrix的原位合成技术可制作的点阵密度高达10^6~10^10/cm^2。
图八 Affymetrix原位光刻技术示意图
Affymetrix PM-MM探针设计
采用PM-MM配对设计探针的目的是为了提高芯片技术检测结果的灵敏度和特异度。
Affymetrix在探讨了各种各样的影响因素后,设计出了一种独特的PM-MM探针方案。芯片上的每一个基因或EST都是由一个或几个探针组(probe set)组成,每组探针组又由11-20对25mer的探针对(probe pair)组成,每探针对包括两个探针池(probe cell),其中一个是完全匹配(Perfect-Match,PM)的,另外一个是序列中间有一个碱基错配的(Mis-match,MM)。
通过多个短核苷酸片段可以有效区分同源片段,避免了同源片段的结合导致的假阳性和错误。
一般使用25mer长度的寡核苷酸。因为在该长度下,信号强度和分辨率达到平衡,有一个碱基发生错配,杂交复合物就会变得很不稳定。如果长度达到60mer,就无法区分序列上十分接近的序列,即有错配碱基仍然会进行结合。
图九 Affymetrix PM-MM探针设计示意图
illumina BeadArray光纤微珠
Illumina的芯片产品采用了另外的一种技术:BeadArray光纤微珠。
图十 Illumina基因芯片的微珠结构:每个微珠上会连接100万个左右相同的探针
图十一 Illumina基因芯片Beadarry示意图
双通道和单通道
从双通道(cDNA芯片)到单通道(寡核苷酸芯片)是基因芯片技术发展进程中重要进步之一。
双通道主要用于cDNA芯片,即用两种荧光的比值反应基因表达水平(红色通道和绿色通道),比如处理前用一种荧光标记,处理后用另一种荧光标记,二者竞争性杂交。
单通道是指只用一种标记物标记,点的荧光强度可以反映基因表达水平,如寡核苷酸芯片Affymetrix。
标准化: 在芯片实验中,各个芯片的绝对光密度值是不一样的,在比较各个芯片结果之前必需将其归一化(normalization,也称作标准化)。在同一块芯片上杂交的、由不同荧光分子标记的两个样品间的数据即双通道数据,也需归一化。标准化的概念现在只要记住一点:在数据分析时需要利用某些算法对不同芯片或者同一芯片不同通道的数据进行统一,从而使其之间可以进行比较。
双通道到单通道数据的的标准化适用的标准化算法不完全一致。相关标准化算法资料可以在提供的后续阅读材料中获取。
依赖的其他技术
一项技术的产生,其往往依靠的是大量前期人们所积累的其他技术基础之上,这和一项科研成果大多需要基于前人的工作一样。基因芯片技术的产生也得益于其他相关技术的发明和发展。
PCR技术
上世纪80年代,在分子生物学领域有一个家喻户晓的技术被发明——-聚合酶链式反应(Polymerase Chain Reaction,PCR)。它可以以指数级别扩增特定DNA片段的单拷贝或几个拷贝,以产生数千至数百万拷贝的特定DNA序列。而在基因芯片进行样品检测时,常常需要将目标核酸进行大量扩增以使得其可以达到被检测的水平。以后你遇到的很多其他生物学检测技术(如高通量测序技术)也会常常用到这个技术。
PCR技术由Kary Mullis在1983年发明。10年之后的1993年,Kary Mullis和Michael Smith一起荣获当年诺贝尔化学奖,后者主要是奖励其发明的寡聚核苷酸定点诱变技术。
标记技术
除了PCR技术很重要之外,另一个也是基因芯片检测试验必不可少的:标记技术。目前在基因芯片产品中常用到的两种标记物:
荧光分子直接标记
生物素标记
通过标记物标记之后的核酸才有可能被我们的基因芯片仪器所检测到,后面的数据分析中定量分析,如确定基因表达水平的高低,也主要依靠的是标记物所产生的信号强弱来计算。
高精度机械臂
基因芯片和计算机芯片类似,都是在很小的容积内进行很多高精度 *** 作。特别是cDNA芯片,它需要先合成大量的长片段核酸,然后通过注射入芯片上相应的位置。
显微镜和光传感技术
单单只有标记好的核酸是产生不了数据的,需要一个扫描装置来将阵列上的斑点(核酸标记产生光的强弱变化)将光信号转变为电信号。而能够完成扫描工作的装置就是利用显微镜和光传感技术的各类显微镜。
激光扫描荧光显微镜
激光扫描共焦显微镜
CCD相机的荧光显微镜
这里强调一点:对于上世纪基因芯片技术广泛应用的最重要的显微镜类型是激光扫描共焦显微镜。激光扫描共焦显微镜与激光扫描荧光显微镜相比,尽管二者结构类似,但是前者可以在荧光标记分子与DNA芯片杂交的同时进行杂交信号的探测,而无须清洗掉未杂交分子,从而简化了 *** 作步骤大大提高了工作效率。
其他
扫描仪:用于检测和量化微阵列载玻片上斑点荧光强度的仪器,通过激光选择性激发荧光团并用滤光片(光学) 光电倍增管系统测量荧光。
通道:扫描仪中记录的荧光输出,用于单个荧光团,甚至可以是紫外线。
斑点或特征:阵列固相载体上的一个小区域,包含微量的特定DNA样本。
病例/对照:特别适用于双色阵列系统的实验设计范例,其中将选择作为对照的病症(例如健康组织或状态)与改变的病症(例如患病组织或状态)进行比较。
数据托管网站:目前最大的基因芯片数据存储仓库为美国国立卫生研究院(USA National Institutes of health,NIH)资助建立的Gene Expression Omnibus (GEO)数据库。
用到的文件格式:EXP:包含实验的基本信息,DAT:芯片的扫描图像,CEL: 特征的初始量化(每个探针的荧光强度),CDF:探针在芯片中的定位信息,探针到探针组的映射,CHP:包含基因表达水平(用affy软件评估)
探针注释文件:一个数据文件存储了基因探针(如1303_at)与人类可读的基因名字(如SH3BP2,SH3 Domain Binding Protein 2)间的对应关系
批次效应(batch effect):因试验或者数据分析引入的非生物学效应,即相同样品进行多次检验,结果出现差异,当差异程度较大时会影响最终的生物学结论(如这篇论文)。
数据下载工具:R包(GEOquery)
数据原始格式:CEL后缀文件(为探针检测数据,非基因表达值)。
数据分析工具:R包(affy,CLL,simpleaffy,affyPLM,gcrma,affycoretools,limma, annotate, hgu133plus2db, GOstats, GeneAnswers, gplots, pheatmap,clusterProfiler)
其他阅读资料
通过以上内容,我相信你对基因芯片技术已经有了一些初步的了解。如果你仍然感兴趣,或者希望进一步深入学习,你可能需要集中阅读大量相关资料(即主题阅读)。下面列出的一些链接,中文资料只简单在一些平台搜索了关键字,英文资料则进行了汇总。
开始阅读其它资料之前,你可以点击这里进行虚拟实验,体验你的第一次虚拟基因芯片实验 *** 作和数据分析(双通道芯片)。
以上就是关于深度机器学习中的batch的大小对学习效果有何影响全部的内容,包括:深度机器学习中的batch的大小对学习效果有何影响、请用两三句英语简单介绍一下下列课程(计算机课程)、如何在Caffe中配置每一个层的结构等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)