Calcular Acessos Na métrica em Teano

votos
0

Eu estou usando keras para construir um modelo recommender. Porque o conjunto de itens é muito grande, eu gostaria de calcular as batidas @ N métrica como uma medida de precisão. Ou seja, se o item observado é no top N previu, conta a recomendação como relevante.

I foi capaz de construir os hits em função N usando numpy. Mas como eu estou tentando porta-lo em uma função de perda personalizada para keras, estou tendo problema com os tensores. Especificamente, enumerando ao longo de um tensor é diferente. E quando eu olhei para a sintaxe de encontrar algo equivalente, comecei a questionar toda a abordagem. É superficial e lento, reflexivo da minha familiaridade geral python.

def hits_at(y_true, y_pred): #numpy version
    a=y_pred.argsort(axis=1) #ascending, sort by row, return index
    a = np.fliplr(a) #reverse to get descending
    a = a[:,0:10] #return only the first 10 columns of each row
    Ybool = [] #initialze 2D arrray
    for t, idx in enumerate(a):
        ybool = np.zeros(num_items +1) #zero fill; 0 index is reserved
        ybool[idx] = 1 #flip the recommended item from 0 to 1
        Ybool.append(ybool)
    A = map(lambda t: list(t), Ybool)
    right_sum = (A * y_true).max(axis=1) #element-wise multiplication, then find the max
    right_sum = right_sum.sum() #how many times did we score a hit?
    return right_sum/len(y_true) #fraction of observations where we scored a hit

Como devo abordar isso de uma forma mais compacta, e amigável-tensor?

Update: Eu era capaz de conseguir uma versão do Top 1 de trabalho. Baseei-lo livremente na GRU4Rec descrição def custom_objective(y_true, y_pred): y_pred_idx_sort = T.argsort(-y_pred, axis=1)[:,0] #returns the first element, which is the index of the row with the largest value y_act_idx = T.argmax(y_true, axis=1)#returns an array of indexes with the top value return T.cast(-T.mean(T.nnet.sigmoid((T.eq(y_pred_idx_sort,y_act_idx)))), theano.config.floatX)

Eu apenas tinha para comparar o conjunto de topo 1 predições para a matriz dos valores reais elemento a elemento. E Theano tem uma função eq () para fazer isso.

Publicado 18/04/2016 em 13:02
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Independente de N, o número de possíveis valores de sua função de perda é finito. Portanto, não pode ser diferenciável de uma forma tensor sensível e você não pode usá-lo como função de perda em Keras / Theano. Você pode tentar usar uma perda log Theano com caras top N.

UPDATE:

Em Keras - você pode escrever suas próprias funções de perda. Eles têm uma declaração de uma forma:

def loss_function(y_pred, y_true):

Ambos y_truee y_predsão matrizes numpy, para que possa obter easly um vector vque é um quando um exemplo dado é no topo 500 e 0 de outro modo. Depois, você pode transformá-lo em Teano tensor vector constante e aplicá-lo de uma forma:

return theano.tensor.net.binary_crossentropy(y_pred * v, y_true * v)

Isso deve funcionar corretamente.

UPDATE 2:

Log perda é a mesma coisa que binary_crossentropy.

Respondeu 18/04/2016 em 22:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more