深度学习——CNN(3)CNN-AlexNetCNN-GoogleNet其他网络结构

前言:前面介绍了最基本的Lenet,下面介绍几种其他的网络结构

CNN-AlexNet

网络结构如下图:

从图中可以看出,采用双gpu训练 增加LRN归一化层:本质上,这个层也是为了防止激活函数的饱和的。 采用dropout防止过拟合 基于AlexNet进行微调 ,诞生了ZF-net

CNN-GoogleNet

GoogLeNet借鉴了NIN的特性,在原先的卷积过程中附加了11的 卷积核加上ReLU激活。 这不仅仅提升了网络的深度,提高了representation power,而且 文中还通过11的卷积来进行降维,减少了更新参数量。

  • NIN模型 Network-in-Network主要思想是,用全连接的多层感知机去代替 传统的卷积过程,以获取特征更加全面的表达,同时,因为前面已 经做了提升特征表达的过程,传统CNN最后的全连接层也被替换为 一个全局平均池化层,因为作者认为此时的map已经具备分类足够 的可信度了,它可以直接通过softmax来计算loss了。

NIN模型

  • 在计算要求增加很多的地方应用维度缩减 和预测。即,在3x3和5x5的卷积前用一个1x1的卷积用于减少计算, 还用于修正线性激活。如下图所示,左边是加入维度缩减之前的, 右边是加入维度缩减之后的。

最终网络结构如下:

其他网络结构

还有VGG-net,RES-net等,结构都是在最基本的网络结构上进行改进,比如R esNet结构 使用了一种连接方式叫做“shortcut connection”,顾名思义, shortcut就是“抄近道”的意思。 参数更新用了RNN的思想

下面给一个CNN-VGGNet15层代码的示例,用来判断17种花的一个分类情况

