Skip to content

Instantly share code, notes, and snippets.

@braingineer
Created April 11, 2016 15:16
Show Gist options
  • Save braingineer/fe8140cbb2258eb7574bf00fa9001918 to your computer and use it in GitHub Desktop.
Save braingineer/fe8140cbb2258eb7574bf00fa9001918 to your computer and use it in GitHub Desktop.
Tensor Accuracy w/ Mask
import numpy as np
import theano.tensor as T
pred = np.arange(30, dtype=np.float32).reshape(2,3,5)
pred /= pred.sum(axis=-1, keepdims=True)
### target matrix to match pred
target1 = np.ones_like(pred)
target1[:,:,:-1] = 0
### target matrix to match mask
target2 = np.ones_like(pred)
target2[:,:,:-1] = 0
target2[0,-1,-1] = 0
### mask
mask = np.ones(pred.shape[:-1])
mask[0,-1] = 0
mask
# preserve last dimension
flat_shape = lambda mat: (reduce(lambda x,y: x*y, mat.shape[:-1]), mat.shape[-1])
F_flat = lambda mat: T.reshape(mat, flat_shape(mat))
# compare two matrices
F_comp = lambda mat1, mat2: T.eq(T.argmax(mat1,axis=-1), T.argmax(mat2,axis=-1))
# mask the matrix
F_mask = lambda mat, mask: mat[mask.flatten().nonzero()]
# get the mean
F_mean = lambda mat: T.mean(mat)
F_score1 = lambda mat1, mat2: F_mean(F_comp(mat1, mat2))
F_score2 = lambda mat1,mat2, mask: F_mean(F_mask(F_comp(F_flat(mat1), F_flat(mat2)), mask))
F_score1(pred, target1).eval() ## returns 1.0
F_score1(pred, target2).eval() ## returns 0.83
F_score2(pred, target1, mask).eval() ## returns 1.0
F_score2(pred, target2, mask).eval() ## returns 1.0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment