12_DNN深度神经网络

在这里插入图片描述


博文配套视频课程:24小时实现从零到AI人工智能


DNN深度神经网络

假如是人脸识别,神经网络模型应该怎么建立呢?为了简单起见,输入层的每个节点代表图片的某个像素,难道和前面一样直接通过输入到大输出神经元吗?当物体特征比较复杂时,我们可以对物体特征进行拆分识别。试着将这个问题分解为一些列的子问题,比如

  1. 在上方有头发吗 ?
  2. 在左上、右上各有一个眼睛吗?
  3. 在中间有鼻子吗?
  4. 在下方中间位置有嘴巴吗?
  5. 在左、右两侧有耳朵吗?

在这里插入图片描述

神经网络之隐藏层

  1. 输入层是图的像素节点,然后每一层回答了关于输入像素点的一些简单问题
  2. 很具体的问题,然后经过很多层,建立了更复杂和抽象的概念
  3. 这种带有两个或多个隐含层的神经网络,称为深度神经网络(deep neural networks,简称为 DNN)
  4. 训练神经网络常用的技术包括,梯梯度下降(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)}')

在这里插入图片描述

发布了128 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/lsqzedu/article/details/102367394