【深度学习系列】用PaddlePaddle和Tensorflow实现AlexNet

  上周我们用PaddlePaddle和Tensorflow实现了图像分类,分别用自己手写的一个简单的CNN网络simple_cnn和LeNet-5的CNN网络识别cifar-10数据集。在上周的实验表现中,经过200次迭代后的LeNet-5的准确率为60%左右,这个结果差强人意,毕竟是二十年前写的网络结构,结果简单,层数也很少,这一节中我们讲讲在2012年的Image比赛中大放异彩的AlexNet,并用AlexNet对cifar-10数据进行分类,对比上周的LeNet-5的效果。



什么是AlexNet?

  AlexNet在ILSVRC-2012的比赛中获得top5错误率15.3%的突破(第二名为26.2%),其原理来源于2012年Alex的论文《ImageNet Classification with Deep Convolutional Neural Networks》,这篇论文是深度学习火爆发展的一个里程碑和分水岭,加上硬件技术的发展,深度学习还会继续火下去。



AlexNet网络结构

  由于受限于当时的硬件设备,AlexNet在GPU粒度都做了设计,当时的GTX 580只有3G显存,为了能让模型在大量数据上跑起来,作者使用了两个GPU并行,并对网络结构做了切分,如下:

  网络结构

  Input输入层

输入为224×224×3的三通道RGB图像,为方便后续计算,实际操作中通过padding做预处理,把图像变成227×227×3。

  C1卷积层

该层由:卷积操作 + Max Pooling + LRN(后面详细介绍它)组成。

  • 卷积层:由96个feature map组成,每个feature map由11×11卷积核在stride=4下生成,输出feature map为55×55×48×2,其中55=(227-11)/4+1,48为分在每个GPU上的feature map数,2为GPU个数;
  • 激活函数:采用ReLU;
  • Max Pooling:采用stride=2且核大小为3×3(文中实验表明采用2×2的非重叠模式的Max Pooling相对更容易过拟合,在top 1和top 5下的错误率分别高0.4%和0.3%),输出feature map为27×27×48×2,其中27=(55-3)/2+1,48为分在每个GPU上的feature map数,2为GPU个数;
  • LRN:邻居数设置为5做归一化。

最终输出数据为归一化后的:27×27×48×2。

   C2卷积层

该层由:卷积操作 + Max Pooling + LRN组成

  • 卷积层:由256个feature map组成,每个feature map由5×5卷积核在stride=1下生成,为使输入和卷积输出大小一致,需要做参数为2的padding,输出feature map为27×27×128×2,其中27=(27-5+2×2)/1+1,128为分在每个GPU上的feature map数,2为GPU个数;
  • 激活函数:采用ReLU;
  • Max Pooling:采用stride=2且核大小为3×3,输出feature map为13×13×128×2,其中13=(27-3)/2+1,128为分在每个GPU上的feature map数,2为GPU个数;
  • LRN:邻居数设置为5做归一化。

最终输出数据为归一化后的:13×13×128×2。

  C3卷积层

该层由:卷积操作 + LRN组成(注意,没有Pooling层)

  • 输入为13×13×256,因为这一层两个GPU会做通信(途中虚线交叉部分)
  • 卷积层:之后由384个feature map组成,每个feature map由3×3卷积核在stride=1下生成,为使输入和卷积输出大小一致,需要做参数为1的padding,输出feature map为13×13×192×2,其中13=(13-3+2×1)/1+1,192为分在每个GPU上的feature map数,2为GPU个数;
  • 激活函数:采用ReLU;

最终输出数据为归一化后的:13×13×192×2。

  C4卷积层

该层由:卷积操作 + LRN组成(注意,没有Pooling层)

  • 卷积层:由384个feature map组成,每个feature map由3×3卷积核在stride=1下生成,为使输入和卷积输出大小一致,需要做参数为1的padding,输出feature map为13×13×192×2,其中13=(13-3+2×1)/1+1,192为分在每个GPU上的feature map数,2为GPU个数;
  • 激活函数:采用ReLU;

最终输出数据为归一化后的:13×13×192×2。

  C5卷积层

