Почему np.exp() выдаёт иногда inf?
Есть вот такая функция:
def softmax(t):
out = np.exp(t)
return out / np.sum(out)
На вход функция получает: [834.58309008 839.59203032]
В функции out = [inf inf]
Почему? И как это исправить?
Весь код нейронки
import numpy as np
from numpy import random
from numpy.core.fromnumeric import argmax
from numpy.core.numeric import outer
import random
from pandas import read_csv
import matplotlib.pyplot as plt
# Входные значения
data = read_csv('/home/dgdays/neural_network/data.csv')
gender, height, weight = data['Gender'], data['Height'], data['Weight']
loss_arr = []
INPUT_DIM = 2
OUT_DIM = 2
H1_DIM = 5
H2_DIM = 10
# Веса и смещение
w1 = np.random.randn(INPUT_DIM, H1_DIM)
b1 = np.random.randn(H1_DIM)
w2 = np.random.randn(H1_DIM, H2_DIM)
b2 = np.random.randn(H2_DIM)
w3 = np.random.randn(H2_DIM, OUT_DIM)
b3 = np.random.randn(OUT_DIM)
ALPHA = 0.001
NUM_EPOCHS = 100
def relu(t):
return np.maximum(t, 0)
def softmax(t):
out = np.exp(t)
return out / np.sum(out)
def sparse_cross_entropy(z, y):
return -np.log(z[y])
def to_full(y, num_classes):
y_full = np.zeros((1, num_classes))
y_full[0, y] = 1
return y_full
def relu_deriv(t):
return (t >= 0).astupe(float)
for ep in range(NUM_EPOCHS):
for i in range(len(gender)):
x, y = np.array((height[i], weight[i])), gender[i]
x = np.around(x, 3)
# Forward
t1 = x @ w1 + b1
h1 = relu(t1)
t2 = h1 @ w2 + b2
h2 = relu(t2)
t3 = h2 @ w3 + b3
z = softmax(t3)
E = sparse_cross_entropy(z, y)
# Backward
y_full = to_full(y, OUT_DIM)
dE_dt3 = z - y_full
dE_dw3 = h2.T @ dE_dt3
dE_db3 = dE_dt3
dE_dh2 = dE_dt3 @ w2.T
dE_dt2 = dE_dh2 * relu_deriv(t2)
dE_dw2 = h1.T @ dE_dt2
dE_db2 = dE_dt2
dE_dh1 = dE_dt2 @ w1.T
dE_dt1 = dE_dh1 * relu_deriv(t1)
dE_dw1 = x.T @ dE_dt1
dE_db1 = dE_dt1
# Update
w1 = w1 - ALPHA * dE_dw1
b1 = b1 - ALPHA * dE_db1
w2 = w2 - ALPHA * dE_dw2
b2 = b2 - ALPHA * dE_db2
w3 = w3 - ALPHA * dE_dw3
b3 = b3 - ALPHA * dE_db3
loss_arr.append(E)
def predict(x):
t1 = x @ w1 + b1
h1 = relu(t1)
t2 = h1 @ w2 + b2
h2 = relu(t2)
t3 = h2 @ w3 + b3
z = softmax(t3)
return z
def calc_accuracy():
correct = 0
for i in range(len(gender)):
x, y = np.array((height[i], weight[i])), gender[i]
z = predict(x)
y_pred = np.argmax(z)
if y_pred == y:
correct += 1
acc = correct / len(gender)
return acc
accuracy = calc_accuracy()
print('Accuracy: ', accuracy)
plt.plot(loss_arr)
plt.show()
Файл данных: https://drive.google.com/file/d/1Qn4io0WXNk9gAZkEF3UYyorHElLlHUg1/view?usp=sharing
Ответы (1 шт):
Автор решения: passant
→ Ссылка
Все просто:
Пишем:
import sys
sys.float_info
В ответе среди прочего получаем:
max=1.7976931348623157e+308
Это максимальное число, которое можно представить в float формате.
Далее
math.log(1.7976931348623157e+308)
Получаем:
709.782712893384
Это максимальное число, экспонента от которого может быть представлена в виде числа float.
Но представить, где такие числа могут возникнуть - очень сложно. Напомню, считается, что в известной наблюдаемой вселенной существует примерно 10**82 атомов. Что вы представляете числом в 307 степени?