教你用TensorFlow实现VGGNet

勿满足于眼前的小小成就。你要问自己,我这辈子只有这样吗。

VGGNet 是牛津大学计算机视觉组( Visual Geometry Group〉和 Google DeepMind公司的研究员一起研发的的深度卷积神经网络。VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3x3的小型卷积核和2x2的晟大池化层,VGGNet成功地
构筑了 16~19层深的卷积神经网络。VGGNet相比之前state-of-the-art的网络结相,错误率大幅下降,并取得了 ILSVRC 2014比赛分类项目的第2名和定位项目的第1名,同时VGGNct的拓展性很强,迁移到其他图片数据上的泛化性非常好。VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)。到目前为止,VGGNet依然经常被甩来提取图像特征。VGGNel训练后的模型参数在其官方网站上开源了,可用来在domain_specific的图像分类任务上进行再训练(相当于提供了非常好的初始化权重),因此被用在了很多地方。

作者在对比各级网络时总结了一下观点:

  1. LRN层作用不大
  2. 越深的网络效果越好
  3. 1X1的卷积也是很有效的,但是没有3X3的卷积好,大一些的卷积核可以学习更大的空间特征

VGGNet训练时使用了 4块Geforce GTX Titan GPU并行计算,速度比单块GPU快3.75倍,几乎没有太多性能损耗。但是,每个网络耗时2〜3周才可以训练完。因此我们这里不直接使用mageNet数据训练一个VGGNet,而是采用跟AlexNet —样的方式:构
造出VGGNet网络结构,并评测其forward (inference )耗时和backward (training)耗时。

我们要实现的是VGGNet-16,首先需要导入几个常用库

from datetime import datetime
import math
import time
import tensorflow as tf

定义 一个函数用来创建卷积层并把本层的参数存入参数列表。input_op是输入的tensor,name是这一层的名称,kw,kh是卷积核的宽高,n_out是输出通道数,dw,dh是步长的宽高,p是参数列表。使用get_shape()[-1].value获取输入input_op的通道数,然后使用tf.name_scope()设置scope,使用tf.get_variable创建卷积核参数。

使用tf.contrib.layers.xavier_initializer_conv2d()来做参数初始化

接着使用tf.nn.conv2d对input_op进行卷积处理,卷积核即为kernel,步长是dhXdw,padding模式设为SAME。 biases使用tf.constant赋值为0,再使用tf.Variable将其转成可训练的参数。使用tf.nn.bias_add将卷积结果conv与bias相加,再使用tf.nn.rcki对其进行非线性处理得到activation。最后将创建卷积层时用到的参数kernel和biases添加进参数列表P,并将卷积层的输出activation作为函数结果返回。

def conv_op(input_op, name, kh, kw, n_out, dh, dw, p):
    n_in = input_op.get_shape()[-1].value
    with tf.name_scope(name) as scope:
        kernel = tf.get_variable(scope + "w", shape=[kh, kw,
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幽蓝丶流月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值