该层由:卷积操作 + Max Pooling组成

  • 卷积层:由256个feature map组成,每个feature map由3×3卷积核在stride=1下生成,为使输入和卷积输出大小一致,需要做参数为1的padding,输出feature map为13×13×128×2,其中13=(13-3+2×1)/1+1,128为分在每个GPU上的feature map数,2为GPU个数;
  • 激活函数:采用ReLU;
  • Max Pooling:采用stride=2且核大小为3×3,输出feature map为6×6×128×2,其中6=(13-3)/2+1,128为分在每个GPU上的feature map数,2为GPU个数.

最终输出数据为归一化后的:6×6×128×2。

  F6全连接层

该层为全连接层 + Dropout

  • 使用4096个节点;
  • 激活函数:采用ReLU;
  • 采用参数为0.5的Dropout操作

最终输出数据为4096个神经元节点。

  F7全连接层

该层为全连接层 + Dropout

  • 使用4096个节点;
  • 激活函数:采用ReLU;
  • 采用参数为0.5的Dropout操作

最终输出为4096个神经元节点。

  输出层

该层为全连接层 + Softmax

  • 使用1000个输出的Softmax

最终输出为1000个分类。



 AlexNet的优势

  1.使用了ReLu激活函数

  ----原始Relu-----

  AlexNet引入了ReLU激活函数,这个函数是神经科学家Dayan、Abott在《Theoretical Neuroscience》一书中提出的更精确的激活模型。原始的Relu激活函数(可参见 Hinton论文:《Rectified Linear Units Improve Restricted Boltzmann Machines》)我们比较熟悉,即$max(0,x)$,这个激活函数把负激活全部清零(模拟上面提到的稀疏性),这种做法在实践中即保留了神经网络的非线性能力,又加快了训练速度。 
但是这个函数也有缺点:

  • 在原点不可微 
    反向传播的梯度计算中会带来麻烦,所以Charles Dugas等人又提出Softplus来模拟上述ReLu函数(可视作其平滑版):

$$f(x)=log(1+e^x)$$

实际上它的导数就是一个

\begin{equation}
f‘(x)=\frac{1}{1+e^{-x}}
\end{equation}

  • 过稀疏性

    当学习率设置不合理时,即使是一个很大的梯度,在经过ReLu单元并更新参数后该神经元可能永不被激活。

   ----Leaky ReLu---- 

  为了解决上述过稀疏性导致的大量神经元不被激活的问题,Leaky ReLu被提了出来:

