4.2.5 Inception-mobile_net实战

  • Inception-Net

    Inception Net的思想是分组卷积,上一层分成几组卷积,卷积完成之后在把分组的结果拼接起来

    可以进行扩展,每个组有很多层,这里只实现基本的分组卷积

    # 定义 Inception-Net的分组结构
    def inception_block(x,output_channel_for_each_path,name):"""inception block implementation""""""Args:- x: 输入数据- output_channel_for_each_path: 每组的输出通道数目 eg: [10,20,30]- name: 每组的卷积命名"""# variable_scope 在这个scope下命名不会有冲突 conv1 = 'conv1' => scope_name/conv1with tf.variable_scope(name):conv1_1 = tf.layers.conv2d(x,output_channel_for_each_path[0],(1, 1),strides = (1,1),padding = 'same',activation = tf.nn.relu,name = 'conv1_1')conv3_3 = tf.layers.conv2d(x,output_channel_for_each_path[1],(3, 3),strides = (1,1),padding = 'same',activation = tf.nn.relu,name = 'conv3_3')conv5_5 = tf.layers.conv2d(x,output_channel_for_each_path[0],(5, 5),strides = (1,1),padding = 'same',activation = tf.nn.relu,name = 'conv5_5')max_pooling = tf.layers.max_pooling2d(x,(2,2),(2,2),name = 'max_pooling')# max_pooling 会使得图像变小,所以需要paddingmax_pooling_shape = max_pooling.get_shape().as_list()[1:]input_shape = x.get_shape().as_list()[1:]width_padding = (input_shape[0] - max_pooling_shape[0]) // 2height_padding = (input_shape[1] - max_pooling_shape[1]) // 2padded_pooling = tf.pad(max_pooling,[[0,0],[width_padding,width_padding],[height_padding,height_padding],[0,0]])# 在第四个维度(通道数)上做拼接concat_layer = tf.concat([conv1_1, conv3_3, conv5_5, padded_pooling],axis = 3)return concat_layerx = tf.placeholder(tf.float32, [None, 3072])
    y = tf.placeholder(tf.int64, [None])# 将向量变成具有三通道的图片的格式
    x_image = tf.reshape(x, [-1,3,32,32])
    # 32*32
    x_image = tf.transpose(x_image, perm = [0, 2, 3, 1])# 先经过一个普通的卷积层和池化层
    # conv1:神经元图,feature map,输出图像
    conv1 = tf.layers.conv2d(x_image,32, # output channel number(3,3), # kernal sizepadding = 'same', # same 代表输出图像的大小没有变化,valid 代表不做paddingactivation = tf.nn.relu,name = 'conv1')
    # 16*16
    pooling1 = tf.layers.max_pooling2d(conv1,(2, 2), # kernal size(2, 2), # stridename = 'pool1' # name为了给这一层做一个命名,这样会让图打印出来的时候会是一个有意义的图)# 经过两个个分组卷积
    inception_2a = inception_block(pooling1, [16, 16, 16],name = 'inception_2a')inception_2b = inception_block(inception_2a, [16, 16, 16],name = 'inception_2b')# 接一个池化
    pooling2 = tf.layers.max_pooling2d(inception_2b,(2, 2), (2, 2), name = 'pool2' )# 再经过两个分组卷积核一个池化
    inception_3a = inception_block(pooling2, [16, 16, 16],name = 'inception_3a')inception_3b = inception_block(inception_3a, [16, 16, 16],name = 'inception_3b')pooling3 = tf.layers.max_pooling2d(inception_3b,(2, 2), (2, 2), name = 'pool3' )# [None, 4*4*42] 将三通道的图形转换成矩阵
    flatten = tf.layers.flatten(pooling3)
    y_ = tf.layers.dense(flatten, 10)# 交叉熵
    loss = tf.losses.sparse_softmax_cross_entropy(labels=y, logits=y_)
    # y_-> softmax
    # y -> one_hot
    # loss = ylogy_# bool
    predict = tf.argmax(y_, 1)
    # [1,0,1,1,1,0,0,0]
    correct_prediction = tf.equal(predict, y)
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float64))with tf.name_scope('train_op'):train_op = tf.train.AdamOptimizer(1e-3).minimize(loss)
    复制代码
  • Mobile-Net

    Mobile Net 的基本结构 深度可分类的卷积 -> BN ->RELU-> 1*1 的卷积 -> BN -> RELU

    这里BN先不加,这是下节课的内容

    def separable_conv_block(x,output_channel_number,name):"""separable_conv block implementation""""""Args:- x: 输入数据- output_channel_number: 经过深度可分离卷积之后,再经过1*1 的卷积生成的通道数目- name: 每组的卷积命名"""# variable_scope 在这个scope下命名不会有冲突 conv1 = 'conv1' => scope_name/conv1with tf.variable_scope(name):input_channel = x.get_shape().as_list()[-1]# 将x 在 第四个维度(axis+1) 上 拆分成 input_channel 份# channel_wise_x: [channel1, channel2, ...]channel_wise_x = tf.split(x, input_channel, axis = 3)output_channels = []for i in range(len(channel_wise_x)):output_channel = tf.layers.conv2d(channel_wise_x[i],1,(3,3),strides = (1,1),padding = 'same',activation = tf.nn.relu,name = 'conv_%d' % i)output_channels.append(output_channel)concat_layers = tf.concat(output_channels, axis = 3)conv1_1 = tf.layers.conv2d(concat_layers,output_channel_number,(1,1),strides = (1,1),padding = 'same',activation = tf.nn.relu,name = 'conv1_1')return conv1_1x = tf.placeholder(tf.float32, [None, 3072])
    y = tf.placeholder(tf.int64, [None])# 将向量变成具有三通道的图片的格式
    x_image = tf.reshape(x, [-1,3,32,32])
    # 32*32
    x_image = tf.transpose(x_image, perm = [0, 2, 3, 1])# conv1:神经元图,feature map,输出图像
    conv1 = tf.layers.conv2d(x_image,32, # output channel number(3,3), # kernal sizepadding = 'same', # same 代表输出图像的大小没有变化,valid 代表不做paddingactivation = tf.nn.relu,name = 'conv1')
    # 16*16
    pooling1 = tf.layers.max_pooling2d(conv1,(2, 2), # kernal size(2, 2), # stridename = 'pool1' # name为了给这一层做一个命名,这样会让图打印出来的时候会是一个有意义的图)separable_2a = separable_conv_block(pooling1, 32,name = 'separable_2a')separable_2b = separable_conv_block(separable_2a, 32,name = 'separable_2b')pooling2 = tf.layers.max_pooling2d(separable_2b,(2, 2), (2, 2), name = 'pool2' )separable_3a = separable_conv_block(pooling2, 32,name = 'separable_3a')separable_3b = separable_conv_block(separable_3a, 32,name = 'separable_3b')pooling3 = tf.layers.max_pooling2d(separable_3b,(2, 2), (2, 2), name = 'pool3')# [None, 4*4*42] 将三通道的图形转换成矩阵
    flatten = tf.layers.flatten(pooling3)
    y_ = tf.layers.dense(flatten, 10)# 交叉熵
    loss = tf.losses.sparse_softmax_cross_entropy(labels=y, logits=y_)
    # y_-> softmax
    # y -> one_hot
    # loss = ylogy_# bool
    predict = tf.argmax(y_, 1)
    # [1,0,1,1,1,0,0,0]
    correct_prediction = tf.equal(predict, y)
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float64))with tf.name_scope('train_op'):train_op = tf.train.AdamOptimizer(1e-3).minimize(loss)
    复制代码

    这里的准确率是10000次百分之60,这是因为mobile net 的 参数减小和计算率减小影响了准确率。

  • 这里的训练我们都使用的是一万次训练,真正的神经网络训练远不止于此,可能会达到100万次的规模

