VGGNet的Tensorflow实现

  • 关于VGGNet:

  • VGGNet通过反复堆叠3*3的小型卷积核和2*2的最大池化层,构筑了16~19层深的卷积神经网络,拓展性强,泛化性好。
  • VGGNet拥有5段卷积,每一段都有两到三个卷积核,末尾通过连接一个最大池化层来缩小图片尺寸。

  • VGGNet通过小型卷积核串联达到比等效大小卷积核更好的效果

  • VGGNet结构
  • 输入 224*224*3的RGB图像
  • 第一层有两个卷积层和一个最大池化层

  1. 第1.1层:conv 3*3*64 步长1*1
  2. 第1.2层:conv 3*3*64 步长1*1
  3. 第1.3层:max_pool 2*2 步长2*2
  4. 最后输出 112*112*64
  • 第二层有两个卷积层和一个最大池化层

  1. 第2.1层:conv 3*3*128 步长 1*1
  2. 第2.2层:conv 3*3*128 步长 1*1
  3. 第2.3层:max_pool 2*2 步长 2*2
  4. 最后输出 56*56*128
  • 第三层有三个卷积层和一个最大池化层

  1. 第3.1层:conv 3*3*256 步长 1*1
  2. 第3.2层:conv 3*3*256 步长 1*1
  3. 第3.3层:conv 3*3*256 步长 1*1
  4. 第3.4层:max_pool 2*2 步长 2*2
  5. 最后输出 28*28*256
  • 第四层有三个卷积层和一个最大池化层

  1. 第4.1层:conv 3*3*512 步长 1*1
  2. 第4.2层:conv 3*3*512 步长 1*1
  3. 第4.3层:conv 3*3*512 步长 1*1
  4. 第4.4层:max_pool 2*2 步长 2*2
  5. 最后输出 14*14*512
  • 第五层有三个卷积层和一个最大池化层

  1. 第5.1层:conv 3*3*512 步长 1*1
  2. 第5.2层:conv 3*3*512 步长 1*1
  3. 第5.3层:conv 3*3*512 步长 1*1
  4. 第5.4层:max_pool 2*2 步长 2*2
  5. 最后输出 7*7*512
  • 第六层为全连接层

  1. 先将第五层的输出扁平化为7*7*512=25088的一维向量
  2. 第6.1层: (25088,4096)
  3. 第6.2层:dropout
  • 第七层同样为全连接层

  1. 第7.1层:(4096,4096)
  2. 第7.2层:dropout
  • 第八层全连接层

  1. 第八层(4096,classes_num)
  • 最后进行Softmax和Prediction
  • 代码
  • """
    Created on Mon Apr  2 17:34:55 2018
    
    @author: 帅老板
    """
    
    import tensorflow as tf
    import numpy as np
    
    class Vggnet(object):
      
      def _init_(self, x, keep_prob, num_classes):
        
        self.X = x
        self.KEEP_PROB = keep_prob
        self.NUM_CLASSES = num_classes
        
        self.p = []
        
        self.inference()
      
      def inference(self):
        
        'first layer'
        conv1_1 = conv_op(self.X, name='conv1_1', kh=3, kw=3, n_out=64, dh=1, dw=1, p=self.p)
        conv1_2 = conv_op(conv1_1, name='conv1_2', kh=3, kw=3, n_out=64, dh=1, dw=1,p=self.p)
        pool1 = mpool_op(conv1_2, name='pool1', kh=2, kw=2, dh=2, dw=2)
        
        'second layer'
        conv2_1 = conv_op(pool1, name='conv2_1', kh=3, kw=3, n_out=128, dh=1, dw=1, p=self.p)
        conv2_2 = conv_op(conv2_1, name='conv2_2', kh=3, kw=3, n_out=128, dh=1, dw=1, p=self.p)
        pool2 = mpool_op(conv2_2, name='pool2', kh=2, kw=2 ,dh=2, dw=2)
    
        'third layer'
        conv3_1 = conv_op(pool2, name='conv3_1', kh=3, kw=3, n_out=256, dh=1, dw=1,p=self.p)
        conv3_2 = conv_op(conv3_1, name='conv3_2', kh=3, kw=3, n_out=256, dh=1, dw=1,p=self.p)
        conv3_3 = conv_op(conv3_2, name='conv3_3',kh=3, kw=3, n_out=256, dh=1, dw=1, p=self.p)
        pool3 = mpool_op(conv3_3, name='pool3', kh=2, kw=2, dh=2, dw=2)
        
        'firth layer'
        conv4_1 = conv_op(pool3, name='conv4_1', kh=3, kw=3, n_out=512, dh=1, dw=1,p=self.p)
        conv4_2 = conv_op(conv4_1, name='conv4_2', kh=3, kw=3, n_out=512, dh=1, dw=1,p=self.p)
        conv4_3 = conv_op(conv4_2, name='conv4_3',kh=3, kw=3, n_out=512, dh=1, dw=1, p=self.p)
        pool4 = mpool_op(conv4_3, name='pool4', kh=2, kw=2, dh=2, dw=2)
        
        'fifth layer'
        conv5_1 = conv_op(pool4, name='conv5_1', kh=3, kw=3, n_out=512, dh=1, dw=1,p=self.p)
        conv5_2 = conv_op(conv5_1, name='conv5_2', kh=3, kw=3, n_out=512, dh=1, dw=1,p=self.p)
        conv5_3 = conv_op(conv5_2, name='conv5_3',kh=3, kw=3, n_out=512, dh=1, dw=1, p=self.p)
        pool5 = mpool_op(conv5_3, name='pool5', kh=2, kw=2, dh=2, dw=2)
        
        shp = pool5.get_shape()
        flatten = shp[1].value*shp[2].value*shp[3].value
        resh1 = tf.reshape(pool5, [-1,flatten], name='resh')
        
        fc6 = fc_op(resh1, 'fc6', 4096, p=self.p)
        fc6_drop = tf.nn.dropout(fc6, self.KEEP_PROB, name='fc6_drop')
        
        fc7 = fc_op(fc6_drop, 'fc7', 4096, p=self.p)
        fc7_drop = tf.nn.drop(fc7, self.KEEP_PROB, name='fc7_drop')
        
        fc8 = fc_op(fc7_drop, 'fc8', n_out=self.NUM_CLASSES, p=self.p)
        softmax = tf.nn.soft(fc8)
        prediction = tf.argmax(softmax, 1)
        return prediction, softmax, fc8, self.p
        
        
    def conv_op(x, name, kh, kw, n_out, dh, dw, p):
      n_in = x.get_shape()[-1].value
        
      with tf.name_scope(name) as scope:
        kernel = tf.get_Variable(scope+'w',
                                 shape = [kh, kw, n_in, n_out],
                                 dtype = tf.float32,
                                 initializer = tf.contrib.layers.xavier_initializer_conv2D())
        conv = tf.nn.conv2D(x, kernel, (1, dh, dw, 1), padding = 'SAME')
        bias_init_val = tf.constant(0.0, shape = [n_out], dtype = tf.float32)
        biases = tf.get_Variable(bias_init_val, trainable = True, name = 'b')
        z = tf.nn.add(conv, biases)
        activation = tf.nn.relu(z, name = scope)
        p += [kernel,biases]
        return activation
        
    def fc_op(x, name, n_out, p):
      n_in = x.get_shape()[-1].value
        
      with tf.name_scope(name) as scope:
        kernel = tf.get_Variable(scope+'w',
                                 shape = [n_in, n_out],
                                 dtype = tf.float32,
                                 initializer = tf.contrib.layers.xavier_initializer())
        biases = tf.Variable(tf.constant(0.1, shape = [n_out], dtype = tf.float32), name = 'b')
        activation = tf.nn.relu_layer(x, kernel, biases, name = scope)
        p += [kernel, biases]
        return activation
        
    def mpool_op(x, name, kh, kw, dh, dw):
      return tf.nn.max_pool(x,
                            ksize = [1, kh, kw, 1],
                            strides = [1, dh, dw ,1],
                            padding = 'SAME',
                            name = name)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值