博文配套视频课程:24小时实现从零到AI人工智能
DNN深度神经网络
假如是人脸识别,神经网络模型应该怎么建立呢?为了简单起见,输入层的每个节点代表图片的某个像素,难道和前面一样直接通过输入到大输出神经元吗?当物体特征比较复杂时,我们可以对物体特征进行拆分识别。试着将这个问题分解为一些列的子问题,比如
- 在上方有头发吗 ?
- 在左上、右上各有一个眼睛吗?
- 在中间有鼻子吗?
- 在下方中间位置有嘴巴吗?
- 在左、右两侧有耳朵吗?
神经网络之隐藏层
- 输入层是图的像素节点,然后每一层回答了关于输入像素点的一些简单问题
- 很具体的问题,然后经过很多层,建立了更复杂和抽象的概念
- 这种带有两个或多个隐含层的神经网络,称为深度神经网络(deep neural networks,简称为 DNN)
- 训练神经网络常用的技术包括,梯梯度下降(SGD)、反向传播(BP算法)、激活函数
线性不可分问题
不管是单层感知机还是多个感知器,只要不带激活函数,都只能解决线性可分的问题。解决不了我们的线性不可分问题。不信,那我们就在平面中画几条直线试试,结果发现这几条直线无论在平面中如何旋转,都不能完全正确的分开三角形和圆点。
带激活函数分类器
tanh激活函数
tanh是双曲函数中的一个,tanh()为双曲正切,值域:(-1,1) 之间
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
x = np.arange(-5.0, 5.0, 0.1)
# y = np.tanh(x)
y = tf.nn.tanh(x)
with tf.Session() as sess:
plt.plot(x, sess.run(y))
plt.show()
DNN优化手写数之别
当学习率为0.05时,100次学习可以得到70%正确率, 1000次学习可以得到85%正确率, 2000次学习可以得到94%正确率
扫描二维码关注公众号,回复: 9501816 查看本文章
import tensorflow as tf # 别名一般tf
# 深度学习目前最大的制约就是学习的数据样本
from tensorflow.examples.tutorials.mnist import input_data
# 获取手写数字图片素材
mnist = input_data.read_data_sets("../data/input_data", one_hot=True)
# 查看训练集的图片信息 images.shape = (55000, 784)
# (55000, 784) 55000个图(样本),每个样本有784个特征(因为图片尺寸28*28大小)
print(mnist.test.images.shape)
# (55000,10) : 每次预测时候输出不是1个值,而是0-9的概率
print(mnist.test.labels.shape)
# 获取手写数字图片素材
mnist = input_data.read_data_sets("../data/input_data", one_hot=True)
# (55000,784) ==> (100,784) 通过占位符构建特征值
X = tf.placeholder(dtype=tf.float32, shape=(None, 784))
# (55000,10) 通过占位符构建目标值
y = tf.placeholder(dtype=tf.int8, shape=(None, 10))
# 输入层 784,第一个隐藏层500个神经元,则权重为 [784,500] 偏置为[500]
W1 = tf.Variable(initial_value=tf.random_normal(shape=(784, 500), mean=0))
b1 = tf.Variable(initial_value=tf.zeros([500]))
# 隐藏层输出结果为 [None,784] ~ [784,500] ===> [None,500]
# tanh为激活函数
L1 = tf.nn.tanh(tf.matmul(X, W1) + b1)
# 第二层隐藏层, 接受500个特征值, 输出300个特征值,因此
W2 = tf.Variable(initial_value=tf.random_normal(shape=(500, 300), mean=0))
b2 = tf.Variable(initial_value=tf.zeros([300]))
# 隐藏层输出结果为 [None,500] ~ [500,300] ===> [None,300]
L2 = tf.nn.tanh(tf.matmul(L1, W2) + b2)
W3 = tf.Variable(initial_value=tf.random_normal(shape=(300, 10)))
b3 = tf.Variable(initial_value=tf.zeros([10]))
# 预测值 = 权重 * X + 偏置
y_predict = tf.matmul(L2, W3) + b3
# 获取误差值(损失)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_predict))
# 梯度下降减少损失
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(loss)
# 计算命中率
equal_list = tf.equal(tf.argmax(y, axis=1), tf.argmax(y_predict, axis=1))
accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
# 获取sess开启会话
with tf.Session() as sess:
# 初始化变量
sess.run(tf.global_variables_initializer())
for i in range(2000): # 100 70% # 1000 -> 85% # 2000 -> 94% # 5000 --> 94%
# 获取图片的特征值(55,784), 目标值(55,10)
mnist_image, mnist_label = mnist.train.next_batch(55)
d = {X: mnist_image, y: mnist_label}
sess.run(train_op, feed_dict=d)
print(f'第{i + 1}次训练时正确率为:{sess.run(accuracy, feed_dict=d)}')