原文链接: TensorFlow cifar 卷积网络

上一篇: one hot 编码 转化

下一篇: TensorFlow 梯度计算

卷积操作使用同卷积操作,步长为1,SAME

池化层有两个函数,一个放在卷子后面,取最大值,步长为2,SAME,即将原图长宽各除以2

另一个放在最后一层,取均值,步长为最终生成的特征尺寸6X6,(24X24经过两次池化变为6X6),filter也为6X6

倒数第二层是没有最大池化的卷积层,因为有10类,所以卷积输出的是10个通道,并使其全局平均池化为10个节点

结果

step 14400, training accuracy 0.5625
step 14600, training accuracy 0.703125
step 14800, training accuracy 0.609375
finished! test accuracy 0.625

参考代码

import cifar10_input
import tensorflow as tf
import numpy as np# 数据准备,每次训练128张
batch_size = 128
data_dir = '/tmp/cifar10_data/cifar-10-batches-bin'
print("begin")
images_train, labels_train = cifar10_input.inputs(eval_data=False, data_dir=data_dir, batch_size=batch_size)
images_test, labels_test = cifar10_input.inputs(eval_data=True, data_dir=data_dir, batch_size=batch_size)
print("begin data")# 生成标准差为0.1 的随机数
def weight_variable(shape):initial = tf.truncated_normal(shape, stddev=0.1)return tf.Variable(initial)# 生成初始化为0.1的权重
def bias_variable(shape):initial = tf.constant(0.1, shape=shape)return tf.Variable(initial)def conv2d(x, W):return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')def max_pool_2x2(x):return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME')def avg_pool_6x6(x):return tf.nn.avg_pool(x, ksize=[1, 6, 6, 1],strides=[1, 6, 6, 1], padding='SAME')# tf Graph Input
x = tf.placeholder(tf.float32, [None, 24, 24, 3])  # cifar data image of shape 24*24*3
y = tf.placeholder(tf.float32, [None, 10])  # 0-9 数字=> 10 classesW_conv1 = weight_variable([5, 5, 3, 64])
b_conv1 = bias_variable([64])x_image = tf.reshape(x, [-1, 24, 24, 3])h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)W_conv2 = weight_variable([5, 5, 64, 64])
b_conv2 = bias_variable([64])h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)W_conv3 = weight_variable([5, 5, 64, 10])
b_conv3 = bias_variable([10])
h_conv3 = tf.nn.relu(conv2d(h_pool2, W_conv3) + b_conv3)nt_hpool3 = avg_pool_6x6(h_conv3)  # 10
nt_hpool3_flat = tf.reshape(nt_hpool3, [-1, 10])
y_conv = tf.nn.softmax(nt_hpool3_flat)cross_entropy = -tf.reduce_sum(y * tf.log(y_conv))train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))sess = tf.Session()
sess.run(tf.global_variables_initializer())
tf.train.start_queue_runners(sess=sess)
for i in range(15000):  # 20000image_batch, label_batch = sess.run([images_train, labels_train])label_b = np.eye(10, dtype=float)[label_batch]  # one hottrain_step.run(feed_dict={x: image_batch, y: label_b}, session=sess)if i % 200 == 0:train_accuracy = accuracy.eval(feed_dict={x: image_batch, y: label_b}, session=sess)print("step %d, training accuracy %g" % (i, train_accuracy))image_batch, label_batch = sess.run([images_test, labels_test])
label_b = np.eye(10, dtype=float)[label_batch]  # one hot
print("finished! test accuracy %g" % accuracy.eval(feed_dict={x: image_batch, y: label_b}, session=sess))

优化卷积核

将5X5 的滤波器转化为5X1和1X5两个,减少计算量

#########################################################new########
W_conv21 = weight_variable([5, 1, 64, 64])
b_conv21 = bias_variable([64])
h_conv21 = tf.nn.relu(conv2d(h_pool1, W_conv21) + b_conv21)W_conv2 = weight_variable([1, 5, 64, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_conv21, W_conv2) + b_conv2)
###########################################################old#########
# W_conv2 = weight_variable([5, 5, 64, 64])
# b_conv2 = bias_variable([64])
# h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
###################################################################

使用tf卷积函数简化代码

def convolution(inputs,num_outputs,kernel_size,stride=1,padding='SAME',data_format=None,rate=1,activation_fn=nn.relu,normalizer_fn=None,normalizer_params=None,weights_initializer=initializers.xavier_initializer(),weights_regularizer=None,biases_initializer=init_ops.zeros_initializer(),biases_regularizer=None,reuse=None,variables_collections=None,outputs_collections=None,trainable=True,scope=None):

