经过上一篇文章的学习,我们对于浅层神经网络的学习已经有了初步印象,我们来复习以下:
对于神经网络,我们已经有了神经元的概念:每一个都是一个单独的回归函数罢了
对于从回归学习到浅层神经网络,我们知道添加隐藏层可以提高预测的准确率,并且成功定义了add_layer方法为我们添加节点,快速生成隐藏层
但是我们在浅层神经网络的学习里面的构建隐藏层还是采用了写死的方式,如果说要是想从浅层神经网络改成深层神经网络,则需要对上篇代码继续修改/
深层神经网络
和浅层神经网络不同的是,深层神经网络的隐藏层是可变的,我们可以根据不同的数据源、训练集和数据特征来改变学习策略,以此达到一个比较好的学习效果。
一个两层的深层神经网络结构如下:
上图所示的是一个具有两层隐藏层的深层神经网络
- 第一个隐藏层有 4 个节点,对应的激活函数为 ReLu 函数
- 第一个隐藏层有 2 个节点,对应的激活函数也是 Relu 函数
- 最后,输出层使用 softmax 函数作为激活函数
那么对于这样的,或者更多的神经网络,我们不可以再用下面的方法:
#浅层
# 添加隐藏层
l1 = add_layer(X, 784, 2000, activation_function=tf.nn.relu)
pre = add_layer(l1, 2000, 10, activation_function=None) # 输出
而是要先对深层网络的节点做好配置,之后构建可以服用的for循环函数,从而快速搭建
#深层
#【重点】规定节点结构
layer_dims = [784,500,500,10] #结构,结构配置的地方
layer_count = len(layer_dims)-1 #深度计算不算输入层
layer_iter = X #初始化输入值,因节点输入层构建需要所以第一层用X,for循环构建神经网络,遍历layer_dims替换X
for l in range(1,layer_count):
layer_iter = add_layer(layer_iter,layer_dims[l-1],layer_dims[l],activation_function = tf.nn.relu)
pre = add_layer(layer_iter,layer_dims[layer_count-1],layer_dims[layer_count],activation_function = None) #输出层节点要用最后一层隐藏层节点数量做输入
我们只需要改变这个构建方法即可,其它方式均可不变,最后得到代码:
#-*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
def add_layer(inputs ,in_size,out_size,activation_function= True):
#初始化变量
W = tf.Variable(tf.random_normal([in_size,out_size]))#初始化正态分布,in列,out行,第一层in传入784,第二层传入1000
b = tf.Variable(tf.zeros([1,out_size])) #偏置量初始化,1列。out行
Z = tf.matmul(inputs,W)+b #初始化公式,每一层都要有
#为了防止报错,如果没有传入激活共识,则不作处理
if activation_function is None:
outputs = Z
else:
outputs = activation_function(Z)
return outputs
#构建主函数逻辑
if __name__ ==