\begin{equation}
f(x)=\left\{
\begin{aligned}
ax(x<0) \\
x(x>=0)
\end{aligned}
\right.
\end{equation}

   其中$\alpha$是人工制定的较小值(如:0.1),它一定程度保留了负激活信息。

  还有很多其他的对于ReLu函数的改进,如Parametric ReLu,Randomized ReLu等,此处就不再展开讲了。

  2.Local Response Normalization 局部响应均值

  LRN利用相邻feature map做特征显著化,文中实验表明可以降低错误率,公式如下:

$$b^i_{x,y}=\frac{a^i_{x,y}}{(k+\alpha \cdot \sum^{min(N-1,i+n/2)}_{j=max(0,i-n/2)}(a^i_{x,y})^2)^\beta}$$

  公式的直观解释如下:

  由于 $\alpha$都是经过了RELU的输出,所以一定是大于0的,函数$\frac{1}{(k+\alpha \sum x^2)^\beta}$,取文中参数的图像如下(横坐标为$\sum x^2$):

  • 当$\sum x^2$值较小时,即当前节点和其邻居节点输出值差距不明显且大家的输出值都不太大,可以认为此时特征间竞争激烈,该函数可以使原本差距不大的输出产生显著性差异且此时函数输出不饱和
  • 当$\sum x^2$ 值较大时,说明特征本身有显著性差别但输出值太大容易过拟合,该函数可以令最终输出接近0从而缓解过拟合提高了模型泛化性。

  3.Dropout

  Dropout是文章亮点之一,属于提高模型泛化性的方法,操作比较简单,以一定概率随机让某些神经元输出设置为0,既不参与前向传播也不参与反向传播,也可以从正则化角度去看待它。(关于深度学习的正则化年初的时候在公司做过一个分享,下次直接把pdf放出来)

  从模型集成的角度来看:

  

  无Dropout网络: 

$$Y^n=W^nX^{n-1}$$
$$X^n=F(Y^n)$$

  有Dropout网络:

$$Y^n=W^nX^{n-1}$$
$$d^{n-1}\sim Bernoulli(p)$$
$$X^n = d^{n-1} \odot F(Y^n)$$

   其中$p$为Dropout的概率(如p=0.5,即让50%的神经元随机失活),$n$为所在的层。

  它是极端情况下的Bagging,由于在每步训练中,神经元会以某种概率随机被置为无效,相当于是参数共享的新网络结构,每个模型为了使损失降低会尽可能学最“本质”的特征,“本质”可以理解为由更加独立的、和其他神经元相关性弱的、泛化能力强的神经元提取出来的特征;而如果采用类似SGD的方式训练,每步迭代都会选取不同的数据集,这样整个网络相当于是用不同数据集学习的多个模型的集成组合。



用PaddlePaddle实现AlexNet

  1.网络结构(alexnet.py)

  这次我写了两个alextnet,一个加上了局部均值归一化LRN,一个没有加LRN,对比效果如何

 1 #coding:utf-8
 2 ‘‘‘
 3 Created by huxiaoman 2017.12.5
 4 alexnet.py:alexnet网络结构
 5 ‘‘‘
 6
 7 import paddle.v2 as paddle
 8 import os
 9
10 with_gpu = os.getenv(‘WITH_GPU‘, ‘0‘) != ‘1‘
11
12 def alexnet_lrn(img):
13     conv1 = paddle.layer.img_conv(
14         input=img,
15         filter_size=11,
16         num_channels=3,
17         num_filters=96,
18         stride=4,
19         padding=1)
20     cmrnorm1 = paddle.layer.img_cmrnorm(
21         input=conv1, size=5, scale=0.0001, power=0.75)
22     pool1 = paddle.layer.img_pool(input=cmrnorm1, pool_size=3, stride=2)
23
24     conv2 = paddle.layer.img_conv(
25         input=pool1,
26         filter_size=5,
27         num_filters=256,
28         stride=1,
29         padding=2,
30         groups=1)
31     cmrnorm2 = paddle.layer.img_cmrnorm(
32         input=conv2, size=5, scale=0.0001, power=0.75)
33     pool2 = paddle.layer.img_pool(input=cmrnorm2, pool_size=3, stride=2)
34
35     pool3 = paddle.networks.img_conv_group(
36         input=pool2,
37         pool_size=3,
38         pool_stride=2,
39         conv_num_filter=[384, 384, 256],
40         conv_filter_size=3,
41         pool_type=paddle.pooling.Max())
42
43     fc1 = paddle.layer.fc(
44         input=pool3,
45         size=4096,
46         act=paddle.activation.Relu(),
47         layer_attr=paddle.attr.Extra(drop_rate=0.5))
48     fc2 = paddle.layer.fc(
49         input=fc1,
50         size=4096,
51         act=paddle.activation.Relu(),
52         layer_attr=paddle.attr.Extra(drop_rate=0.5))
53     return fc2
54
55 def alexnet(img):
56     conv1 = paddle.layer.img_conv(
57         input=img,
58         filter_size=11,
59         num_channels=3,
60         num_filters=96,
61         stride=4,
62         padding=1)
63     cmrnorm1 = paddle.layer.img_cmrnorm(
64         input=conv1, size=5, scale=0.0001, power=0.75)
65     pool1 = paddle.layer.img_pool(input=cmrnorm1, pool_size=3, stride=2)
66
67     conv2 = paddle.layer.img_conv(
68         input=pool1,
69         filter_size=5,
70         num_filters=256,
71         stride=1,
72         padding=2,
73         groups=1)
74     cmrnorm2 = paddle.layer.img_cmrnorm(
75         input=conv2, size=5, scale=0.0001, power=0.75)
76     pool2 = paddle.layer.img_pool(input=cmrnorm2, pool_size=3, stride=2)
77
78     pool3 = paddle.networks.img_conv_group(
79         input=pool2,
80         pool_size=3,
81         pool_stride=2,
82         conv_num_filter=[384, 384, 256],
83         conv_filter_size=3,
84         pool_type=paddle.pooling.Max())
85
86     fc1 = paddle.layer.fc(
87         input=pool3,
88         size=4096,
89         act=paddle.activation.Relu(),
90         layer_attr=paddle.attr.Extra(drop_rate=0.5))
91     fc2 = paddle.layer.fc(
92         input=fc1,
93         size=4096,
94         act=paddle.activation.Relu(),
95         layer_attr=paddle.attr.Extra(drop_rate=0.5))
96     return fc3

  2.训练代码(train_alexnet.py

  1 #coding:utf-8
  2 ‘‘‘
  3 Created by huxiaoman 2017.12.5
  4 train_alexnet.py:训练alexnet对cifar10数据集进行分类
  5 ‘‘‘
  6
  7 import sys, os
  8 import paddle.v2 as paddle
  9
 10 #alex模型为不带LRN的
 11 from alexnet import alexnet
 12 #alexnet_lrn为带有lrn的
 13 #from alextnet import alexnet_lrn
 14 with_gpu = os.getenv(‘WITH_GPU‘, ‘0‘) != ‘1‘
 15
 16
 17 def main():
 18     datadim = 3 * 32 * 32
 19     classdim = 10
 20
 21     # PaddlePaddle init
 22     paddle.init(use_gpu=with_gpu, trainer_count=7)
 23
 24     image = paddle.layer.data(
 25         name="image", type=paddle.data_type.dense_vector(datadim))
 26
 27     # Add neural network config
 28     # option 1. resnet
 29     # net = resnet_cifar10(image, depth=32)
 30     # option 2. vgg
 31     #net = alexnet_lrn(image)
 32     net = alexnet(image)
 33     out = paddle.layer.fc(
 34         input=net, size=classdim, act=paddle.activation.Softmax())
 35
 36     lbl = paddle.layer.data(
 37         name="label", type=paddle.data_type.integer_value(classdim))
 38     cost = paddle.layer.classification_cost(input=out, label=lbl)
 39
 40     # Create parameters
 41     parameters = paddle.parameters.create(cost)
 42
 43     # Create optimizer
 44     momentum_optimizer = paddle.optimizer.Momentum(
 45         momentum=0.9,
 46         regularization=paddle.optimizer.L2Regularization(rate=0.0002 * 128),
 47         learning_rate=0.1 / 128.0,
 48         learning_rate_decay_a=0.1,
 49         learning_rate_decay_b=50000 * 100,
 50         learning_rate_schedule=‘discexp‘)
 51
 52     # End batch and end pass event handler
 53     def event_handler(event):
 54         if isinstance(event, paddle.event.EndIteration):
 55             if event.batch_id % 100 == 0:
 56                 print "\nPass %d, Batch %d, Cost %f, %s" % (
 57                     event.pass_id, event.batch_id, event.cost, event.metrics)
 58             else:
 59                 sys.stdout.write(‘.‘)
 60                 sys.stdout.flush()
 61         if isinstance(event, paddle.event.EndPass):
 62             # save parameters
 63             with open(‘params_pass_%d.tar‘ % event.pass_id, ‘w‘) as f:
 64                 parameters.to_tar(f)
 65
 66             result = trainer.test(
 67                 reader=paddle.batch(
 68                     paddle.dataset.cifar.test10(), batch_size=128),
 69                 feeding={‘image‘: 0,
 70                          ‘label‘: 1})
 71             print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics)
 72
 73     # Create trainer
 74     trainer = paddle.trainer.SGD(
 75         cost=cost, parameters=parameters, update_equation=momentum_optimizer)
 76
 77     # Save the inference topology to protobuf.
 78     inference_topology = paddle.topology.Topology(layers=out)
 79     with open("inference_topology.pkl", ‘wb‘) as f:
 80         inference_topology.serialize_for_inference(f)
 81
 82     trainer.train(
 83         reader=paddle.batch(
 84             paddle.reader.shuffle(
 85                 paddle.dataset.cifar.train10(), buf_size=50000),
 86             batch_size=128),
 87         num_passes=200,
 88         event_handler=event_handler,
 89         feeding={‘image‘: 0,
 90                  ‘label‘: 1})
 91
 92     # inference
 93     from PIL import Image
 94     import numpy as np
 95     import os
 96
 97     def load_image(file):
 98         im = Image.open(file)
 99         im = im.resize((32, 32), Image.ANTIALIAS)
100         im = np.array(im).astype(np.float32)
101         im = im.transpose((2, 0, 1))  # CHW
102         im = im[(2, 1, 0), :, :]  # BGR
103         im = im.flatten()
104         im = im / 255.0
105         return im
106
107     test_data = []
108     cur_dir = os.path.dirname(os.path.realpath(__file__))
109     test_data.append((load_image(cur_dir + ‘/image/dog.png‘), ))
110
111     probs = paddle.infer(
112         output_layer=out, parameters=parameters, input=test_data)
113     lab = np.argsort(-probs)  # probs and lab are the results of one batch data
114     print "Label of image/dog.png is: %d" % lab[0][0]
115
116
117 if __name__ == ‘__main__‘:
118     main()


用Tensorflow实现AlexNet

  1.网络结构

  1 def inference(images):
  2   ‘‘‘
  3   Alexnet模型
  4   输入:images的tensor
  5   返回:Alexnet的最后一层卷积层
  6   ‘‘‘
  7   parameters = []
  8   # conv1
  9   with tf.name_scope(‘conv1‘) as scope:
 10     kernel = tf.Variable(tf.truncated_normal([11, 11, 3, 64], dtype=tf.float32,
 11                                              stddev=1e-1), name=‘weights‘)
 12     conv = tf.nn.conv2d(images, kernel, [1, 4, 4, 1], padding=‘SAME‘)
 13     biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32),
 14                          trainable=True, name=‘biases‘)
 15     bias = tf.nn.bias_add(conv, biases)
 16     conv1 = tf.nn.relu(bias, name=scope)
 17     print_activations(conv1)
 18     parameters += [kernel, biases]
 19
 20   # lrn1
 21   with tf.name_scope(‘lrn1‘) as scope:
 22     lrn1 = tf.nn.local_response_normalization(conv1,
 23                                               alpha=1e-4,
 24                                               beta=0.75,
 25                                               depth_radius=2,
 26                                               bias=2.0)
 27
 28   # pool1
 29   pool1 = tf.nn.max_pool(lrn1,
 30                          ksize=[1, 3, 3, 1],
 31                          strides=[1, 2, 2, 1],
 32                          padding=‘VALID‘,
 33                          name=‘pool1‘)
 34   print_activations(pool1)
 35
 36   # conv2
 37   with tf.name_scope(‘conv2‘) as scope:
 38     kernel = tf.Variable(tf.truncated_normal([5, 5, 64, 192], dtype=tf.float32,
 39                                              stddev=1e-1), name=‘weights‘)
 40     conv = tf.nn.conv2d(pool1, kernel, [1, 1, 1, 1], padding=‘SAME‘)
 41     biases = tf.Variable(tf.constant(0.0, shape=[192], dtype=tf.float32),
 42                          trainable=True, name=‘biases‘)
 43     bias = tf.nn.bias_add(conv, biases)
 44     conv2 = tf.nn.relu(bias, name=scope)
 45     parameters += [kernel, biases]
 46   print_activations(conv2)
 47
 48   # lrn2
 49   with tf.name_scope(‘lrn2‘) as scope:
 50     lrn2 = tf.nn.local_response_normalization(conv2,
 51                                               alpha=1e-4,
 52                                               beta=0.75,
 53                                               depth_radius=2,
 54                                               bias=2.0)
 55
 56   # pool2
 57   pool2 = tf.nn.max_pool(lrn2,
 58                          ksize=[1, 3, 3, 1],
 59                          strides=[1, 2, 2, 1],
 60                          padding=‘VALID‘,
 61                          name=‘pool2‘)
 62   print_activations(pool2)
 63
 64   # conv3
 65   with tf.name_scope(‘conv3‘) as scope:
 66     kernel = tf.Variable(tf.truncated_normal([3, 3, 192, 384],
 67                                              dtype=tf.float32,
 68                                              stddev=1e-1), name=‘weights‘)
 69     conv = tf.nn.conv2d(pool2, kernel, [1, 1, 1, 1], padding=‘SAME‘)
 70     biases = tf.Variable(tf.constant(0.0, shape=[384], dtype=tf.float32),
 71                          trainable=True, name=‘biases‘)
 72     bias = tf.nn.bias_add(conv, biases)
 73     conv3 = tf.nn.relu(bias, name=scope)
 74     parameters += [kernel, biases]
 75     print_activations(conv3)
 76
 77   # conv4
 78   with tf.name_scope(‘conv4‘) as scope:
 79     kernel = tf.Variable(tf.truncated_normal([3, 3, 384, 256],
 80                                              dtype=tf.float32,
 81                                              stddev=1e-1), name=‘weights‘)
 82     conv = tf.nn.conv2d(conv3, kernel, [1, 1, 1, 1], padding=‘SAME‘)
 83     biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32),
 84                          trainable=True, name=‘biases‘)
 85     bias = tf.nn.bias_add(conv, biases)
 86     conv4 = tf.nn.relu(bias, name=scope)
 87     parameters += [kernel, biases]
 88     print_activations(conv4)
 89
 90   # conv5
 91   with tf.name_scope(‘conv5‘) as scope:
 92     kernel = tf.Variable(tf.truncated_normal([3, 3, 256, 256],
 93                                              dtype=tf.float32,
 94                                              stddev=1e-1), name=‘weights‘)
 95     conv = tf.nn.conv2d(conv4, kernel, [1, 1, 1, 1], padding=‘SAME‘)
 96     biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32),
 97                          trainable=True, name=‘biases‘)
 98     bias = tf.nn.bias_add(conv, biases)
 99     conv5 = tf.nn.relu(bias, name=scope)
