当前位置: 首页 > 知识库问答 >
问题:

Softmax输出大量错误

高明辉
2023-03-14

下面是一个小代码,我正试图计算softmax。它适用于单个阵列。但是如果数量更大,比如1000等,就会爆炸

import numpy as np

def softmax(x):
 print (x.shape)
 softmax1 = np.exp(x)/np.sum(np.exp(x))
 return softmax1


def test_softmax():
  print "Running your code"
  #print softmax(np.array([1,2]))
  test1 = softmax(np.array([1,2]))
  ans1 = np.array([0.26894142,  0.73105858])
  assert np.allclose(test1, ans1, rtol=1e-05, atol=1e-06)
  print ("Softmax values %s" % test1)

  test2 = softmax(np.array([[1001,1002],[3,4]]))
  print test2
  ans2 = np.array([
      [0.26894142, 0.73105858],
      [0.26894142, 0.73105858]])
  assert np.allclose(test2, ans2, rtol=1e-05, atol=1e-06)

if __name__ == "__main__":
 test_softmax()

我收到一个错误 运行时警告: 在 exp 中遇到溢出 运行你的代码 softmax1 = np.exp(x)/np.sum(np.exp(x))

共有1个答案

韩耘豪
2023-03-14

softmax 的典型实现首先去除了最大值来解决此问题:

def softmax(x, axis=-1):
    # save typing...
    kw = dict(axis=axis, keepdims=True)

    # make every value 0 or below, as exp(0) won't overflow
    xrel = x - x.max(**kw)

    # if you wanted better handling of small exponents, you could do something like this
    # to try and make the values as large as possible without overflowing, The 0.9
    # is a fudge factor to try and ignore rounding errors
    #
    #     xrel += np.log(np.finfo(float).max / x.shape[axis]) * 0.9

    exp_xrel = np.exp(xrel)
    return exp_xrel / exp_xrel.sum(**kw)  

从代数上讲,这是完全相同的,但这确保了传递到 exp 中的最大值为 1

 类似资料:
  • 问题内容: 我正在通过执行Java 并将其输出捕获到标准输出来用Java编写视频应用程序。我决定使用Apache Commons- Exec而不是Java的Java ,因为它看起来更好。但是,我很难捕获所有输出。 我认为使用管道将是可行的方法,因为它是进程间通信的标准方法。但是,我的设置使用和是错误的。它似乎有效,但仅适用于流的前1042个字节,奇怪的是恰好是的值。 我不喜欢使用管道,但是我想避免

  • 我试图找到大数的阶乘 我输入t个测试用例 每种情况下都有一个数字,我试图找到它的阶乘 我将阶乘的数字存储在向量中(动态数组) 每次乘以递减的n值 功能显示:显示矢量v中的所有数字 n=5的输出

  • 常见的变量输出有如下情况: 1.在控制器中按如下方式赋值 $this->assign('hello','Hello ThinkCMF!'); return $this->fetch(); 在模板中: <div>{$hello}</div> 2.在控制器中赋值数组变量 $data = ['hello'=>'Hello ThinkCMF!','username'=>'老猫']; $this->as

  • 请参考:http://www.kancloud.cn/manual/thinkphp/1794

  • 变量输出 常见的变量输出有如下情况: 1.在控制器中按如下方式赋值 $this->assign('hello','Hello ThinkCMF!'); return $this->fetch(); 在模板中: <div>{$hello}</div> 2.在控制器中赋值数组变量 $data = ['hello'=>'Hello ThinkCMF!','username'=>'老猫']; $thi

  • 在模板中输出变量的方法很简单,例如,在控制器的方法中我们给模板变量赋值: $this->assign('name', 'thinkphp'); return $this->fetch(); 然后就可以在模板中使用: Hello,{$name}! 模板编译后的结果就是: Hello,<?php echo htmlentities($name);?>! 这样,运行的时候就会在模板中显示: Hello,