这个结构其实不难,但是它里面训练的一些东西我还没有搞清楚,打算把昨天写的代码传上来,方便日后来看,发现了一个很有意思的库叫TF-slim打算哪天看看有没有好用的东西

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

"""
create a function to construct a convLayer and put the parameters of this layer into the convlayer
input_op:input tensor
name:layer name
kh:kernel height
kw:kernal width
n_out:number of filters,the output channels
dh:stride of height
dw:stride of width
p:parameter list

"""

def conv_op(input_op,name,kh,kw,n_out,dh,dw,p):
    #用来获取通道数,-1代表tensor的最后一个维度即通道
    n_in=input_op.get_shape()[-1].value
    with tf.name_scope(name) as scope:
        kernel=tf.get_variable(scope+"w",
                               shape=[kh,kw,n_in,n_out],
                               initializer=tf.contrib.layers.xavier_initializer_conv2d)
    #用来定义卷积操作,其中第三个参数是strides步长,第四个参数是填充方式
    conv=tf.nn.conv2d(input_op,kernel,(1,dh,dw,1),padding='SAME')
    bias_init_values=tf.constant(0.0,shape=[n_out],dtype=tf.float32)
    biases=tf.Variable(bias_init_values,trainable=True,name='b')
    z=tf.nn.bias_add(conv,biases)
    activation=tf.nn.relu(z,name=scope)
    #将创建卷积时用到的参数添加到参数列表p中
    p+=[kernel,biases]
    #将激活后的结果返回,使用激活函数是为了让模型具有非线性的表达,其实这个结果是要传递到下一层去
    return activation

#创建池化层的构造函数
def max_pool_op(input_op,name,kw,kh,dw,dh):
    return tf.nn.max_pool(input_op,
                          ksize=[1,kh,kw,1],
                          strides=[1,dh,dw,1],
                          padding='SAME',
                          name=name)
#创建建立全连接层的函数
def fc_op(input_op,name,n_out,p):
    n_in=input_op.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_val=tf.constant(0.1,shape=[n_out],dtype=tf.float32)
        biases=tf.Variable(biases_val,name='b')
        activation=tf.nn.relu_layer(input_op,kernel,biases,name='scope')
        p+=[kernel,biases]
        return activation