100     parameters += [kernel, biases]
101     print_activations(conv5)
102
103   # pool5
104   pool5 = tf.nn.max_pool(conv5,
105                          ksize=[1, 3, 3, 1],
106                          strides=[1, 2, 2, 1],
107                          padding=‘VALID‘,
108                          name=‘pool5‘)
109   print_activations(pool5)
110
111   return pool5, parameters

  完整代码可见:alexnet_tf.py



实验结果对比

  三个代码跑完后,对比了一下实验结果,如图所示:

  可以看到,在batch_size,num_epochs,devices和thread数都相同的条件下,加了LRN的paddlepaddle版的alexnet网络结果效果最好,而时间最短的是不加LRN的alexnet,在时间和精度上都比较平均的是tensorflow版的alexnet,当然,tf版的同样加了LRN,所以LRN对于实验效果还是有一定提升的。



总结

  AlexNet在图像分类中是一个比较重要的网络,在学习的过程中不仅要学会写网络结构,知道每一层的结构,更重要的是得知道为什么要这样设计,这样设计有什么好处,如果对某些参数进行一些调整结果会有什么变化?为什么会产生这样的变化。在实际应用中,如果需要对网络结构做一些调整,应该如何调整使得网络更适合我们的实际数据?这些才是我们关心的。也是面试中常常会考察的点。昨天面试了一位工作五年的算法工程师,问道他在项目中用的模型是alexnet,对于alexnet的网络结构并不是非常清楚,如果要改网络结构也不知道如何改,这样其实不好,仅仅把模型跑通只是第一步,后续还有很多工作要做,这也是作为算法工程师的价值体现之一。本文对于alexnet的网络结构参考我之前的领导写的文章,如过有什么不懂的可以留言。

 ps:为了方便大家及时看到我的更新,我搞了一个公众号,以后文章会同步发布与公众号和博客园,这样大家就能及时收到通知啦,有不懂的问题也可以在公众号留言,这样我能够及时看到并回复。(公众号刚开始做,做的比较粗糙,后期会完善一点~~)可以通过扫下面的二维码或者直接搜公众号:CharlotteDataMining 就可以了,谢谢关注^_^