3.5 卷积神经网络进阶-Inception-mobile_net 实战相关推荐

  1. pytorch卷积神经网络_资源|卷积神经网络迁移学习pytorch实战推荐

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 一.资源简介 这次给大家推荐一篇关于卷积神经网络迁移学习的实战资料,卷积神经网络迁移学 ...

  2. TensorFlow手写数字识别与一步一步实现卷积神经网络(附代码实战)

    编译 | fendouai 编辑 | 安可 [导读]:本篇文章将说明 TensorFlow 手写数字识别与一步一步实现卷积神经网络.欢迎大家点击上方蓝字关注我们的公众号:深度学习与计算机视觉. 手写数 ...

  3. lenet5卷积神经网络_tensorflow图像识别入门实战:使用LeNet5模型实现猫狗分类

    LeNet5介绍 LeNet-5是一种高效的卷积神经网络,在论文<Gradient-Based Learning Applied to Document Recognition>中 有详细 ...

  4. python图片自动上色_老旧黑白片修复机——使用卷积神经网络图像自动着色实战(附PyTorch代码)...

    摘要: 照片承载了很多人在某个时刻的记忆,尤其是一些老旧的黑白照片,尘封于脑海之中,随着时间的流逝,记忆中对当时颜色的印象也会慢慢消散,这确实有些可惜.技术的发展会解决一些现有的难题,深度学习恰好能够 ...

  5. 卷积神经网络之Inception Net

    Goole Inception Net 首次出现在ILSVRC 2014 的比赛上,并且取得了当时比赛的第一名,当年的第二名是被VGGNet取得的.并且当时的Inception Net被称为Incep ...

  6. 深度学习100例 - 卷积神经网络(Inception V3)识别手语 | 第13天

    本文将采用 Inception V3 模型实现手语识别,重点是了解 Inception V3 模型的结构及其搭建方法. 一.前期工作 我的环境: 语言环境:Python3.6.5 编译器:jupyte ...

  7. 深入浅出卷积神经网络及实现!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陈桦.夏雨柔.樊亮,Datawhale优秀学习者 卷积神经网络CN ...

  8. 【深度学习】深入浅出卷积神经网络及实现!

    作者:陈桦.夏雨柔.樊亮,Datawhale优秀学习者 卷积神经网络CNN是深度学习中的基础知识.本文对CNN的基础原理及常见的CNN网络进行了详细解读,并介绍了Pytorch构建深度网络的流程.最后 ...

  9. 神经网络与卷积神经网络,卷积神经网络运用

    1.有哪些深度神经网络模型? 目前经常使用的深度神经网络模型主要有卷积神经网络(CNN) .递归神经网络(RNN).深信度网络(DBN) .深度自动编码器(AutoEncoder) 和生成对抗网络(G ...

最新文章

  1. mysql册_Mysql手册
  2. OpenGL学习笔记以及其它学习思考
  3. Python爬虫学习笔记(三)——正则表达式
  4. android Wifi开发相关内容
  5. 工作104:vuex很强大
  6. scrapy+selenium实战,热搜明星数据分析,看看有哪些好玩的事情
  7. 模版方法模式 Template Method Pattern — 穷人和富人的不同婚恋历程
  8. 《Python数据可视化编程实战》—— 1.2 安装matplotlib、Numpy和Scipy库
  9. String中的intern方法详解
  10. uni-app在小程序开发者工具:TypeError: Cannot read property ‘forceUpdate‘ of undefined
  11. 评价类问题中的模糊综合评价法
  12. 计算机忘记网络,忘记密码后如何查看电脑无线网络密码
  13. Android中为网络图片设置高斯模糊效果
  14. 《平安夜》钢琴谱上的虚线表示什么?
  15. linux系统认证中级是什么,目前国内常见的几种Linux认证及其所需价格
  16. UPS智能云监控报警器使用手机SIM卡和物联网卡的区别
  17. c实用技巧:纯c对于excel数据表的处理
  18. C#XML序列化特性全中文教程
  19. 浮华的世态,只会将一颗心,涂染得色彩缤纷,失去往日纯净的姿态
  20. gcc/gdb/make/动/静态链接库介绍

热门文章

  1. 性能计时器监测服务器性能瓶颈
  2. 机器学习基石-作业三-代码部分
  3. URI 和 URL 的区别
  4. 关于js的一些常用小知识点(持续更新)
  5. 人民币读法的java程序_Java浮点数转人民币读法
  6. 中的数组怎么转成结构体_传说中的“衡水体”应该怎么练?
  7. vs远程编译linux程序,使用Visual Studio 2015远程调试Linux程序
  8. html5 客户端数据缓存机制,深入理解HTML5离线缓存机制
  9. 晶振波形不是正弦波_晶振的分类及其应用
  10. android像素鸟,像素鸟Flappy Bird