上面放了一个keras用vgg16训练测试的例子,我也试过用vgg16训练然后测试自己的例子,效果一般,这里我们来分析一下vgg16的网络结果

keras代码如下

  1. def VGG_16(weights_path=None):
  2. model = Sequential()
  3. model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))#卷积输入层,指定了输入图像的大小
  4. model.add(Convolution2D(64, 3, 3, activation='relu'))#64个3x3的卷积核,生成64*224*224的图像,激活函数为relu
  5. model.add(ZeroPadding2D((1,1)))#补0,保证图像卷积后图像大小不变,其实用<span style="font-family:Consolas, 'Andale Mono WT', 'Andale Mono', 'Lucida Console', 'Lucida Sans Typewriter', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Liberation Mono', 'Nimbus Mono L', Monaco, 'Courier New', Courier, monospace;color:#333333;"><span style="font-size:10.8px;">padding = 'valid'参数就可以了</span></span>
  6. model.add(Convolution2D(64, 3, 3, activation='relu'))#再来一次卷积 生成64*224*224
  7. model.add(MaxPooling2D((2,2), strides=(2,2)))#pooling操作,相当于变成64*112*112
  8. model.add(ZeroPadding2D((1,1)))
  9. model.add(Convolution2D(128, 3, 3, activation='relu'))
  10. model.add(ZeroPadding2D((1,1)))
  11. model.add(Convolution2D(128, 3, 3, activation='relu'))
  12. model.add(MaxPooling2D((2,2), strides=(2,2)))#128*56*56
  13. model.add(ZeroPadding2D((1,1)))
  14. model.add(Convolution2D(256, 3, 3, activation='relu'))
  15. model.add(ZeroPadding2D((1,1)))
  16. model.add(Convolution2D(256, 3, 3, activation='relu'))
  17. model.add(ZeroPadding2D((1,1)))
  18. model.add(Convolution2D(256, 3, 3, activation='relu'))
  19. model.add(MaxPooling2D((2,2), strides=(2,2)))#256*28*28
  20. model.add(ZeroPadding2D((1,1)))
  21. model.add(Convolution2D(512, 3, 3, activation='relu'))
  22. model.add(ZeroPadding2D((1,1)))
  23. model.add(Convolution2D(512, 3, 3, activation='relu'))
  24. model.add(ZeroPadding2D((1,1)))
  25. model.add(Convolution2D(512, 3, 3, activation='relu'))
  26. model.add(MaxPooling2D((2,2), strides=(2,2)))#512*14*14
  27. model.add(ZeroPadding2D((1,1)))
  28. model.add(Convolution2D(512, 3, 3, activation='relu'))
  29. model.add(ZeroPadding2D((1,1)))
  30. model.add(Convolution2D(512, 3, 3, activation='relu'))
  31. model.add(ZeroPadding2D((1,1)))
  32. model.add(Convolution2D(512, 3, 3, activation='relu'))
  33. model.add(MaxPooling2D((2,2), strides=(2,2)))  #到这里已经变成了512*7*7
  34. model.add(Flatten())#压平上述向量,变成一维25088
  35. model.add(Dense(4096, activation='relu'))#全连接层有4096个神经核,参数个数就是4096*25088
  36. model.add(Dropout(0.5))#0.5的概率抛弃一些连接
  37. model.add(Dense(4096, activation='relu'))#再来一个全连接
  38. model.add(Dropout(0.5))
  39. model.add(Dense(1000, activation='softmax'))
  40. if weights_path:
  41. model.load_weights(weights_path)
  42. return model

vgg16详细信息

下面是详细的参数个数

  1. INPUT: [224x224x3]        memory:  224*224*3=150K   weights: 0
  2. CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*3)*64 = 1,728    3*3 代表卷积大小 *3 代表输入时3个通道 *64代表输出64个
  3. CONV3-64: [224x224x64]  memory:  224*224*64=3.2M   weights: (3*3*64)*64 = 36,864   同理3*3是卷积大小 *64代表输入64通道 *64代表输出是64通道
  4. POOL2: [112x112x64]  memory:  112*112*64=800K   weights: 0
  5. CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*64)*128 = 73,728
  6. CONV3-128: [112x112x128]  memory:  112*112*128=1.6M   weights: (3*3*128)*128 = 147,456
  7. POOL2: [56x56x128]  memory:  56*56*128=400K   weights: 0
  8. CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*128)*256 = 294,912
  9. CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
  10. CONV3-256: [56x56x256]  memory:  56*56*256=800K   weights: (3*3*256)*256 = 589,824
  11. POOL2: [28x28x256]  memory:  28*28*256=200K   weights: 0
  12. CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*256)*512 = 1,179,648
  13. CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
  14. CONV3-512: [28x28x512]  memory:  28*28*512=400K   weights: (3*3*512)*512 = 2,359,296
  15. POOL2: [14x14x512]  memory:  14*14*512=100K   weights: 0
  16. CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
  17. CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
  18. CONV3-512: [14x14x512]  memory:  14*14*512=100K   weights: (3*3*512)*512 = 2,359,296
  19. POOL2: [7x7x512]  memory:  7*7*512=25K  weights: 0
  20. FC: [1x1x4096]  memory:  4096  weights: 7*7*512*4096 = 102,760,448
  21. FC: [1x1x4096]  memory:  4096  weights: 4096*4096 = 16,777,216
  22. FC: [1x1x1000]  memory:  1000 weights: 4096*1000 = 4,096,000
  23. TOTAL memory: 24M * 4 bytes ~= 93MB / image (only forward! ~*2 for bwd)
  24. TOTAL params: 138M parameters

