Матричное Умножение между нетерпеливым и неосильным выполнением в тензорном потоке - PullRequest
0 голосов
/ 04 июля 2019

Значения умножения матриц варьируются, когда тензорный поток запущен в жадном режиме по сравнению с графическим режимом

Поток кода различен для энергичных и неагрессивных исполнений в тензорном потоке. Но значения должны идеально совпадать, а это не так.

Стремительное исполнение:

import tensorflow as tf
from tensorflow.python.ops import gen_math_ops
import numpy as np
tf.enable_eager_execution()

dZ = np.array([[ 0.1,  0.1,  0.1,  0.1,  0.1,  0.1, -0.9,  0.1,  0.1,  0.1]])
FC_W = np.array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
import pdb
pdb.set_trace()
a = gen_math_ops.mat_mul(dZ, FC_W, False, True)

print(a)

Вывод нетерпеливого исполнения: [[-2.77555756e-17 -2.77555756e-17 -2.77555756e-17]

График выполнения:

import tensorflow as tf
from tensorflow.python.ops import gen_math_ops
import numpy as np

dZ = np.array([[ 0.1,  0.1,  0.1,  0.1,  0.1,  0.1, -0.9,  0.1,  0.1,  0.1]])

FC_W = np.array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
a = gen_math_ops.mat_mul(dZ, FC_W, False, True)

sess = tf.InteractiveSession()
print(str(sess.run(a)))

Вывод графика выполнения: [[-5.55111512e-17 -5.55111512e-17 -5.55111512e-17]]

Не слишком ли большая разница в выходных данных между двумя режимами для простого умножения матриц? (Хотя это е-17)

1 Ответ

0 голосов
/ 05 июля 2019

Результирующие различия обусловлены точностью расчета и различным упорядочением или группировкой операций.Это приводит к эффектам округления.

Я воспроизвел ваши результаты с помощью программы C#:

 double[] a = new double[] { 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, -0.9, 0.1, 0.1, 0.1 };
 double[] b = new double[] { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 };
 double sum = 0;

 for (int i = 0; i < a.Length; i++)
 {
    sum += a[i] * b[i];
 }

 Console.WriteLine($"{sum}");

 sum = (a[0]*b[0] + a[1]*b[1]) 
     + (a[2]*b[2] + a[3]*b[3]) 
     + (a[4]*b[4] + a[5]*b[5]) 
     + (a[6]*b[6] + a[7]*b[7]) 
     + (a[8]*b[8] + a[9]*b[9]);

 Console.WriteLine($"{sum}");

 //  output:  
 //  -2.77555756156289E-17
 //  5.55111512312578E-17

Кстати:
Microsoft Excel365 дает правильный ноль как результат безвидимое округление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...