Переполнение при numpy истинном делении - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь реализовать градиентный спуск с импульсом с нуля в python. При реализации коррекции смещения для экспоненциально взвешенного среднего я обнаружил предупреждение во время выполнения, в котором говорилось: «Встречается переполнение при numpy истинном делении». Я пытаюсь разделить массив numpy с помощью очень маленького числа с плавающей запятой (указано в разделе кода).

for i in range(1, len(self.layers)):
            self.dvw['dvw'+str(i)] = (self.beta1*self.dvw['dvw'+str(i)] + (1-self.beta1)*self.dw['dw'+str(i)])
            self.dvb['dvb'+str(i)] = (self.beta1*self.dvb['dvb'+str(i)] + (1-self.beta1)*self.db['db'+str(i)])
            self.dvw['dvw'+str(i)] = self.dvw['dvw'+str(i)].astype('float')
            self.dvb['dvb'+str(i)] = self.dvb['dvb'+str(i)].astype('float')
            self.dvw['dvw'+str(i)] = np.divide(self.dvw['dvw'+str(i)], (1-np.power(self.beta1, t))) # encounterd error in this line
            self.dvb['dvb'+str(i)] = np.divide(self.dvb['dvb'+str(i)], (1-np.power(self.beta1, t))) # and this line aswell

dvw и dvb - это словари с массивами numpy в качестве значений. Значение beta1 равно 0,9, а t - действительное число

1 Ответ

0 голосов
/ 06 августа 2020

Попробуйте улучшить числовую стабильность вашего кода, добавив:

eps=1e-6
for i in range(1, len(self.layers)):
    self.dvw['dvw'+str(i)] = (self.beta1*self.dvw['dvw'+str(i)] + (1-self.beta1)*self.dw['dw'+str(i)])
    self.dvb['dvb'+str(i)] = (self.beta1*self.dvb['dvb'+str(i)] + (1-self.beta1)*self.db['db'+str(i)])
    self.dvw['dvw'+str(i)] = self.dvw['dvw'+str(i)].astype('float')
    self.dvb['dvb'+str(i)] = self.dvb['dvb'+str(i)].astype('float')
    self.dvw['dvw'+str(i)] = np.divide(self.dvw['dvw'+str(i)], (eps + 1-np.power(self.beta1, t)))
    self.dvb['dvb'+str(i)] = np.divide(self.dvb['dvb'+str(i)], (eps + 1-np.power(self.beta1, t)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...