Preprocess Accuracy metric

I have a model which predicts 5 classes. I want to change Accuracy metric as in example below :

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 

I think tf.where can help to filter tensor, but unfortunately can't do this correctly.

How to make this preprocessing accuracy metric with Tensors ?

Upvotes: 1

Views: 50

Answers (1)

Zabir Al Nazi Nabil
Zabir Al Nazi Nabil

Reputation: 11208

If you want to shift the ones to left by 3 indices, you can do this:

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]]

Update:

If you only want to shift for index 3 and 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]]

Upvotes: 1

Related Questions