Tensorflow–全连接神经网络
一.全连接神经网络
全连接神经网络就是一种变换的规则,只是这种规则比较复杂,单纯利用数学公式表示这种复杂的变换不够形象也不容易理解,一般用图的形式表示该变换,可以概括为如下两点
二.计算步骤
假设输入层神经元的值为[3 5],首先计算隐含层(第1层)的第1个神经元的值,步骤如下:
- 第0层的所有神经元与该神经元进行连接,且已知它们之间的权重及其偏置,根据这些值计算线性组合
- 将第1步得到的线性组合的值作为一个一元函数的输入,假设该函数为f(x)=2x
三.神经网络的矩阵表达
import tensorflow as tf
import numpy as np
# 输入层
x=tf.placeholder(tf.float32,[2,None])
# 第1层的权重矩阵
w1=tf.constant(
[
[1,4,7],
[2,6,8]
]
,tf.float32
)
# 第1层偏置
b1=tf.constant(
[
[-4],
[2],
[1]
]
,tf.float32
)
# 计算第1层的线性组合
l1=tf.matmul(w1,x,True)+b1
# 激活2*x
sigma1=2*l1
# 第2层的权重矩阵
w2=tf.constant(
[
[2,3],
[1,-2],
[-1,1]
]
,tf.float32
)
# 第2层的偏置
b2=tf.constant(
[
[5],
[-3]
]
,tf.float32
)
# 计算第2层的线性组合
l2=tf.matmul(w2,sigma1,True)+b2
# 激活2*x
sigma12=2*l2
# 创建会话
session=tf.Session()
# 令x=[[3],[5]]
print(session.run(sigma12,{x:np.array([[3],[5]],np.float32)}))
利用矩阵相乘的函数matmul时,需要对权重矩阵转置,偏置需要存储在一个二维张量中。如果将神经网络的输入按行存储,则会更方便。以下计算多个输入分别经过该神经网络时对应的输出,用矩阵管理多个输入,其中每一个输入按行存储,假设有4个输入,如:
import tensorflow as tf
import numpy as np
# 输入层:每一个输入按行存储
x=tf.placeholder(tf.float32,(None,2))
# 第1层的权重矩阵
w1=tf.constant(
[
[1,4,7],
[2,6,8]
]
,tf.float32
)
# 第1层的偏置
b1=tf.constant(
[1,4,7],tf.float32
)
# b1=tf.constant([[1,4,7]],tf.float32) 也可以这样写
# 计算第1层的线性组合
l1=tf.matmul(x,w1)+b1
# 激活2*x
sigma1=2*l1
# 第2层的权重矩阵
w2=tf.constant(
[
[2,3],
[1,-2],
[-1,1]
]
,tf.float32
)
# 第2层偏置
b2=tf.constant(
[5,-3],tf.float32
)
# 计算第2层的线性组合
l2=tf.matmul(sigma1,w2)+b2
sigma2=2*l2
session=tf.Session()
print(session.run(sigma2,{x:np.array([
[10,11],
[20,21],
[30,31],
[40,41]
],np.float32)}))
四.激活函数
激活函数是神经网络的重要组成部分,为了保证神经网络的灵活性及其计算的复杂度,激活函数一般不会太复杂
1.sigmoid激活函数
Tensorflow通过函数tf.nn.sigmoid(x,name=None)实现sigmoid激活函数,使用示例如下:
import tensorflow as tf
# 二维张量
t=tf.constant([[1,3],[2,0]],tf.float32)
# 激活sigmod激活
result=tf.nn.sigmoid(t)
session=tf.Session()
print(session.run(result))
[[ 0.7310586 0.95257413]
[ 0.88079703 0.5 ]]
import tensorflow as tf
# 二维张量
t=tf.constant([[1,3],[2,0]],tf.float32)
# 激活sigmod激活
result=tf.nn.tanh(t)
session=tf.Session()
print(session.run(result))
[[ 0.76159418 0.99505472]
[ 0.96402758 0. ]]
3.ReLU激活函数
import tensorflow as tf
# 变量
x=tf.Variable(tf.constant([[2,1,3]],tf.float32))
w=tf.constant([[2],[3],[4]],tf.float32)
g=tf.matmul(x,w)
f=tf.nn.relu(g)
# 计算f在(2,1,3)处的导数
gradient=tf.gradients(f,[g,x])
session=tf.Session()
session.run(tf.global_variables_initializer())
print(session.run(gradient))
[array([[ 1.]], dtype=float32), array([[ 2., 3., 4.]], dtype=float32)]
import tensorflow as tf
# 变量
x=tf.Variable(tf.constant([[2,1,3]],tf.float32))
w=tf.constant([[2],[3],[4]],tf.float32)
g=tf.matmul(x,w)
f=tf.nn.relu_layer(g,aplha=0.2)
# 牛顿梯度下降法
opti=tf.train.GradientDescentOptimizer(0.5).minimize(f)
session=tf.Session()
session.run(tf.global_variables_initializer())
for i in range(3):
session.run(opti)
print("第%d次迭代的值"%(i+1))
print(session.run(x))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-b088313b7a7f> in <module>()
7 g=tf.matmul(x,w)
8
----> 9 f=tf.nn.relu_layer(g,aplha=0.2)
10 # 牛顿梯度下降法
11 opti=tf.train.GradientDescentOptimizer(0.5).minimize(f)
TypeError: relu_layer() got an unexpected keyword argument 'aplha'
elu激活函数
import tensorflow as tf
t=tf.constant([-2,0,1],tf.float32)
r=tf.nn.crelu(t)
session=tf.Session()
print(session.run(r))
[ 0. 0. 1. 2. -0. 0.]