常用的参数说明如下:

  • inputs:形状为[batch_size, height, width, channels]的输入。
  • num_outputs:代表输出几个channel。这里不需要再指定输入的channel了,因为函数会自动根据inpus的shpe去判断。
  • kernel_size:卷积核大小,不需要带上batch和channel,只需要输入尺寸即可。[5,5]就代表5x5的卷积核,如果长和宽都一样,也可以只写一个数5.
  • stride:步长,默认是长宽都相等的步长。卷积时,一般都用1,所以默认值也是1.如果长和宽都不相等,也可以用一个数组[1,2]。
  • padding:填充方式,'SAME'或者'VALID'。
  • activation_fn:激活函数。默认是ReLU。也可以设置为None
  • weights_initializer:权重的初始化,默认为initializers.xavier_initializer()函数。
  • weights_regularizer:权重正则化项,可以加入正则函数。biases_initializer:偏置的初始化,默认为init_ops.zeros_initializer()函数。
  • biases_regularizer:偏置正则化项,可以加入正则函数。
  • trainable: 是否可训练,如作为训练节点,必须设置为True,默认即可。如果我们是微调网络,有时候需要冻结某一层的参数,则设置为False。
import cifar10_input
import tensorflow as tf
import numpy as npbatch_size = 128
data_dir = '/tmp/cifar10_data/cifar-10-batches-bin'
print("begin")
images_train, labels_train = cifar10_input.inputs(eval_data=False, data_dir=data_dir, batch_size=batch_size)
images_test, labels_test = cifar10_input.inputs(eval_data=True, data_dir=data_dir, batch_size=batch_size)
print("begin data")# tf Graph Input
x = tf.placeholder(tf.float32, [None, 24, 24, 3])  # cifar data image of shape 24*24*3
y = tf.placeholder(tf.float32, [None, 10])  # 0-9 数字=> 10 classesx_image = tf.reshape(x, [-1, 24, 24, 3])h_conv1 = tf.contrib.layers.conv2d(x_image, 64, [5, 5], 1, 'SAME', activation_fn=tf.nn.relu)
h_pool1 = tf.contrib.layers.max_pool2d(h_conv1, [2, 2], stride=2, padding='SAME')h_conv2 = tf.contrib.layers.conv2d(h_pool1, 64, [5, 5], 1, 'SAME', activation_fn=tf.nn.relu)
h_pool2 = tf.contrib.layers.max_pool2d(h_conv2, [2, 2], stride=2, padding='SAME')nt_hpool2 = tf.contrib.layers.avg_pool2d(h_pool2, [6, 6], stride=6, padding='SAME')nt_hpool2_flat = tf.reshape(nt_hpool2, [-1, 64])y_conv = tf.contrib.layers.fully_connected(nt_hpool2_flat, 10, activation_fn=tf.nn.softmax)cross_entropy = -tf.reduce_sum(y * tf.log(y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))sess = tf.Session()
sess.run(tf.global_variables_initializer())
tf.train.start_queue_runners(sess=sess)
for i in range(15000):  # 20000image_batch, label_batch = sess.run([images_train, labels_train])label_b = np.eye(10, dtype=float)[label_batch]  # one hottrain_step.run(feed_dict={x: image_batch, y: label_b}, session=sess)if i % 200 == 0:train_accuracy = accuracy.eval(feed_dict={x: image_batch, y: label_b}, session=sess)print("step %d, training accuracy %g" % (i, train_accuracy))image_batch, label_batch = sess.run([images_test, labels_test])
label_b = np.eye(10, dtype=float)[label_batch]  # one hot
print("finished! test accuracy %g" % accuracy.eval(feed_dict={x: image_batch, y: label_b}, session=sess))

