深度神经网络------>卷积神经网络
1,卷积神经网络与简单神经网络的比较
全连接网络的缺点:
- 参数太多,图片过大时,计算太多
- 没有利用像素之间位置信息
- 层数限制
2,卷积神经网络发展史
3,卷积神经网络结构
- 神经网络:输入层,隐藏层,输出层
- 卷积神经网络:隐藏层分为 卷积层过滤器:通过在原始图像上平移来提取特征,定义过滤器观察窗口(大小,步长)单位为像素 移动越过图片大小,例如步长过长,会导致最后一次越界,或不足(使用填充 0填充解决) 1,不越过,直接停止观察 (valid 取样面积小于总面积) 2,直接越过(same 取样面积和输入像素一致) 计算输入层----》卷积层输出后大小 Filter数量K,大小F,步长S,零填充大小P(填充的0的层数,Tensor是根据大小,步长求得的) 输入体积H*W*D 输出体积H1*W1*D1 H1=(H-F 2P)/S 1 W1=(W-F 2P)/S 1 D1=K
激活函数:增加网络的非线性分割的能力
sigmod f(x)=1/(1 e^(-x)) 计算量大,反向传播时 容易出现梯度爆炸
relu f(x)=max(0,x) 常用
数据经过多个filter后会变多
池化层:通过特征后稀疏参数来减少学习的参数,降低网络的复杂性。(最大池化和平均池化)
全连接层:前面的卷积和池化相当于特征工程,后面的全连接相当于特征加权,“全连接层”起到了分类器的作用
4,卷技网络API
tf.nn.conv2d(input,filter,strides,padding,name)
- input:出入的张量[batch,height,weight,channel] float32,64
- filter:指定过滤器[filter_height,filter_weight,图片通道数,filter 个数]
- padding:same(填充,变化后height,width不变),valid(超出部分舍弃)
tf.nn.relu(features,name) 激活函数
features:卷积后加上偏执的结果
tf.nn.max_pool(value,ksize,strides,padding,name)
value:4DTensor形状的【batch,height,weight,channels】
ksize:池化窗口大小 [1,ksize,ksize,1]
strides:步长大小 [1,strides,strides,1]
padding:
5,手写数字识别
图片比较大,类别多的时候使用定义过的网络例如googlenet
简单图片,自定义网络
一层卷积:
卷积:32个filter,5*5 1 SAME bias = 32 输入:【None,28,28,1】输出:【None,28,28,32】
激活:【None,28,28,32】
池化:2*2 strides=2 SAME bias = 64 输入:【None,28,28,1】输出:【None,14,14,32】
二层卷积:
卷积:64个filter,5*5 1 SAME 输入:【None,14,14,32】输出:【None,14,14,64】(64个过滤器 ,每层都是32个14*14相加)
激活:输出:【None,14,14,64】
池化:2*2 strides=2 SAM E 输入:【None,14,14,64】输出:【None,7,7,64】
全连接层FC
【None,7,7,64】---》【None,7*7*64】*【7*7*64,10】 -------------》【None,10】
代码语言:javascript复制# 定义一个权重初始化函数
def weight_variables(shape):
weight = tf.Variable(tf.random_normal(mean=0.0, stddev=1.0, shape=shape), name="w")
return weight
# 定义一个权重初始化函数
def bias_Variables(shape):
bias = tf.Variable(tf.constant(0.0, shape=shape), name="b")
return bias
# 自定义卷积模型
def model():
# 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, 激活 tf.nn.relu 池化
with tf.variable_scope("conv1"):
# 随机初始化权重
weight_conv1 = weight_variables([5, 5, 1, 32]) # 32个过滤器, 1表示图片通道数
# 随机偏置
bias_conv1 = bias_Variables([32])
# 对x进行形状的改变【None,784】 ----》 【None,28,28,1】
x_reshape = tf.reshape(x, [-1, 28, 28, 1])
# [None,28,28,1] ----->[None,28,28,32]
x_relu1 = tf.nn.relu(tf.nn.conv2d(x_reshape, weight_conv1, strides=[1, 1, 1, 1], padding="SAME") bias_conv1)
# 池化 2*2 strides2 [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")
with tf.variable_scope("conv2"):
# 3,二层卷积 卷积5*5*32 64 strides=1, 激活 tf.nn.relu 池化
# 初始化权重
weight_conv2 = weight_variables([5, 5, 32, 64])
bias_conv2 = bias_Variables([64])
# 卷积,激活
# [None,14,14,32] --->[None,14,14,64]
x_relu2 = tf.nn.relu(tf.nn.conv2d(x_pool1, weight_conv2, strides=[1, 1, 1, 1], padding="SAME") bias_conv2)
# 池化[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,全连接层
with tf.variable_scope("fc"):
# 初始化权重
weight_fc = weight_variables([7 * 7 * 64, 10])
bias_fc = bias_Variables([10])
# 修改形状 [None,7,7,64] --->[None,7*7*64]
x_fc_reshape = tf.reshape(x_pool2, [-1, 7 * 7 * 64])
# 矩阵运算得出每个样本的10个结果
y_predict = tf.matmul(x_fc_reshape, weight_fc) bias_fc
return x, y_true, y_predict
def conv_fc():
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(r"E:人工智能datamnist_65000_28_28_simple_number", one_hot=True)
x, y_true, y_predict = model()
# 求出所有样本的损失,求平均值
with tf.variable_scope("soft_cross"):
# 求平均值交叉熵损失
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
# 梯度下降求出损失
with tf.variable_scope("optimizer"):
train_op = tf.train.GradientDescentOptimizer(0.001).minimize(loss)
# 计算准确率
with tf.variable_scope("acc"):
equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
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(200)
# 运行训练
sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})
print("训练第%d的次,准确率为:%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))
return None
GooglelNet API:tensorflow.contrib.slim.python.slim.nets.inception_v3 import inception_v3_base