参考文献

1.AlexNet: http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf

时间: 2024-08-29 22:38:13

【深度学习系列】用PaddlePaddle和Tensorflow实现AlexNet的相关文章

使用腾讯云 GPU 学习深度学习系列之二:Tensorflow 简明原理【转】

转自:https://www.qcloud.com/community/article/598765?fromSource=gwzcw.117333.117333.117333 这是<使用腾讯云 GPU 学习深度学习>系列文章的第二篇,主要介绍了 Tensorflow 的原理,以及如何用最简单的Python代码进行功能实现.本系列文章主要介绍如何使用 腾讯云GPU服务器 进行深度学习运算,前面主要介绍原理部分,后期则以实践为主. 往期内容: 使用腾讯云 GPU 学习深度学习系列之一:传统机器学

【深度学习系列】PaddlePaddle之数据预处理

上篇文章讲了卷积神经网络的基本知识,本来这篇文章准备继续深入讲CNN的相关知识和手写CNN,但是有很多同学跟我发邮件或私信问我关于PaddlePaddle如何读取数据.做数据预处理相关的内容.网上看的很多教程都是几个常见的例子,数据集不需要自己准备,所以不需要关心,但是实际做项目的时候做数据预处理感觉一头雾水,所以我就写一篇文章汇总一下,讲讲如何用PaddlePaddle做数据预处理. PaddlePaddle的基本数据格式 根据官网的资料,总结出PaddlePaddle支持多种不同的数据格式,

