首页 > 其他分享 >利用tensorflow实现简单的卷积神经网络——迁移学习小记(二)

利用tensorflow实现简单的卷积神经网络——迁移学习小记(二)

时间:2023-03-24 15:02:02浏览次数:40  
标签:采样 卷积 tf shape variable tensorflow mnist 小记


一、什么是神经网络(CNN)

    卷积神经网络(Convolutional Neural Network,简称CNN),是一种前馈神经网络,人工神经元可以影响周围单元,可以进行大型图像处理。卷积神经网络包括卷积层和池化层。卷积神经网络是受到生物思考方式的启发的MLPs(多层感知器),它有着不同的类别层次,并且各层的工作方式和作用也不同。

  在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。在CNN的一个卷积层中,通常包含若干个特征平面(featureMap),每个特征平面由一些矩形的神经元排列组成,同一特征平面的神经元共享权值,这里共享权值就是卷积核。卷积核一般以随机小数矩阵的形式初始化,在网络训练的过程中卷积核将学习得到合理的权值。共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。子采样又叫池化(pooling),通常有均值子采样(mean pooling)和最大值子采样(max pooling)两种形式。子采样可以看作是一种特殊的卷积过程。卷积和子采样大大简化了模型复杂度,减少了模型的参数。

1.1 局部感受野

  为降低参数数目,采用局部感知野。对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。网络部分联通思想,也是受启发于生物学中的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。如下图:左为全连接,右为局部连接。

利用tensorflow实现简单的卷积神经网络——迁移学习小记(二)_卷积

1.2权值共享

即让一组神经元使用相同的连接权。在卷积层中,每个卷积核都是一种特征提取方式,卷积核的过程就是两个层之间的连接参数,而这些参数在图像的不同区域是局部,且在局部是共享的。所以,如果卷积核的大小是m*n,那么对应参数的数目就是m*n。

利用tensorflow实现简单的卷积神经网络——迁移学习小记(二)_子采样_02

1.4多卷积核

为了提取足够充分的特征,我们可以添加多个卷积核,比如32个卷积核可以学习32种特征。多个卷积核的情况如下。

利用tensorflow实现简单的卷积神经网络——迁移学习小记(二)_卷积_03

1.5池化(pooling)

子采样有两种方式,一种是均值子采样(mean-pooling),一种是最大值子采样(max-pooling)。两种子采样可以看成是特殊的卷积过程,如下图所示:

(1)均值子采样的卷积核中每个权重都是0.25,卷积核在原图inputX上的滑动步长为2.均值子采样效果相当于把原图模糊缩减至原来的1/4.

(2)最大值子采样的卷积核中各权值中只有一个1,其余为0,卷积核中为1

的位置对应inputX被卷积核覆盖部分最大值的位置。卷积核在原图inputX上滑动步长为2.最大值子采样的效果是把原图缩小至原来的1/4,并保每个2*2区域的最强输入。

利用tensorflow实现简单的卷积神经网络——迁移学习小记(二)_卷积核_04

详细概念,在下面这个blog中有阐述。

二、实现简单cnn

前面阐述了一些理论,下面上具体代码,代码中有注释

'''导入mnist数据集,创建默认的interactive session'''
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data", one_hot = True)
sess = tf.InteractiveSession()
#定义权重和偏差的初始化函数
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')

def max_pool_2_2(x):
    return tf.nn.max_pool(x, ksize = [1, 2, 2, 1], strides = [1, 2, 2, 1], padding = 'SAME')
#定义输入的placehoder,x是特征,y_是真实的label。因为卷积神经网络会用到2D的空间信息,所以需要把784维数据恢复成28*28结构,使用的是tf.shape函数
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
x_image = tf.reshape(x, [-1, 28, 28, 1])
#定义第一个卷积层
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2_2(h_conv1)
#定义第二个卷积层
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2_2(h_conv2)
#定义第一个全连接层
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
#在数据较小情况下,为防止过拟合,随机将一些结点置零,增加网络泛化能力
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_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)
#定义损失函数和训练的步骤,用adam优化器最小化损失函数
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices = [1]))
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, tf.float32))
#对全局变量进行初始化,迭代2000训练,使用的minibatch为50,所以总共训练的样本数量为10万
tf.global_variables_initializer().run()
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, y_: mnist.test.labels, keep_prob: 1.0}))

训练结果如下

利用tensorflow实现简单的卷积神经网络——迁移学习小记(二)_子采样_05

三、部分细节阐释

3.1

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data", one_hot = True)
sess = tf.InteractiveSession()

在线下载mnist数据集时,有可能会出现网络连接错误。我们可以选择先将数据集下载到本地,然后下载路径即可。

3.2

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)

#tf.truncated_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None) 从截断的正态分布中输出随机值。生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择。

