Вот как ты мог это сделать.Я думаю, что вы имеете в виду градиент по активациям, указанным матрицей индикатора у.
Сначала я создаю a
как float
для изменения отдельных элементов.
a = np.random.randint(1,100,(batch_size,classes)).astype("float")
Затем,
np.diag(grad_softmax_crossentropy(a, y)[:, y.flatten()])
array([ -1.00000000e+00, -1.00000000e+00, -4.28339542e-04])
Но также
b = a.copy()
for i, o in zip(y.max(axis=1), range(y.shape[0])):
b[o, i] += eps
(softmax_crossentropy(b,y)-softmax_crossentropy(a,y))/eps
[ -1.00000000e+00 -1.00000000e+00 -4.28125536e-04]
Таким образом, в основном вы должны изменить a_i в softmax, а не полностью a.