zoukankan      html  css  js  c++  java
  • sequence_loss的解释

    在做seq2seq的时候,经常需要使用sequence_loss这是损失函数。

    现在分析一下sequence_loss这个函数到底在做什么

    # coding: utf-8
    import numpy as np
    import tensorflow as tf
    from tensorflow.contrib.seq2seq import sequence_loss
    
    logits_np = np.array([
       [[1.0, 2.0], [1.0, 2.0]],
        [[1.0, 2.0], [1.0, 2.0]]
    ])
    
    targets_np = np.array([
        [0,1],
        [1,1]
    ], dtype=np.int32)
    
    logits = tf.convert_to_tensor(logits_np)
    targets = tf.convert_to_tensor(targets_np)
    cost = sequence_loss(logits=logits,
                         targets=targets,
                         weights=tf.ones_like(targets, dtype=tf.float64))
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
        sess.run(init)
        r = sess.run(cost)
        print(r)
        
    # sequence_loss的结果是0.563261687518082
    
    

    求loss值

    [logits=left[egin{matrix} [1.0, 2.0] & [1.0, 2.0] cr [1.0, 2.0] & [1.0, 2.0]end{matrix} ight] ]

    [target=left[egin{matrix} 0.0 & 1.0 cr 1.0 & 1.0 end{matrix} ight] ]

    [cost=sequence\_loss( logits=logits,targets=targets,weights=tf.ones_like(targets, dtype=tf.float64)) ]

    sequence_loss的求值过程

    1.softmax求值

    2.交叉熵选择

    3.求平均值

    1.softmax

    将得分或者概率fi,统一转化到0到1之间,就是计算权重占比(归一化处理)
    但是在计算权重的时候,分数都通过自然数e映射转换,目的是,让大的分数更大,让小的分数更小,增加区分度

    [f_i(z)=-log( frac{ e^{f_i} }{ sum{e^{f_j} }} ) ]

    其输入值是一个向量,向量中元素为任意实数的得分值

    输出一个向量,其中每个元素值在0到1之间,且所有元素之和为1(计算每个得分在总分中的占比。这里通过指数映射了一下

    [f_i(z)=-log( frac{ e^{f_i} }{ sum{e^{f_j} }} ) ]

    logits = [
    [[1.0, 2.0], [1.0, 2.0]],
    [[1.0, 2.0], [1.0, 2.0]]
    ]

    [softmax=left[egin{matrix} [ frac{ e^{1.0} }{ e^{1.0}+e^{2.0}} , frac{ e^{2.0} }{ e^{1.0}+e^{2.0}}] & [frac{ e^{1.0} }{ e^{1.0}+e^{2.0}},frac{ e^{2.0} }{ e^{1.0}+e^{2.0}}] cr [frac{ e^{1.0} }{ e^{1.0}+e^{2.0}},frac{ e^{2.0} }{ e^{1.0}+e^{2.0}}] & [frac{ e^{1.0} }{ e^{1.0}+e^{2.0}},frac{ e^{2.0} }{ e^{1.0}+e^{2.0}}]end{matrix} ight] ]

    2求交叉熵

    targets = [
    [0,1],
    [1,1]
    ]
    根据targets, 确定选取哪个值。

    [crross\_softmax=left[egin{matrix} -log(frac{ e^{1.0} }{ e^{1.0}+e^{2.0}}) & -log(frac{ e^{2.0} }{ e^{1.0}+e^{2.0}}) cr -log(frac{ e^{2.0} }{ e^{1.0}+e^{2.0}}) & -log(frac{ e^{2.0} }{ e^{1.0}+e^{2.0}}end{matrix}) ight] ]

    再求平均值
    loss1=(-log(2.718/(2.718+7.387))+(-log(7.387/(2.718+7.387))))/2
    loss2=(-log(7.387/(2.718+7.387))+(-log(7.387/(2.718+7.387))))/2
    loss=(loss1+loss2)/2
    loss=0.563
    
  • 相关阅读:
    indexDB的用法
    append动态生成的元素,无法触发事件的原因及解决方案
    jquery中attr()和prop()的区别
    arguments.callee
    meter标签度量衡如何改变颜色
    Nginx入门
    linux中的权限管理
    python_面向对象
    ORM
    Flask入门
  • 原文地址:https://www.cnblogs.com/panfengde/p/10323028.html
Copyright © 2011-2022 走看看