Tensorflow--全连接神经网络

Tensorflow–全连接神经网络

一.全连接神经网络

全连接神经网络就是一种变换的规则,只是这种规则比较复杂,单纯利用数学公式表示这种复杂的变换不够形象也不容易理解,一般用图的形式表示该变换,可以概括为如下两点

二.计算步骤

假设输入层神经元的值为[3 5],首先计算隐含层(第1层)的第1个神经元的值,步骤如下:

  1. 第0层的所有神经元与该神经元进行连接,且已知它们之间的权重及其偏置,根据这些值计算线性组合
  2. 将第1步得到的线性组合的值作为一个一元函数的输入,假设该函数为f(x)=2x

三.神经网络的矩阵表达

未命名文件.png

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.]
原文地址:https://www.cnblogs.com/LQ6H/p/10335525.html