#下面开始构造VGG的网络结构
"""
正常的VGG有五层的卷积结构
第一个是两个卷积层,一层最大池化
第二个是两个卷积层一个最大池化
第三个是三个卷积层一个最大池化
第四个是三个卷积层一个最大池化
第五个是三个卷积层一个最大池化
之后是三层全连接层,最后一个全链接层的输出进入softmax进行分类预测
input_op是输入的tensor,keep_prob是神经元的保留率
"""
def vgg_structure(input_op,keep_prob):
    #参数保留
    p=[]
    conv1_1=conv_op(input_op,name="conv1_1",kh=3,kw=3,n_out=64,dh=1,dw=1,p=p)
    conv1_2=conv_op(conv1_1,name="conv1_2",kh=3,kw=3,n_out=64,dh=1,dw=1,p=p)
    pool1=max_pool_op(conv1_2,name="pool1",kw=2,kh=2,dw=2,dh=2)

    #第二段的卷积
    conv2_1=conv_op(pool1,name="conv2_1",kh=3,kw=3,n_out=128,dh=1,dw=1,p=p)
    conv2_2=conv_op(conv2_1,name="conv2_2",kh=2,kw=2,n_out=128,dh=1,dw=1,p=p)
    pool2=max_pool_op(conv2_2,name="pool2",kw=2,kh=2,dw=2,dh=2)

    #第三段卷积
    conv3_1=conv_op(pool2,name="conv3_1",kh=3,kw=3,n_out=256,dh=1,dw=1,p=p)
    conv3_2=conv_op(conv3_1,name="conv3_2",kh=3,kw=3,n_out=256,dh=1,dw=1,p=p)
    conv3_3 = conv_op(conv3_2, name="conv3_3", kh=3, kw=3, n_out=256, dh=1, dw=1, p=p)
    pool3=max_pool_op(conv3_3,name="pool3",kw=2,kh=2,dw=2,dh=2)

    #第四段卷积
    conv4_1=conv_op(pool3,name="conv4_1",kh=3,kw=3,n_out=512,dh=1,dw=1,p=p)
    conv4_2 = conv_op(conv4_1, name="conv4_2", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)
    conv4_3 = conv_op(conv4_2, name="conv4_3", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)
    pool4=max_pool_op(conv4_3,name="pool4",kw=2,kh=2,dw=2,dh=2)

    #第五段卷积
    conv5_1=conv_op(pool4,name="conv5_1",kh=3,kw=3,n_out=512,dh=1,dw=1,p=p)
    conv5_2=conv_op(conv5_1, name="conv5_2", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)
    conv5_3=conv_op(conv5_2, name="conv5_3", kh=3, kw=3, n_out=512, dh=1, dw=1, p=p)
    pool5=max_pool_op(conv5_3,name="pool5",kw=2,kh=2,dw=2,dh=2)

    #将最后一个池化层的输出扁平化,最后输出的是7*7*512的matrix
    shp=pool5.get_shape()
    total_demension=shp[1].value*shp[2].value*shp[3].value
    #因为不知道一次输入的batch_size是多少,不知道转化成多少行,只知道列数
    resh1=tf.reshape(pool5,[-1,total_demension],name="resh1")

    #现在将最后一个池化层的输出拿出来当作第一个全连接层的输入,全连接层后面加一个drop_out,在训练时节点保留率是0.5,测试时为1
    fc6=fc_op(resh1,name="fc6",n_out=4096,p=p)
    fc6_drop=tf.nn.dropout(fc6,keep_prob,name="fc6_deop")

    #定义第二个全连接层
    fc7=fc_op(fc6_drop,name="fc7",n_out=4096,p=p)
    fc7_drop=tf.nn.dropout(fc7,keep_prob,name="fc7_drop")

    #定义第三个全连接层
    fc8=fc_op(fc7_drop,name="fc8",n_out=1000,p=p)
    #全连接层的输出是软对数,直接放入softmax中进行分类
    softmax=tf.nn.softmax(fc8)
    #返回列方向上softmax预测概率的最大值的下标,就是模型的预测结果
    predictions=tf.argmax(softmax,1)
    return softmax,fc8,predictions

#这样我们的vgg初步的模型就定义结束了

然后之后想试试如何划分训练集测试集和验证集,这个是一直不太会的东西,嗯就酱

VGG网络结构的更多相关文章

  1. 【转】VGG网络结构及参数

     VGG网络  VGG16输入224*224*3的图片,经过的卷积核大小为3x3x3,stride=1,padding=1,pooling为采用2x2的max pooling方式: 1.输入224x2 ...

  2. 【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络Vgg

    上周我们讲了经典CNN网络AlexNet对图像分类的效果,2014年,在AlexNet出来的两年后,牛津大学提出了Vgg网络,并在ILSVRC 2014中的classification项目的比赛中取得 ...

  3. 卷积神经网络之VGG

    2014年,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司的研究员一起研发出了新的深度卷积神经网络:VGGNet,并取得了ILSVRC2014比 ...

  4. VGG网络

    VGG论文给出了一个非常振奋人心的结论:卷积神经网络的深度增加和小卷积核的使用对网络的最终分类识别效果有很大的作用.记得在AlexNet论文中,也做了最后指出了网络深度的对最终的分类结果有很大的作用. ...

  5. cnn 经典网络结构 解析

    cnn发展史 这是imageNet比赛的历史成绩 可以看到准确率越来越高,网络越来越深. 加深网络比加宽网络有效的多,这已是公认的结论. cnn结构演化图 AlexNet 诞生于2012年,因为当时用 ...

  6. 关于VGG网络的介绍

    本博客参考作者链接:https://zhuanlan.zhihu.com/p/41423739 前言: VGG是Oxford的Visual Geometry Group的组提出的(大家应该能看出VGG ...

  7. Faster R-CNN:详解目标检测的实现过程

    本文详细解释了 Faster R-CNN 的网络架构和工作流,一步步带领读者理解目标检测的工作原理,作者本人也提供了 Luminoth 实现,供大家参考.   Luminoth 实现:https:// ...

  8. CTPN项目部分代码学习

    上次拜读了CTPN论文,趁热打铁,今天就从网上找到CTPN 的tensorflow代码实现一下,这里放出大佬的github项目地址:https://github.com/eragonruan/text ...

  9. 实现text-detection-ctpn一路的坎坎坷坷

    小编在学习文字检测,因为作者提供的caffe实现没有训练代码(不过训练代码可以参考faster-rcnn的训练代码),所以我打算先使用tensorflow实现,主要是复现前辈的代码,主要是对文字检测模 ...