VGG 参数分析 转的更多相关文章

  1. AI:IPPR的数学表示-CNN结构/参数分析

    前言:CNN迎接多类的挑战 特定类型的传统PR方法特征提取的方法是固定的,模式函数的形式是固定的,在理论上产生了特定的"局限性" 的,分类准确度可以使用PAC学习理论的方法计算出来 ...

  2. http_load安装与测试参数分析 - 追求自由自在的编程 - ITeye技术网站

    http_load安装与测试参数分析 - 追求自由自在的编程 - ITeye技术网站 http_load -p 50 -s 120 urls

  3. cocos2dx tolua传递参数分析

    cocos2dx tolua传递参数分析: tolua_Cocos2d_CCNode_addChild00 == void CCNode::addChild(CCNode *child) tolua_ ...

  4. jQuery学习笔记之jQuery.fn.init()的参数分析

    这篇文章主要介绍了jQuery.fn.init()的参数分析,需要的朋友可以参考下   从return new jQuery.fn.init( selector, context, rootjQuer ...

  5. JavaScript事件监听以及addEventListener参数分析

    事件监听 在Javascript中事件的监听是用来对某些操作做出反应的方法.例如监听一个按钮的pressdown, 或者获取鼠标左键按下时候鼠标的位置.这些都需要使用监听来完成.监听的函数很简单:ad ...

  6. Jmeter5.1——聚合报告参数分析

    Jmeter5.1——聚合报告参数分析 Label: 每个JMeter的element的Name值.例如HTTP Request的Name. Samples:发出请求的数量.如果线程组中配置的是线程数 ...

  7. BMDP为常规的统计分析提供了大量的完备的函数系统,如:方差分析(ANOVA)、回归分析(Regression)、非参数分析(Nonparametric Analysis)、时间序列(Times Series)等等。此外,BMDP特别擅于进行出色的生存分析(Survival Analysis )。许多年来,一大批世界范围内顶级的统计学家都曾今参与过BMDP的开发工作。这不仅使得BMDP的权威性得到

        BMDP是Bio Medical Data Processing的缩写,是世界级的统计工具软件,至今已经有40多年的历史.目前在国际上与SAS.SPSS被并称为三大统计软件包.BMDP是一个大 ...

  8. Impala队列内存参数分析

    同步发布在csdn上 问题 对Impala队列内存的几个参数分析了下,欢迎指正 队列资源池的几个内存配置 Maximum Query Memory Limit 某个队列资源池,一个查询在一个Impal ...

  9. external-attacher源码分析(1)-main方法与启动参数分析

    更多 ceph-csi 其他源码分析,请查看下面这篇博文:kubernetes ceph-csi分析目录导航 摘要 ceph-csi分析-external-attacher源码分析.external- ...

随机推荐

  1. BZOJ5338[TJOI2018]xor——主席树+dfs序

    题目描述 现在有一颗以1为根节点的由n个节点组成的树,树上每个节点上都有一个权值vi. 现在有Q 次操作,操作如下: 1  x y    查询节点x的子树中与y异或结果的最大值 2 x y z     ...

  2. MT【5】蝴蝶效应:一道递推式为二次的数列

                                      评:蝴蝶效应[蝴蝶效应(The Butterfly Effect)是指在一个动力系统中,初始条件下微小的变化能带动整个系统的长期的巨 ...

  3. APIO2016赛艇

    首先每个学校的边界范围是\(1e9\),肯定不能直接\(dp[i][j]\)表示前i所学校,第\(i\)所学校派出\(j\)艘船,但\(b<=500\)所有考虑把\(a,b\)离散,第二维改为当 ...

  4. 恕我直言,在座的各位根本写不好Java!

    其实,本不想把标题写的那么恐怖,只是发现很多人干了几年 Java 以后,都自认为是一个不错的 Java 程序员了,可以拿着上万的工资都处宣扬自己了,写这篇文章的目的并不是嘲讽和我一样做 Java 的同 ...

  5. TiKV 源码解析系列文章(三)Prometheus(上)

    本文为 TiKV 源码解析系列的第三篇,继续为大家介绍 TiKV 依赖的周边库 rust-prometheus,本篇主要介绍基础知识以及最基本的几个指标的内部工作机制,下篇会介绍一些高级功能的实现原理 ...

  6. 牛客练习赛 小D的剑阵 解题报告

    小D的剑阵 题意链接: https://ac.nowcoder.com/acm/contest/369/F 来源:牛客网 现在你有 \(n\) 把灵剑,其中选择第i把灵剑会得到的 \(w_i\) 攻击 ...

  7. bzoj5280/luogu4376 MilkingOrder (二分答案+拓扑序)

    二分答案建图,然后判环,就可以了. 字典序输出的话,只要做拓扑序的时候用优先队列来维护就可以了. (其实判环也可以用拓扑序...) #include<cstdio> #include< ...

  8. activity之间的数据传递方法

    1  基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Inte ...

  9. ORACLE常用性能监控SQL

    Temp表空间上进程的查询 select a.tablespace, b.sid, b.serial#, a.blocks,c.sql_text from v$sort_usage a,v$sessi ...

  10. 类的初始化过程(难点)--------java基础总结

    前言:看到这么好的东西,忍不住又写到了博客上面 Student s = new Student();在内存中究竟做了哪些事情呢? ①加载student.class文件进内存. ②为栈内存s开辟空间. ...