用tensorflow搭建CNN的方法

CNN(Convolutional Neural Networks) 卷积神经网络简单讲就是把一个图片的数据传递给CNN,原涂层是由RGB组成,然后CNN把它的厚度加厚,长宽变小,每做一层都这样被拉长,最后形成一个分类器

在 CNN 中有几个重要的概念:

  1. stride
  2. padding
  3. pooling

stride,就是每跨多少步抽取信息。每一块抽取一部分信息,长宽就缩减,但是厚度增加。抽取的各个小块儿,再把它们合并起来,就变成一个压缩后的立方体。

padding,抽取的方式有两种,一种是抽取后的长和宽缩减,另一种是抽取后的长和宽和原来的一样。

pooling,就是当跨步比较大的时候,它会漏掉一些重要的信息,为了解决这样的问题,就加上一层叫pooling,事先把这些必要的信息存储起来,然后再变成压缩后的层

利用tensorflow搭建CNN,也就是卷积神经网络是一件很简单的事情,笔者按照官方教程中使用MNIST手写数字识别为例展开代码,整个程序也基本与官方例程一致,不过在比较容易迷惑的地方加入了注释,有一定的机器学习或者卷积神经网络制式的人都应该可以迅速领会到代码的含义。

#encoding=utf-8
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
def weight_variable(shape):
  initial = tf.truncated_normal(shape,stddev=0.1) #截断正态分布,此函数原型为尺寸、均值、标准差
  return tf.Variable(initial)
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') # strides第0位和第3为一定为1,剩下的是卷积的横向和纵向步长
def max_pool_2x2(x):
  return tf.nn.max_pool(x,ksize = [1,2,2,1],strides=[1,2,2,1],padding='SAME')# 参数同上,ksize是池化块的大小 

x = tf.placeholder("float", shape=[None, 784])
y_ = tf.placeholder("float", shape=[None, 10]) 

# 图像转化为一个四维张量,第一个参数代表样本数量,-1表示不定,第二三参数代表图像尺寸,最后一个参数代表图像通道数
x_image = tf.reshape(x,[-1,28,28,1]) 

# 第一层卷积加池化
w_conv1 = weight_variable([5,5,1,32]) # 第一二参数值得卷积核尺寸大小,即patch,第三个参数是图像通道数,第四个参数是卷积核的数目,代表会出现多少个卷积特征
b_conv1 = bias_variable([32]) 

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,32,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) 

# 原图像尺寸28*28,第一轮图像缩小为14*14,共有32张,第二轮后图像缩小为7*7,共有64张 

w_fc1 = weight_variable([7*7*64,1024])
b_fc1 = bias_variable([1024]) 

h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64]) # 展开,第一个参数为样本数量,-1未知
f_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,w_fc1)+b_fc1) 

# dropout操作,减少过拟合
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(f_fc1,keep_prob) 

w_fc2 = weight_variable([1024,10])
b_fc2 = bias_variable([10])
y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop,w_fc2)+b_fc2) 

cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv)) # 定义交叉熵为loss函数
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.InteractiveSession()
sess.run(tf.initialize_all_variables())
for i in range(2000):
 batch = mnist.train.next_batch(50)
 if i%100 == 0:
  train_accuracy = accuracy.eval(feed_dict={x:batch[0], y_: batch[1], keep_prob: 1.0})
  print "step %d, training accuracy %g"%(i, train_accuracy)
 train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) 

print "test accuracy %g"%accuracy.eval(feed_dict={x: mnist.test.images[0:500], y_: mnist.test.labels[0:500], keep_prob: 1.0}) 

在程序中主要注意这么几点:

1、维度问题,由于我们tensorflow基于的是张量这样一个概念,张量其实就是维度扩展的矩阵,因此维度特别重要,而且维度也是很容易使人迷惑的地方。

2、卷积问题,卷积核不只是二维的,多通道卷积时卷积核就是三维的

3、最后进行检验的时候,如果一次性加载出所有的验证集,出现了内存爆掉的情况,由于是使用的是云端的服务器,可能内存小一些,如果内存够用可以直接全部加载上看结果

4、这个程序原始版本迭代次数设置了20000次,这个次数大约要训练数个小时(在不使用GPU的情况下),这个次数可以按照要求更改。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 详解tensorflow训练自己的数据集实现CNN图像分类
  • python tensorflow基于cnn实现手写数字识别
(0)

