Tensorflow08-卷积神经网络

来源:互联网 发布:淘宝卖家漏发货不承认 编辑:程序博客网 时间:2024/06/11 22:15
1.卷积神经网络的运作:
神经网络由一连串的神经层组成,每一层神经层里存在着很多的神经元用于识别
每一种神经网络都有它的输入值和输出值,当输入值很多比如图片(很多像素)使用卷积神经网络
卷积:对图片上一小块像素区域进行处理,加强了连续性,使得神经网络能看到一个图形而不是一个点,加强了神经网络对图片的理解
卷积神经网络有一个批量过滤器,持续不断地在图片上滚动,收集一块像素区域的信息
然后整理信息使得有一些实际的呈现比如能看到一些边缘的信息
然后神经网络总结出一些更高层的信息结构如眼睛、鼻子
再经过一次过滤,将眼睛、鼻子这些信息套入普通的全连接网络进行分类
2.图片如何被卷积
一开始图片的高度为通道数
卷积后图片变的长宽更小,高度更高,获得边缘信息,再进行多次卷积,压缩长宽、增加高度,获得更深的理解
将这样的图片嵌入普通的分类神经层中,就能对图片进行分类
在每次卷积中,图片可能会无意丢失一些信息,池化pooling可以解决这个问题
pooling:每次卷积不压缩长宽,保留更多信息,压缩的工作交给池化,可以提高准确性
3.常见的结构:输入image->卷积层convolution->max pooling->convolution->max pooling->全链接神经层fully connected->fully connected->classifier

CNN就是使用kernel遍历图片对每个kernel大小的像素图形处理压缩长宽、增加高度,从而将整个将图片变成厚度很大的分类器
stride为跨度,遍历时每次跳过的像素点,stride越大,压缩后的高度越高,patch即为kernel,有自己的长和宽
抽离padding时valid padding图片长宽会压缩,same padding图片长宽不变
跨度过长会丢失图片信息,使用跨度更小的same padding,再pooling
pooling:max pooling&average pooling

我们使用之前的mnist来进行测试

import tensorflow as tfimport input_datamnist = input_data.read_data_sets('MNIST_data', one_hot=True)def compute_accuracy(v_xs, v_ys):     global prediction     y_pre = sess.run(prediction, feed_dict={xs: v_xs, keep_prob: 1})     correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(v_ys,1))     accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))     result = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys, keep_prob: 1})     return resultdef 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) # 之后会从0.1变到其他值,一般用正值    return tf.Variable(initial)def conv2d(x,W): # 定义卷积神经网络层    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME') # 输入为x参数,W为权重,stride为一个4元素向量,头尾必须是1,中间为水平和竖直方向的步长def max_pool_2x2(x):    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') # max_pooling,从卷积层传出的传入pooling中,pooling的卷积核大小为2x2,步长相应为2,起到压缩图片的效果# 定义神经网络的输入的placeholderxs=tf.placeholder(tf.float32,[None,784])ys=tf.placeholder(tf.float32,[None,10])keep_prob=tf.placeholder(tf.float32)x_image=tf.reshape(xs,[-1,28,28,1]) # xs包括了所有的图片例子,-1表示不管图片的维度,之后再定义,28,28表示像素点数,1表示一个通道(灰度图)# print(x_image.shape) # 【n_samples,28,28,1】# 定义第一个卷积层W_conv1=weight_variable([5,5,1,32]) # 传入形状,输出Variable,5x5是patch,1是in_size(1个单位,灰度高度为1),32是out_size(高度为32)b_conv1=bias_variable([32]) # 高度为32h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1) # 通过conv2d来处理x和W的关系,类似于y=W*x+b,并非线性化,输出大小为28x28x32(SAME不变长宽)h_pool1=max_pool_2x2(h_conv1) # 输出大小为14x14x32(步长为2,长宽缩小1倍)# 定义第二个卷积层W_conv2=weight_variable([5,5,32,64]) # 传入形状,输出Variable,5x5是patch,32是in_size(32个单位),64是out_size(高度为64)b_conv2=bias_variable([64]) # 高度为64h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2) # 通过conv2d来处理x和W的关系,类似于y=W*x+b,并非线性化,输出大小为14x14x64(SAME不变长宽)h_pool2=max_pool_2x2(h_conv2) # 输出大小为7x7x64(步长为2,长宽缩小1倍)# 定义第一个神经网络层W_fc1=weight_variable([7*7*64,1024]) # 输入的大小为第二层卷积层的输出形状(当作一维),输出为1024让它变得更高b_fc1=bias_variable([1024])h_pool2_flat=tf.reshape(h_pool2,[-1,7*7*64]) # {n_sample,7,7,64} >> [n_samples,7*7*64]h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1) #这一层的输出结果h_fc1_drop=tf.nn.dropout(h_fc1, keep_prob) # overfitting的处理# 定义第二个神经网络层W_fc2=weight_variable([1024,10]) # 输入的大小为第二层卷积层的输出形状(当作一维),输出为1024让它变得更高b_fc2=bias_variable([10])prediction=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2) #分类处理得到这一层的输出结果# 预测值和真实值之间的差异cross_entropy=tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1]))train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)sess=tf.Session()sess.run(tf.initialize_all_variables())for i in range(1000):    batch_xs,batch_ys=mnist.train.next_batch(100)    sess.run(train_step,feed_dict={xs:batch_xs,ys:batch_ys,keep_prob:0.5})    if i%50==0:        print(compute_accuracy(mnist.test.images[:1000],mnist.test.labels[:1000]))

结果(CPU占用很高):


0.20.7670.8820.9060.920.9330.9450.9420.9460.9530.9570.954......



P.S.可以先使用一般的神经网络去训练,如果效果不好可以再使用卷积神经网络


参考链接:

https://www.youtube.com/watch?v=hMIZ85t9r9A&list=PLXO45tsB95cKI5AIlf5TxxFPzb-0zeVZ8&index=24

原创粉丝点击