1、与传统多层神经网络对比
传统:输入层——隐藏层——输出层
卷积:输入层——隐藏层——(卷积层、激活层、池化层、全连接层)——输出层
2、发展历史
3、卷积神经网络-结构
卷积层 :通过在原始图像上平移来提取特征
激活层(激活函数):增加非线性分割能力
sigmoid:1/(1+e^-x)
1)计算量相对大
2)梯度消失
3)输入值得范围【-6,6】
relu:
1)计算速度快
2)解决了梯度消失
3)图像没有负的像素值
tf.nn.relu(feateres)
池化层(pooling layer subsample):利用图像像素点之间的联系,减少学习的参数,降低网络的复杂度(最大池化和平均池化)
tf.nn.max_pool(value,ksize=,strides=,psdding=)
value:
4-D Tensor形状[batch,height,width,channel]
ksize:
池化窗口大小,[1,ksize,ksize,1]
strides:
步长大小,[1,stride,stride,1]
padding:"SAME"
全连接层:进行损失计算并输出分类结果
4、案例:CNN-Mnist手写数字识别
1)网络设计
略
2)调参:
1、学习率
2、随机初始化的权重、偏置的值
3、选择好用的优化器
4、调整网络结构
3)代码
import tensorflow as tf
import os
from tensorflow.examples.tutorials.mnist import input_data
from tensorflow.contrib.slim.python.slim.nets.inception_v3 import inception_v3_base
#1、利用数据,在训练时候实时提供数据
#mnist手写数字数据在运行时候实时提供给占位符
tf.app.flags.DEFINE_integer ("is_train",1,"指定是否是训练模型,还是拿数据去预测")
FLAGS=tf.app.flags.FLAGS
def create_weight(shape):
return tf.Variable(initial_value=tf.random_normal(shape=shape))
def create_model(x):
"""
构建卷积神经网络
:param x:
:return:
"""
#1)第一个卷积大层
with tf.variable_scope("conv1"):
#卷积层
#将x[None,784]形状进行修改
input_x=tf.reshape(x,shape=[-1,28,28,1])
#定义filter和偏置
conv1_weight=create_weight(shape=[5,5,1,32])
conv1_bias=create_weight(shape=[32])
conv1_x=tf.nn.conv2d(input=input_x,filter=conv1_weight,strides=[1,1,1,1],padding="SAME")
#激活层
relu1_x=tf.nn.relu(conv1_x)
#池化层
pool1_x=tf.nn.max_pool(value=relu1_x,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
#2)第二个卷积大层
with tf.variable_scope("conv2"):
# 卷积层
# 定义filter和偏置
conv2_weight = create_weight(shape=[5, 5, 32, 64])
conv2_bias = create_weight(shape=[64])
conv2_x = tf.nn.conv2d(input=pool1_x, filter=conv2_weight, strides=[1, 1, 1, 1], padding="SAME")
# 激活层
relu2_x = tf.nn.relu(conv2_x)
# 池化层
pool2_x = tf.nn.max_pool(value=relu2_x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
#3)全连接层
with tf.variable_scope("full_connection"):
x_fc=tf.reshape(pool2_x,shape=[-1,7*7*64])
weights_fc=create_weight(shape=[7*7*64,10])
bias_fc=create_weight(shape=[10])
y_predict=tf.matmul(x_fc,weights_fc)+bias_fc
return y_predict
def full_connected_mnist():
"""
用全连接来对手写数字进行识别
:return:
"""
mnist = input_data.read_data_sets("./mnist_data/", one_hot=True)
#1、准备数据
#x[None,784] y_true [None 10]
with tf.variable_scope("mnist_data"):
x=tf.placeholder(tf.float32,[None,784])
y_true=tf.placeholder(tf.int32,[None,10])
y_predict=create_model(x)
#3、softmax回归以及交叉熵损失计算
with tf.variable_scope("softmax_crossentropy"):
#labels:真实值 [None,10] one_hot
#logits:全连层的输出[None,10]
#返回每个样本的损失值组成的列表
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))
#4、梯度下降优化损失
with tf.variable_scope("optimize"):
#学习率
train_op=tf.train.AdamOptimizer(0.001).minimize(loss)
#5、得出每次训练的准确率(通过真实值和预测值进行位置比较,每个样本都比较)
with tf.variable_scope("accurary"):
equal_list=tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))
accurary=tf.reduce_mean(tf.cast(equal_list,tf.float32))
#(2)收集要显示的变量
#先收集损失和准确率
tf.summary.scalar("losses",loss)
tf.summary.scalar("acc",accurary)
#初始化变量op
init_op=tf.global_variables_initializer()
#(3)合并所以变量op
merged=tf.summary.merge_all()
#保存和加载模型
saver=tf.train.Saver()
#开启会话去训练
with tf.Session() as sess:
sess.run(init_op)
#(1)创建一个events文件实例
file_writer=tf.summary.FileWriter("./tmp/summary",graph=sess.graph)
#加载模型
# if os.path.exists("./tmp/modelckpt/checkpoint"):
# saver.restore(sess,"./tmp/modelckpt/fc_nn_model")
if FLAGS.is_train == 1:
#循环步数去训练
for i in range(3000):
#获取数据,实时提供
#每步提供50个样本训练
mnist_x,mnist_y = mnist.train.next_batch(50)
#运行训练op
sess.run(train_op,feed_dict={x:mnist_x,y_true:mnist_y})
print("训练第%d步数的准确率为:%f,损失为:%f"%(i+1,
sess.run(accurary,feed_dict={x:mnist_x,y_true:mnist_y}),
sess.run(loss,feed_dict={x:mnist_x,y_true:mnist_y})
)
)
#运行合变量op,写入事件文件当中
summary=sess.run(merged,feed_dict={x:mnist_x,y_true:mnist_y})
file_writer.add_summary(summary,i)
# if i % 100 ==0:
# saver.save(sess,"./tmp/modelckpt/fc_nn_model")
else:
#如果不是训练,我们就去进行预测测试集数据
for i in range(100):
#每次拿一个样本预测
mnist_x,mnist_y=mnist.test.next_batch(1)
print("第%d个样本的真实值为:%d,模型预测结果为:%d"%(
i+1,
tf.argmax(sess.run(y_true,feed_dict={x:mnist_x,y_true:mnist_y}),1).eval(),
tf.argmax(sess.run(y_predict, feed_dict={x: mnist_x, y_true: mnist_y}),1).eval())
)
return None
if __name__=="__main__":
full_connected_mnist()