相关推荐

  • 详解tensorflow训练自己的数据集实现CNN图像分类

    利用卷积神经网络训练图像数据分为以下几个步骤 1.读取图片文件 2.产生用于训练的批次 3.定义训练的模型(包括初始化参数,卷积.池化层等参数.网络) 4.训练 1 读取图片文件 def get_files(filename): class_train = [] label_train = [] for train_class in os.listdir(filename): for pic in os.listdir(filename+train_class): class_train.app

  • python tensorflow基于cnn实现手写数字识别

    一份基于cnn的手写数字自识别的代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 加载数据集 mnist = input_data.read_data_sets('MNIST_data', one_hot=True) # 以交互式方式启动session # 如果不使用交互式session,则在启动s

  • 用tensorflow搭建CNN的方法

    CNN(Convolutional Neural Networks) 卷积神经网络简单讲就是把一个图片的数据传递给CNN,原涂层是由RGB组成,然后CNN把它的厚度加厚,长宽变小,每做一层都这样被拉长,最后形成一个分类器 在 CNN 中有几个重要的概念: stride padding pooling stride,就是每跨多少步抽取信息.每一块抽取一部分信息,长宽就缩减,但是厚度增加.抽取的各个小块儿,再把它们合并起来,就变成一个压缩后的立方体. padding,抽取的方式有两种,一种是抽取后的

  • tensorflow基于CNN实战mnist手写识别(小白必看)

    很荣幸您能看到这篇文章,相信通过标题打开这篇文章的都是对tensorflow感兴趣的,特别是对卷积神经网络在mnist手写识别这个实例感兴趣.不管你是什么基础,我相信,你在看完这篇文章后,都能够完全理解这个实例.这对于神经网络入门的小白来说,简直是再好不过了. 通过这篇文章,你能够学习到 tensorflow一些方法的用法 mnist数据集的使用方法以及下载 CNN卷积神经网络具体python代码实现 CNN卷积神经网络原理 模型训练.模型的保存和载入 Tensorflow实战mnist手写数字

  • Python神经网络TensorFlow基于CNN卷积识别手写数字

    目录 基础理论 一.训练CNN卷积神经网络 1.载入数据 2.改变数据维度 3.归一化 4.独热编码 5.搭建CNN卷积神经网络 5-1.第一层:第一个卷积层 5-2.第二层:第二个卷积层 5-3.扁平化 5-4.第三层:第一个全连接层 5-5.第四层:第二个全连接层(输出层) 6.编译 7.训练 8.保存模型 代码 二.识别自己的手写数字(图像) 1.载入数据 2.载入训练好的模型 3.载入自己写的数字图片并设置大小 4.转灰度图 5.转黑底白字.数据归一化 6.转四维数据 7.预测 8.显示

  • python人工智能tensorflow函数tensorboard使用方法

    目录 tensorboard相关函数及其常用参数设置 1 with tf.name_scope(layer_name): 2 tf.summary.histogram(layer_name+"/biases",biases) 3 tf.summary.scalar(“loss”,loss) 4 tf.summary.merge_all() 5 tf.summary.FileWriter(“logs/”,sess.graph) 6 write.add_summary(result,i)

  • Hibernate环境搭建与配置方法(Hello world配置文件版)

    本文实例讲述了Hibernate环境搭建与配置方法.分享给大家供大家参考,具体如下: 1.下载hibernate jar包:hibernate-release-4.3.5.Final,导入必要的jar包,路径为:hibernate-release-4.3.5.Final\lib\required. 包含的jar包有10个. 2.建立新的java项目. 3.学习自己建立User Library: (a)项目右键--build path--configure build path--add libr

  • Linux环境下快速搭建ftp服务器方法介绍

    本文研究的主要是Linux环境下快速搭建ftp服务器方法,具体如下.首先看看ftp的介绍: FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件.在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上

  • Docker实践之搭建wordpress的方法

    WordPress是一个非常著名的PHP编写的博客平台,发展到目前为止已经形成了一个庞大的网站平台系统.在WP上有规模庞大的插件和主题,可以帮助我们快速建立一个博客甚至网站. 在Windows上可以非常方便的安装WordPress,因为IIS上集成了WordPress的一键安装包.而在Linux上安装WordPress就比较复杂了,我们需要配置PHP环境.Apache或者Nginx服务器.MySQL数据库以及各种权限和访问问题.所以在Linux上最好的办法就是使用Docker来安装WordPre

  • CentOS 6.5 环境实现本地局域网搭建YUM的方法【基于FTP】

    本文实例讲述了CentOS 6.5 环境实现本地局域网搭建YUM的方法.分享给大家供大家参考,具体如下: 前面介绍了Centos 6.5环境本地局域网基于HTTP搭建YUM的方法,这里再来说明一下基于FTP的YUM搭建方法. 服务端配置 创建挂载目录 mkdir /media/CentOS_6.5_Final 赋予挂载目录权限 chmod -R 777 /media/CentOS_6.5_Final 挂载iso mount -o loop -t CentOS-6.5-x86_64-bin-DVD

  • Centos 6.5环境实现本地局域网搭建YUM的方法【基于HTTP】

    本文实例讲述了Centos 6.5环境实现本地局域网搭建YUM的方法.分享给大家供大家参考,具体如下: 一.yum 简介: yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的开发者Terra Soft 研发,用python 写成,那时还叫做yup(yellow dog updater),后经杜克大学的Linux@Duke 开发团队进行改进,遂有此名.yum 的宗旨是

  • LNMP环境下搭建yum的方法分析

    本文实例讲述了LNMP环境下搭建yum的方法.分享给大家供大家参考,具体如下: 今天弄了下socket扩展,把我原来的环境搞坏掉了 posix这个扩展被我搞坏掉了 唉 所以从新装一下 首先yum先看下lnmp环境 检查nginx php mysql 是否存在 命令:which php 如果存在就先卸载掉 yum remove mysql yum remove php yum remove nginx 然后查看 rpm -qa|grep -i php 用命令:rpm -e (刚刚查出来的数据) -

随机推荐