zoukankan      html  css  js  c++  java
  • 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.]
    
  • 相关阅读:
    [Unity3D]脚本中Start()和Awake()的区别
    win7中资源管理器不能显示图片预览的解决方法
    Unity Built-in Shader详解三
    Unity Built-in Shader详解二
    php扩展安装
    ImportError: No module named mysql 报错python引用mysql报错
    运维制度
    ps aux|awk -F'[ ]+' '$3>90{print $2}'|xargs -n1 kill -9
    运维面试必知十五大原理知识点
    resize2fs
  • 原文地址:https://www.cnblogs.com/LQ6H/p/10335525.html
Copyright © 2011-2022 走看看