• TensorFlow2_200729系列---14、MSE求梯度实例


    TensorFlow2_200729系列---14、MSE求梯度实例

    一、总结

    一句话总结:

    tf.losses.MSE:loss = tf.reduce_mean(tf.losses.MSE(y, logits))

    1、机器学习中的公式推导?

    机器学习中,很多看似很复杂的公式的推导,就是非常普通的按照求导的规则来求导,比如求各种函数梯度

    二、MSE求梯度实例

    博客对应课程的视频位置:

    import tensorflow as tf 
    
    
    # 表示神经网络输入层3个节点
    x=tf.random.normal([1,3])
    # 表示是3个节点连两个节点
    w=tf.ones([3,2])
    # 表示是被连的两个节点
    # 在这里也表示输出层是两个节点
    b=tf.ones([2])
    # 输出层为0和1
    y = tf.constant([0, 1])
    
    
    with tf.GradientTape() as tape:
        # watch要求梯度的参数w和b(这里w和b都是矩阵)
    	tape.watch([w, b])
        # 用激活函数sigmoid
    	logits = tf.sigmoid(x@w+b) 
        # 计算loss(计算预测值logits和真实值y的MSE)
    	loss = tf.reduce_mean(tf.losses.MSE(y, logits))
    
    # 计算梯度:对loss函数计算w和b对应的梯度
    grads = tape.gradient(loss, [w, b])
    print('w grad:', grads[0])
    print('b grad:', grads[1])
    
    w grad: tf.Tensor(
    [[ 0.02753587 -0.05880144]
     [-0.03335685  0.07123186]
     [-0.11601511  0.24774435]], shape=(3, 2), dtype=float32)
    b grad: tf.Tensor([ 0.06927714 -0.1479378 ], shape=(2,), dtype=float32)
    

    2、详细分析过程(中间变量)

    In [2]:
    # 表示神经网络输入层3个节点
    x=tf.random.normal([1,3])
    x
    
    Out[2]:
    <tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[0.18152788, 0.19228849, 0.83497703]], dtype=float32)>
    In [3]:
    # 表示是3个节点连两个节点
    w=tf.ones([3,2])
    w
    
    Out[3]:
    <tf.Tensor: shape=(3, 2), dtype=float32, numpy=
    array([[1., 1.],
           [1., 1.],
           [1., 1.]], dtype=float32)>
    In [4]:
    # 表示是被连的两个节点
    # 在这里也表示输出层是两个节点
    b=tf.ones([2])
    # 输出层为0和1
    y = tf.constant([0, 1])
    y
    
    Out[4]:
    <tf.Tensor: shape=(2,), dtype=int32, numpy=array([0, 1])>
    In [8]:
    with tf.GradientTape() as tape:
        # watch要求梯度的参数w和b(这里w和b都是矩阵)
        tape.watch([w, b])
        print("========================x@w+b========================")
        print(x@w+b)
        # 用激活函数sigmoid
        logits = tf.sigmoid(x@w+b) 
        print("========================logits========================")
        print(logits)
        # 计算loss(计算预测值logits和真实值y的MSE)
        loss = tf.reduce_mean(tf.losses.MSE(y, logits))
        print("========================loss========================")
        print(loss)
    
    # 计算梯度:对loss函数计算w和b对应的梯度
    grads = tape.gradient(loss, [w, b])
    print("========================grads========================")
    print(grads)
    
    ========================x@w+b========================
    tf.Tensor([[2.2087934 2.2087934]], shape=(1, 2), dtype=float32)
    ========================logits========================
    tf.Tensor([[0.9010364 0.9010364]], shape=(1, 2), dtype=float32)
    ========================loss========================
    tf.Tensor(0.4108302, shape=(), dtype=float32)
    ========================grads========================
    [<tf.Tensor: shape=(3, 2), dtype=float32, numpy=
    array([[ 0.0145849 , -0.00160191],
           [ 0.01544947, -0.00169686],
           [ 0.06708644, -0.00736831]], dtype=float32)>, <tf.Tensor: shape=(2,), dtype=float32, numpy=array([ 0.08034526, -0.00882457], dtype=float32)>]
    
    In [9]:
    print('w grad:', grads[0])
    print('b grad:', grads[1])
    
    w grad: tf.Tensor(
    [[ 0.0145849  -0.00160191]
     [ 0.01544947 -0.00169686]
     [ 0.06708644 -0.00736831]], shape=(3, 2), dtype=float32)
    b grad: tf.Tensor([ 0.08034526 -0.00882457], shape=(2,), dtype=float32)
    

    3、softmax求多分类实例

    In [14]:
    import tensorflow as tf 
    
    
    x=tf.random.normal([2,4])
    w=tf.random.normal([4,3])
    b=tf.zeros([3])
    # 两次的预测结果分别是2和0
    y = tf.constant([2, 0])
    print(y)
    
    
    with tf.GradientTape() as tape:
        tape.watch([w, b])
        prob = tf.nn.softmax(x@w+b,axis=1) 
        print(prob)
        loss = tf.reduce_mean(tf.losses.MSE(tf.one_hot(y,depth=3), prob))
    
    grads = tape.gradient(loss, [w, b])
    print('w grad:', grads[0])
    print('b grad:', grads[1])
    
    tf.Tensor([2 0], shape=(2,), dtype=int32)
    tf.Tensor(
    [[9.71989512e-01 1.00679705e-02 1.79424882e-02]
     [7.29947150e-01 2.69553602e-01 4.99337562e-04]], shape=(2, 3), dtype=float32)
    w grad: tf.Tensor(
    [[-0.05403889  0.07584023 -0.02180129]
     [ 0.01013849 -0.00606219 -0.00407629]
     [-0.03504124  0.02041196  0.01462925]
     [ 0.00705199  0.00788973 -0.01494168]], shape=(4, 3), dtype=float32)
    b grad: tf.Tensor([-0.02092656  0.032325   -0.01139841], shape=(3,), dtype=float32)
    

    计算结果数据:1和0

    就是预测数据prob中最大的索引

    In [ ]:
     
     
    我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
    博主25岁,前端后端算法大数据人工智能都有兴趣。
    大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
    聊技术,交朋友,修心境,qq404006308,微信fan404006308
    26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
    人工智能群:939687837

    作者相关推荐

  • 相关阅读:
    详述@Responsebody和HTTP异步请求的关系
    利用synchronized解析死锁的一种形成方式
    初识Spring JdbcTemplate
    初识SpringIOC
    JasperReport框架使用教程(附带常见空白页问题说明)
    LeetCode~1033.移动石子直到连续
    LeetCode~941.有效的山脉数组
    LeetCode~344. 反转字符串
    Job for network.service failed because the control process exited with error code问题
    LeetCode~报数(简单)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13431430.html
Copyright © 2020-2023  润新知