【深度学习系列】关于PaddlePaddle的一些避“坑”技巧

最近除了工作以外,业余在参加Paddle的AI比赛,在用Paddle训练的过程中遇到了一些问题,并找到了解决方法,跟大家分享一下: PaddlePaddle的Anaconda的兼容问题 之前我是在服务器上安装的PaddlePaddle的gpu版本,我想把BROAD数据拷贝到服务器上面,结果发现我们服务器的22端口没开,不能用scp传上去,非常郁闷,只能在本地训练.本机mac的显卡是A卡,所以只能装cpu版本的,安装完以后,我发现运行一下程序的时候报错了: 1 import paddle.v2 a

基于TensorFlow的深度学习系列教程 2——常量Constant

前面介绍过了Tensorflow的基本概念,比如如何使用tensorboard查看计算图.本篇则着重介绍和整理下Constant相关的内容. 基于TensorFlow的深度学习系列教程 1--Hello World! 常量的概念 在tensorflow中,数据分为几种类型: 常量Constant.变量Variable.占位符Placeholder.其中: 常量:用于存储一些不变的数值,在计算图创建的时候,调用初始化方法时,直接保存在计算图中 变量:模型训练的参数,比如全连接里面的W和bias 占

深度学习系列(2) | Global Average Pooling是否可以替代全连接层?