def vgg_network(x, y):
    net1_kernel_size = 32
    net3_kernel_size = 64
    net5_kernal_size_1 = 128
    net5_kernal_size_2 = 128
    net7_kernal_size_1 = 256
    net7_kernal_size_2 = 256
    net9_kernal_size_1 = 256
    net9_kernal_size_2 = 256
    net11_unit_size = 1000
    net12_unit_size = 1000
    net13_unit_size = 17

    # cov3-64 lrn
    with tf.variable_scope('net1'):
        net = tf.nn.conv2d(x, filter=get_variable('w', [3, 3, 3, net1_kernel_size]), strides=[1, 1, 1, 1],
                           padding='SAME')
        net = tf.nn.bias_add(net, get_variable('b', [net1_kernel_size]))
        net = tf.nn.relu(net)
        # lrn(input, depth_radius=5, bias=1, alpha=1, beta=0.5, name=None)
        # 做一个局部响应归一化,是对卷积核的输出值做归一化
        # depth_radius ==> 对应ppt公式上的n,bias => 对应ppt公式上的k, alpha => 对应ppt公式上的α, beta=>对应ppt公式上的β
        net = tf.nn.lrn(net)
    # maxpool
    with tf.variable_scope('net2'):
        net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    # conv3-128
    with tf.variable_scope('net3'):
        net = tf.nn.conv2d(net, filter=get_variable('w', [3, 3, net1_kernel_size, net3_kernel_size]),
                           strides=[1, 1, 1, 1],
                           padding='SAME')
        net = tf.nn.bias_add(net, get_variable('b', [net3_kernel_size]))
        net = tf.nn.relu(net)
    # maxpool
    with tf.variable_scope('net4'):
        net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    # conv3-256 conv3-256
    with tf.variable_scope('net5'):
        net = tf.nn.conv2d(net, filter=get_variable('w1', [3, 3, net3_kernel_size, net5_kernal_size_1]),
                           strides=[1, 1, 1, 1],
                           padding='SAME')
        net = tf.nn.bias_add(net, get_variable('b1', [net5_kernal_size_1]))
        net = tf.nn.relu(net)

        net = tf.nn.conv2d(net, filter=get_variable('w2', [3, 3, net5_kernal_size_1, net5_kernal_size_2]),
                           strides=[1, 1, 1, 1],
                           padding='SAME')
        net = tf.nn.bias_add(net, get_variable('b2', [net5_kernal_size_2]))
        net = tf.nn.relu(net)
    # maxpool
    with tf.variable_scope('net6'):
        net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    # conv3-512 conv3-512
    with tf.variable_scope('net7'):
        net = tf.nn.conv2d(net, filter=get_variable('w1', [3, 3, net5_kernal_size_2, net7_kernal_size_1]),
                           strides=[1, 1, 1, 1],
                           padding='SAME')
        net = tf.nn.bias_add(net, get_variable('b1', [net7_kernal_size_1]))
        net = tf.nn.relu(net)

        net = tf.nn.conv2d(net, filter=get_variable('w2', [3, 3, net7_kernal_size_1, net7_kernal_size_2]),
                           strides=[1, 1, 1, 1],
                           padding='SAME')
        net = tf.nn.bias_add(net, get_variable('b2', [net7_kernal_size_2]))
        net = tf.nn.relu(net)
    # maxpool
    with tf.variable_scope('net8'):
        net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    # conv3-512 conv3-512
    with tf.variable_scope('net9'):
        net = tf.nn.conv2d(net, filter=get_variable('w1', [3, 3, net7_kernal_size_2, net9_kernal_size_1]),
                           strides=[1, 1, 1, 1],
                           padding='SAME')
        net = tf.nn.bias_add(net, get_variable('b1', [net9_kernal_size_1]))
        net = tf.nn.relu(net)

        net = tf.nn.conv2d(net, filter=get_variable('w2', [3, 3, net9_kernal_size_1, net9_kernal_size_2]),
                           strides=[1, 1, 1, 1],
                           padding='SAME')
        net = tf.nn.bias_add(net, get_variable('b2', [net9_kernal_size_2]))
        net = tf.nn.relu(net)
    # maxpool
    with tf.variable_scope('net10'):
        net = tf.nn.max_pool(net, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    # fc
    with tf.variable_scope('net11'):
        # 将四维的数据转换为两维的数据
        shape = net.get_shape()
        feature_number = shape[1] * shape[2] * shape[3]
        net = tf.reshape(net, shape=[-1, feature_number])
        # 全连接
        net = tf.add(tf.matmul(net, get_variable('w', [feature_number, net11_unit_size])),
                     get_variable('b', [net11_unit_size]))
    # fc
    with tf.variable_scope('net12'):
        # 全连接
        net = tf.add(tf.matmul(net, get_variable('w', [net11_unit_size, net12_unit_size])),
                     get_variable('b', [net12_unit_size]))
    # fc
    with tf.variable_scope('net13'):
        # 全连接
        net = tf.add(tf.matmul(net, get_variable('w', [net12_unit_size, net13_unit_size])),
                     get_variable('b', [net13_unit_size]))

    # softmax
    with tf.variable_scope('net14'):
        # softmax
        act = tf.nn.softmax(net)

    return act

详细代码见:https://github.com/dctongsheng/Lenet

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

一起读懂传说中的经典:受限玻尔兹曼机

1386
来自专栏智能算法

基于SURF算法相似图像相对位置的寻找

例如以下两个相似证件的模板,若以其中一幅图像为模板,并给出相应的位置,可以给出其他相似图像进行定位相对应的位置,如下图所示,其中除了标题和样式一样,内容确是不同...

3497
来自专栏利炳根的专栏

学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息。信息检索领域,模型训练合理排序模型,输入特征,文档质量、文档点击历史、文档前链数目、...

36115
来自专栏瓜大三哥

Face Recognition via Deep Embedding(0.9977):baidu

作者提出了一种两部学习方法,结合mutil-patch deep CNN和deep metric learning,实现脸部特征提取和识别。通过1.2milli...

2598
来自专栏大数据挖掘DT机器学习

朴素贝叶斯新闻分类器详解

机器学习的三要素是模型、策略(使用Cost Function计算这个模型是不是好的)和优化算法(不断的寻找最优参数,找到一个参数后用策略判断一下是不是可以,不行...

3407
来自专栏IT技术精选文摘

深入浅出谈人脸识别技术

在深度学习出现后,人脸识别技术才真正有了可用性。这是因为之前的机器学习技术中,难以从图片中取出合适的特征值。轮廓?颜色?眼睛?如此多的面孔,且随着年纪、光线、拍...

3316
来自专栏专知

神经网络编程 - 前向传播和后向传播(附完整代码)

【导读】本文的目的是深入分析深层神经网络,剖析神经网络的结构,并在此基础上解释重要概念,具体分为两部分:神经网络编程和应用。在神经网络编程部分,讲解了前向传播和...

2767
来自专栏一棹烟波

图像处理中kmeans聚类算法C++实现

2323
来自专栏机器学习与自然语言处理

Stanford机器学习笔记-4. 神经网络Neural Networks (part one)

4. Neural Networks (part one) Content:   4. Neural Networks (part one)      4.1 ...

32711
来自专栏大数据挖掘DT机器学习

深度学习实战(可视化部分)——使用keras识别猫咪

在近些年,深度学习领域的卷积神经网络(CNNs或ConvNets)在各行各业为我们解决了大量的实际问题。但是对于大多数人来说,CNN仿佛戴上了神秘的面纱。我经...

4838

扫码关注云+社区