参数:

shape:一维张量,也是输出张量。

mean:正态分布的均值

stddev:正态分布的标准差

dtype:输出类型

seed:一个整数,当设置之后,每次生成的随机数都一样

name:操作的名字

这个函数产生正态分布,均值和标准差都是自己设定。

#tf.Variable.init(inital_value,trainable=True,collections=None,validate_shape=True,name=None)

利用tensorflow实现简单的卷积神经网络——迁移学习小记(二)_子采样_06

 只有第一个参数initial_value是必须的。

因为在tensorFlow的世界里,变量的定义和初始化是分开的,所有关于图变量的赋值和计算都要通过tf.Session的run来进行。想要将所有图变量进行集体初始化时,应该使用tf.global_variables_initializer.

tf.Variable是定义图变量的一种方式,另一种是tf.get_variable,其必需参数(第一个参数)并不是图变量的初始值,而是图变量的名称。但tf.Variable的用法更要丰富一点,当指定名称的图变量已经存在时表示获取它,当指定名称的图变量不存在时表示定义它。

3.3

tf.nn.conv2d(input,w,strides,padding)

其中input为输入,格式为[batch,height,width,channels],分别为【输入的批次数量,图像的高(行数),宽(列数),通道(彩色为3,灰色为1)】

w为卷积矩阵,二维,分别为【高,宽】

strides为滑动窗口尺寸,分别为[1,height,width,1],通常strides[0]=strdes[3]=1,因为一般不会在一个个图像,一个个通道之间滑动

padding为扩展方式,有vaild和same(vaild是采用丢弃的方式,比如上述的input_width=13,只允许滑动2次,多余的全部丢掉;same的方式,采用补全方式,对于上述情况,允许滑动三次,但是需要补三个元素,左奇右偶,在左边补一个0,右边补两个0)

鉴于篇幅问题,下一篇中将函数等再做相应介绍。

标签:采样,卷积,tf,shape,variable,tensorflow,mnist,小记
From: https://blog.51cto.com/u_15955908/6147299

相关文章

  • 问题:tensorflow指定了gpu运行,依旧使用cpu
    1、首先检查当前环境的cpu,gpu设备信息fromtensorflow.python.clientimportdevice_libas_device_liblocal_device_protos=_device_lib.list_local_devices()devi......
  • 2023/3/23小记
    距离省选还有8天因为睡了太久所以摆烂,整理了一下自己的blog。以后打算好好写一写了awa。中午打arc被光老师抓了。下午打算水点题,听说有体育课。 做题记录......
  • CNN卷积神经
    1.概念CNN->深度学习模型,主要用于图像识别、语音识别、自然语言处理等。2.卷积操作1.滑动卷积核(一个小矩阵、滤波器)对输入图像进行特征提取2.滑动在图像上,对每个位......
  • 卷积神经网络理论
    卷积基本概念卷积操作感受野计算RFi =(RFi+1-1)xsi+Kisi为第i层的步长,Ki为第i层卷积核大小。数据填充图像填充后卷积输出的维度:n:图像大小f:卷积核大小p:填......
  • 小记:踩搭到海光服务器的坑
    日前,采购了一台海光服务器然后怎么安装anolis8.4的及centos8.4之前的各种操作系统都会失败,要么是安装操作系统直接黑屏,要么是安装操作系统完成后直接黑屏。。。找厂家,技......
  • tensorflow与python版本、cuDNN版本和CUDA版本对应关系
    链接:https://tensorflow.google.cn/install/source_windows?hl=zh-cn#gpu推荐使用tensorflow==2.1.0......
  • 基于OFDM的通信链路误码率matlab仿真,采用多径信道,卷积编码,16QAM
    1.算法描述在通信系统中,信道所能提供的带宽通常比传送一路信号所需的带宽要宽得多。如果一个信道只传送一路信号是非常浪费的,为了能够充分利用信道的带宽,就可以采用频分复......
  • 基于OFDM的通信链路误码率matlab仿真,采用多径信道,卷积编码,16QAM
    1.算法描述        在通信系统中,信道所能提供的带宽通常比传送一路信号所需的带宽要宽得多。如果一个信道只传送一路信号是非常浪费的,为了能够充分利用信道的带宽......
  • 3.19 小记
    有一个问题是我最近做题效率超级超级差。先写一写以前做过的题吧。CF923EPerpetualSubtraction懒得打公式捏。收录到各种多项式和生成函数科技题里面了P4005小Y......
  • tensorflow解决回归问题简单案列
    1待拟合函数noise服从均值为0,方差为15的正太分布,即noise~N(0,15)。2基于模型的训练根据散点图分布特点,猜测原始数据是一个二次函数模型,如下:其中,a,b,c为待训练参......