前言
一、卷积神经网络
1、卷积神经网络的结构:
(1)卷积层过滤器:(相当于观察窗口,里面有权重,移动来观察)
(2)激活函数:f(x) = max(0,x)
(3)池化层(Pooling)计算
(4)卷积网络API介绍:
二、案例实现
总结
关于python深度学习(tensorflow 1.x版本)学习笔记06——神经网络(叁),本文通过学习视频《python深度学习》整理学习笔记。视频学习地址:https://www.bilibili.com/video/BV1Wt411C75s/
输入体积大小H1 * W1 * D1
四个超参数:
。Filter数量K
。Filter大小F
。步长S
。零填充大小P
输出体积大小H2 * W2 * D2
。H2 = (H1-F+2P)/S+1
。W2 = (W1-F+2P)/S+1
。D2 = K
卷积计算过程:(一个通道一个Filter一个步长)
增加激活函数:增加网络的非线性分割能力
学习率一般为【0.03,0.01,0.003,0.001,0.0001】
Pooling层主要作用是特征提取,通过去掉Feature Map中不重要的样本,进一步减少参数的数量。Pooling的方法有很多种,最常用的是Max Pooling(2*2,2步长)。Max Pooling的计算方法与卷积层计算法类似,也是用一个小的过滤器(filter),只不过是选择方框中最大的值,填入最后的结果表中。
池化层的API:
前面的卷积和池化相当于做特征工程,后面的全连接相当于做特征加权。最后的全连接层在整个卷积神经网络中起到“分类器”的作用。
实现手写数字图片识别卷积神经网络案例:
import os
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
os.environ["TF_CPP_MIN_LOG_LEVEL"] = '2'
tf.app.flags.DEFINE_integer("is_train", 1, "指定模型是训练还是预测")
FLAGS = tf.app.flags.FLAGS
# 定义一个初始化权重的函数
def weight_variables(shape):
w = tf.Variable(tf.random_normal(shape=shape, mean=0.0, stddev=1.0))
return w
# 定义一个初始化偏置的函数
def bias_variables(shape):
b = tf.Variable(tf.constant(0.0,shape=shape))
return b
def model():
"""
自定义的卷积模型
:return:
"""
# 1、准备数据的占位符 x【None, 784】 y_true【None, 10】
with tf.variable_scope("data"):
x = tf.placeholder(tf.float32, [None, 784])
y_true = tf.placeholder(tf.int32, [None, 10])
# 2、卷积层一 (卷积5*5*1,32个,strides=1、激活、池化)
with tf.variable_scope("conv1"):
# 随机初始化权重,初始化偏置
w_conv1 = weight_variables([5, 5, 1, 32])
b_conv1 = bias_variables([32])
# 对x进行形状的改变[None, 784] [None, 28, 28, 1],因为改变的行数不知道,故行数那里填-1,这里改变形状采用的是动态改变形状
x_reshape = tf.reshape(x, [-1, 28, 28, 1])
# 步长为1,这样写表示上下左右移动的步长都是1,再进行激活
# [None, 28, 28, 1]---------->[None, 28, 28, 32]
x_relu1 = tf.nn.relu(tf.nn.conv2d(x_reshape, w_conv1, strides=[1, 1, 1, 1], padding="SAME") + b_conv1)
# 池化窗口大小 2* 2,步长为2,[None, 28, 28, 32]-------->[None, 14, 14, 32]
x_pool1 = tf.nn.max_pool(x_relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
# 3、卷积层二(卷积5*5*32,64个filter,strides=1,激活tf.nn.relu,池化)
with tf.variable_scope("cov2"):
# 随机初始化权重,权重[5,5,32,64] 偏置[64]
w_conv2 = weight_variables([5, 5, 32, 64])
b_conv2 = bias_variables([64])
# 卷积,激活,池化计算:64个过滤器,步长为1,padding = "SAME" , bias=64
# [None, 14, 14, 32]---------->[None, 14, 14, 64]
x_relu2 = tf.nn.relu(tf.nn.conv2d(x_pool1, w_conv2, strides=[1, 1, 1, 1], padding="SAME") + b_conv2)
# 池化窗口大小 2* 2,步长为2,[None, 14, 14, 64]-------->[None, 7, 7, 64]
x_pool2 = tf.nn.max_pool(x_relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
# 4.全连接层 [None, 7, 7, 64]----->[None, 7*7*64] * [7*7*64, 10] +[10] = [None, 10]
with tf.variable_scope("conv2"):
# 1.随机初始化权重和偏置
w_fc = weight_variables([7 * 7 * 64, 10])
b_fc = bias_variables([10])
# 2.进行矩阵运算,得出每个样本的10个结果,修改形状
x_reshape1 = tf.reshape(x_pool2, [-1, 7 * 7 * 64])
y_predict = tf.matmul(x_reshape1, w_fc) + b_fc
return x, y_true, y_predict
def conv_fc():
# 1.获取真实数据
mnist = input_data.read_data_sets("./data/mnist/input_data", one_hot=True)
# 2.定义模型,得出输出
x, y_true, y_predict = model()
# 3.进行交叉熵损失计算
with tf.variable_scope("soft_cross"):
# 求平均交叉熵损失
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
# 4.梯度下降求出损失
with tf.variable_scope("optimizer"):
train_op = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
# 5.计算准确率
with tf.variable_scope("acc"):
equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
# equal_list None个样本 [1, 1, 1, 0, ..............1]]
accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()
# 开启会话去训练
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 循环迭代步数去训练,更新参数预测
for i in range(1000):
# 取出真实存在的特征值和目标值
mnist_x, mnist_y = mnist.train.next_batch(50)
# 运行train_op训练
sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})
# 写入每步训练的值
summary = sess.run(merged, feed_dict={x: mnist_x, y_true: mnist_y})
# 添加到写入的文件当中
filewriter.add_summary(summary, i)
print("训练第%d步,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))
return None
if __name__ == "__main__":
conv_fc()
以上是通过学习视频《Python深度学习(tensorflow)》整理学习笔记,关于利用tensorflow实现神经网络,本篇主要记录了卷积神经网络的基本知识介绍以及通过卷积神经网络来实现手写数字图片的识别练习。