TensorFlow cifar 卷积网络相关推荐

  1. tensorflow多层卷积网络实现CNN文本分类

    1.实验数据获取: 这里的实验数据是本人自己提取的,具体方式是: (大家可以根据自己喜好进行如下步骤) 1.选取3个不同类别的文本,每类500篇,共1500篇. 2.使用TF-IDF或词频等方式,从每 ...

  2. TF之CNN:Tensorflow构建卷积神经网络CNN的简介、使用方法、应用之详细攻略

    TF之CNN:Tensorflow构建卷积神经网络CNN的简介.使用方法.应用之详细攻略 目录 TensorFlow 中的卷积有关函数入门 1.tf.nn.conv2d函数 案例应用 1.TF之CNN ...

  3. TensorFlow基于cifar10数据集实现进阶的卷积网络

    TensorFlow基于cifar10数据集实现进阶的卷积网络 学习链接 CIFAR10模型及数据集介绍 综述 CIFAR10数据集介绍 CIFAR10数据集可视化 CIFAR10模型 CIFAR10 ...

  4. 【Tensorflow】深度学习实战02——Tensorflow实现进阶的卷积网络(CIFAR-10)

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 之前使用Tensorflow实现了一个简单卷积神经网络用于手写数字识别,那是一个简单的 ...

  5. tensorflow包_在Keras和Tensorflow中使用深度卷积网络生成Meme(表情包)文本

    作者 | dylan wenzlau 来源 | Medium 编辑 | 代码医生团队 本文介绍如何构建深度转换网络实现端到端的文本生成.在这一过程中,包括有关数据清理,训练,模型设计和预测算法相关的内 ...

  6. 【Tensorflow】深度学习实战01——Tensorflow实现简单的卷积网络(MNIST)

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 现在深度学习可以说很是热门,自己也非常感兴趣,之前有看过吴恩达老师的课程,也看过一些书 ...

  7. 英伟达RTX 3080值不值得抢?在TensorFlow上训练了卷积网络

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习> ...

  8. tensorflow实现卷积神经网络——经典网络(LeNet5、AlexNet、VGG-16、ResNet)

    网络介绍: https://blog.csdn.net/loveliuzz/article/details/79131131 https://blog.csdn.net/jiaoyangwm/arti ...

  9. 开源|如何利用Tensorflow实现语义分割全卷积网络(附源码)

    导读:本项目是基于论文<语义分割全卷积网络的Tensorflow实现>的基础上实现的,该实现主要是基于论文作者给的参考代码.该模型应用于麻省理工学院(http://sceneparsing ...

  10. Lesson 16.5 在Pytorch中实现卷积网络(上):卷积核、输入通道与特征图在PyTorch中实现卷积网络(中):步长与填充

    卷积神经网络是使用卷积层的一组神经网络.在一个成熟的CNN中,往往会涉及到卷积层.池化层.线性层(全连接层)以及各类激活函数.因此,在构筑卷积网络时,需从整体全部层的需求来进行考虑. 1 二维卷积层n ...

最新文章

  1. 内存映射文件(File Mapping)API
  2. 神策数据简宁:如何更好地借助数据驱动产品价值提升?
  3. 通过Spring Boot了解H2 InMemory数据库
  4. 访问数据库时如何解决并发问题
  5. solaris中如何新建一个用户登录
  6. java编写蠕虫病毒_网络蠕虫病毒代码分析
  7. Redis 复制、Sentinel的搭建和原理说明
  8. 5101是多大的电阻_电阻标准阻值换算表
  9. 开源音乐软件——落雪
  10. PKU四日游(信息科学夏令营)
  11. 关于印发《2000国家大地坐标系推广使用技术指南》和《大地测量控制点坐标转换技术规程》的函
  12. unity如何调用另一个脚本中的变量
  13. .split()用法解释
  14. phpyun人才系统 短信配置教程
  15. Visual Studio 2019 和 qt 5.15.1 下 opengl 的运用 - Lighting - 06 - MultipleLights
  16. MySQL 汉字提取首字母、姓名首字母全拼、姓名转拼音
  17. 我的学校网页期末作业(纯html+css实现)
  18. [教程]使用 Git 克隆指定分支
  19. 快播侵权上榜登北京互联网十大版权事件
  20. 未来一周天气变化(最高温度和最低温度)(图表以及详细的注释)

热门文章

  1. css中url用法,css cursor url用法格式详解
  2. Oracle 同义词,赋权语句图解记录
  3. python--实现汇率转换
  4. 循环链表解决约瑟夫问题
  5. 注册google的gmail邮箱显示此手机号无法用于验证--解决
  6. 朱利亚 matlab分形图,分形实例的赏析
  7. 关于爬虫学习的一些小小记录(二)——正则表达式匹配
  8. sap 双计量单位_SAP 基本计量单位更改(转载)
  9. cdr 表格自动填充文字_cdr中看似简单的小工具,你真的会用吗?
  10. ASP.NET ZERO 学习 —— (1) 介绍