深度学习系列 | Global Average Pooling是否可以替代全连接层? Global Average Pooling(简称GAP,全局池化层)技术最早提出是在这篇论文(第3.2节)中,被认为是可以替代全连接层的一种新技术.在keras发布的经典模型中,可以看到不少模型甚至抛弃了全连接层,转而使用GAP,而在支持迁移学习方面,各个模型几乎都支持使用Global Average Pooling和Global Max Pooling(GMP). 然而,GAP是否真的可以取代全连接层?其背

对比深度学习十大框架:TensorFlow 并非最好?

http://www.oschina.net/news/80593/deep-learning-frameworks-a-review-before-finishing-2016 TensorFlow 链接:https://www.tensorflow.org/ 对于那些听说过深度学习但还没有太过专门深入的人来说,TensorFlow 是他们最喜欢的深度学习框架,但在这里我要澄清一些事实. 在 TensorFlow 的官网上,它被定义为「一个用于机器智能的开源软件库」,但我觉得应该这么定义:Te

【深度学习系列1】 深度学习在腾讯的平台化和应用实践(转载)

转载:原文链接 [深度学习系列1] 深度学习在腾讯的平台化和应用实践 引言:深度学习是近年机器学习领域的重大突破,有着广泛的应用前景.随着Google公开 Google Brain计划,业界对深度学习的热情高涨.腾讯在深度学习领域持续投入,获得了实际落地的产出.我们准备了四篇文章,阐述深度学习的原理和在腾讯的实 践,介绍腾讯深度学习平台Mariana,本文为第一篇. 深度学习(Deep Learning)是近年来机器学习领域的热点,在语音识别.图像识别等领域均取得了突破性进展.腾讯提供广泛的互联

【深度学习系列3】 Mariana CNN并行框架与图像识别

[深度学习系列3] Mariana CNN并行框架与图像识别 本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框架. 将深度卷积神经网络(Convolutional Neural Networks, 简称CNNs)用于图像识别在研究领域吸引着越来越多目光.由于卷积神经网络结构非常适合模型并行的训练,因此以模型并行+数据并行的方式来加速Deep CNNs训练,可预期取得较大收获.Deep CNNs的单机多GPU

【深度学习系列4】深度学习及并行化实现概述

[深度学习系列4]深度学习及并行化实现概述 摘要: 深度学习可以完成需要高度抽象特征的人工智能任务,如语音识别.图像识别和检索.自然语言理解等.深层模型是包含多个隐藏层的人工神经网络,多层非线性结构使其具备强大的特征表达能力和对复杂任务建模能力.训练深层模型是长期以来的难题,近年来以层次化.逐层初始化为代表的一系列方法的提出给训练深层模型带来了希望,并在多个应用领域获得了成功.深层模型的并行化框架和训练加速方法是深度学习走向实用的重要基石,已有多个针对不同深度模型的开源实现,Google.Fac