Метрика точности предварительной обработки

У меня есть модель, которая предсказывает 5 классов. Я хочу изменить показатель точности, как показано в примере ниже:

def accuracy(y_pred,y_true):
    #our pred tensor 
    y_pred = [ [0,0,0,0,1], [0,1,0,0,0], [0,0,0,1,0], [1,0,0,0,0], [0,0,1,0,0]]
    # make some manipulations with tensor y_pred
    # actons description : 
    for array in y_pred :
        if array[3] == 1 :
             array[3] = 0
             array[0] = 1
        if array[4] == 1 :
             array[4] = 0
             array[1] = 1
        else :
             continue 

    #this nice work with arrays but howe can i implement it with tensors ? 
    #after manipulations result-> 
    y_pred = [ [0,1,0,0,0], [0,1,0,0,0], [1,0,0,0,0], [1,0,0,0,0],[0,0,1,0,0] ]
    #the same ations i want to do with y_true 
    # and after it i want to run this preprocess tensors the same way as  simple tf.keras.metrics.Accuracy metric 

Я думаю, что tf.where может помочь отфильтровать тензор, но, к сожалению, не может сделать это правильно.

Как сделать эту метрику точности предварительной обработки с помощью тензоров?


person Владислав Бушменьов    schedule 20.05.2020    source источник
comment
Это похоже на это. Надеюсь, поможет   -  person Amanshivhare1    schedule 20.05.2020
comment
вы хотите изменить как?   -  person Zabir Al Nazi    schedule 21.05.2020
comment
@Забир Аль Нази, это всего лишь пример действий, которые я хочу сделать со своими тензорами. Эти петли не являются правильным решением для тензоров.   -  person Владислав Бушменьов    schedule 21.05.2020


Ответы (1)


Если вы хотите сдвинуть единицы влево на 3 индекса, вы можете сделать это:

import numpy as np

y_pred = [ [0,0,0,0,1], [0,1,0,0,0], [0,0,0,1,0], [1,0,0,0,0], [0,0,1,0,0]]

y_pred = np.array(y_pred)

print(y_pred)

shift = 3

one_pos = np.where(y_pred==1)[1] # indices where the y_pred is 1
# updating the new positions with 1
y_pred[range(y_pred.shape[1]),one_pos - shift] = np.ones((y_pred.shape[1],))
# making the old positions zero
y_pred[range(y_pred.shape[1]),one_pos] = np.zeros((y_pred.shape[1],))

print(y_pred)
[[0 0 0 0 1]
 [0 1 0 0 0]
 [0 0 0 1 0]
 [1 0 0 0 0]
 [0 0 1 0 0]]
[[0 1 0 0 0]
 [0 0 0 1 0]
 [1 0 0 0 0]
 [0 0 1 0 0]
 [0 0 0 0 1]]

Обновлять:

Если вы хотите переключиться только на индекс 3 и 4.

import numpy as np

y_pred = [ [0,0,0,0,1], [0,1,0,0,0], [0,0,0,1,0], [1,0,0,0,0], [0,0,1,0,0]]

y_pred = np.array(y_pred)

print(y_pred)

shift = 3

one_pos = np.where(y_pred==1)[1]# indices where the y_pred is 1

print(one_pos)

y_pred[range(y_pred.shape[1]),one_pos - shift] = [1 if (i == 3 or i == 4) else 0 for i in one_pos]
y_pred[range(y_pred.shape[1]),one_pos] = [0 if (i == 3 or i == 4) else 1 for i in one_pos]

print(y_pred)
[[0 0 0 0 1]
 [0 1 0 0 0]
 [0 0 0 1 0]
 [1 0 0 0 0]
 [0 0 1 0 0]]
[4 1 3 0 2]
[[0 1 0 0 0]
 [0 1 0 0 0]
 [1 0 0 0 0]
 [1 0 0 0 0]
 [0 0 1 0 0]]
person Zabir Al Nazi    schedule 21.05.2020
comment
я только хочу сдвинуть единицы с индекса 3 на 0 и с 4 на 1 . Другие должны сохранить свои индексы. Если мой уже в индексе 0 или 1 или 2 -> ничего не делать - person Владислав Бушменьов; 21.05.2020
comment
@ВладиславБушменьов готово, проверьте обновленный ответ. - person Zabir Al Nazi; 21.05.2020