随机推荐

  1. DLL 破解工具

    1.Reflecter+Reflexil (第一类) 2.本文使用的工具下载地址为:(第二类) https://github.com/cnxy/dnSpy/archive/v4.0.0.zip 或 d ...

  2. 代码生成器——实现生成pojo,sql,mapper接口

    代码生成器(记录一次兴趣代码,多多指教.转载请标明作者) 在我们开始实现代码生成器之前我们先来对代码生成器有一个简单的了解. 1.什么是代码生成器? 故名思义,也就是生成代码的一个程序.那它是一个什么 ...

  3. vue drag 对表格的列进行拖动排序

    用drag实现拖动表格列进行列排序   以下是用到的主要方法   1.dragstart 拖动开始返回目标对象 2.dragenter 拖动过程中经过的对象 3.dragend 拖动结束返回目标对象 ...

  4. js for 循环示例

    //for 循环 ,,,,,,]; ; i < array.length; i++) { console.log(i,array[i]); } //for in ,,,,,,]; for(let ...

  5. (2)OSi模型

    osi七层模型 #(应用层,表示层,会话层) => 应用层 => 表达一个数据信息 # 传输层 port(端口) tcp/udp协议 硬件设备:四层交换机 四层路由器 # 网络层 ip协议 ...

  6. 有趣的if循环

    今天,在论坛看到一个有趣的if 循环,我感觉有不错,就分享出来 问题,列表只有6个数,为什么打印8个数?原理? q = ['a', 'b', 'c', 'd', 'e', 'f'] for i in ...

  7. 思科模拟器PacketTracer7--利用一台交换机和2台pc互连构成小型局域网

    实验二—2 实验工具:思科模拟器PacketTracer7(可在思科官网下载,免费) 实验设备: 交换机一台,PC两台,直连线或选择自动匹配 实验步骤: 一.配置网络拓扑图 连线可选择连通线或闪电符号 ...

  8. mysql数据库,取两列值中最大的一个值

    有表 zta,该表有两个字段 bf,ac,要取两个字段中,符合条件的最大的一个值,可用方法: select GREATEST(MAX(bf),MAX(ac))  maxvalue  from  zta ...

  9. struts1与struts2的区别。

    1) 两个框架都是MVC的WEB框架, 2) struts1是老牌框架,应用很广泛,有很好的群众基础,使用它开发风险很小,成本低,Struts2核心设计思想主要源自Webwork,实现更优雅,更容易扩 ...

  10. dp背包问题

    0-1背包 1.问题定义: 给定n种物品和背包.物品i的重量是wi,价值是vi,每种物品只有一个,背包容量为C.问:应该如何选择装入背包的物品,使得装入背包中的物品总值最大. 2.算法思路: 选择装入 ...