Очень большой поплавок в питоне - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь построить нейронную сеть для базы данных Mnist.При вычислении функции softmax я получаю сообщение об ошибке с теми же концами, что и «Вы не можете сохранить число с плавающей запятой такого размера»

код выглядит следующим образом:

def softmax(vector): # REQUIRES a unidimensional numpy array 
adjustedVals = [0] * len(vector)
totalExp = np.exp(vector)
print("totalExp equals")
print(totalExp)
totalSum = totalExp.sum()
for i in range(len(vector)):
    adjustedVals[i] = (np.exp(vector[i])) / totalSum
return adjustedVals # this throws back an error sometimes?!?!

После проверки большинство рекомендуютиспользуя десятичный модуль.Однако, когда я возился со значениями, используемыми в командной строке с этим модулем, а именно:

from decimal import Decimal
import math
test = Decimal(math.exp(720))

, я получаю аналогичную ошибку для любых значений math.exp (> 709).

OverflowError: (34, 'Numerical result out of range')

Мой вывод таков, что даже десятичное число не может обработать это число.Кто-нибудь знает другой метод, который я мог бы использовать, чтобы представить эти очень большие поплавки.

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Существует метод, который делает функцию softmax более выполнимой в вычислительном отношении для определенного вида распределения значений в вашем vector.А именно, вы можете вычесть максимальное значение в vector (назовем его x_max) из каждого из его элементов.Если вы помните формулу softmax, такая операция не влияет на результат, поскольку она сводится к умножению результата на e^(x_max) / e^(x_max) = 1.Таким образом, наибольшее промежуточное значение, которое вы получите, составляет e^(x_max - x_max) = 1, поэтому вы избежите переполнения.

Для дополнительных пояснений я рекомендую следующую статью: https://nolanbconaway.github.io/blog/2017/softmax-numpy

0 голосов
/ 16 декабря 2018

При значении выше 709 функция 'math.exp' превышает диапазон с плавающей запятой и выдает эту ошибку переполнения.

Если вместо «math.exp» вы используете «numpy.exp» для таких больших показателей, вы увидите, что оно имеет специальное значение «inf» (бесконечность).

Все это помимо всего прочего, мне интересно, почему вы захотите произвести такое большое число (не уверен, что вы знаете, насколько оно велико. Просто, чтобы дать вам представление, число атомов во вселенной оценивается какбыть в диапазоне от 10 до степени 80. Число, которое вы пытаетесь произвести, НАМНОГО больше, чем это).

...