O caminho certo para definir uma função em Teano?

votos
6

Fundo:

Normalmente eu vou definir uma função Theano com entrada como 'x = fmatrix ()', no entanto, durante a modificação keras (uma biblioteca de aprendizagem profunda baseado em Teano) para fazê-lo funcionar com custo CTC, notei um problema muito estranho: se uma entrada da função de custo é declarado como

x = tensor.zeros(shape=[M,N], dtype='float32')

ao invés de

x = fmatrix()

o processo de formação irão convergir muito mais rápido.

Um problema simplificado:

inteiros Os códigos acima são bastante grande. Então eu tento simplificar o problema como o seguinte: digamos que uma função para calcular Levenshtein distância de edição como

import theano
from theano import tensor
from theano.ifelse import ifelse
def editdist(s, t):
    def update(x, previous_row, target):
        current_row = previous_row + 1
        current_row = tensor.set_subtensor(current_row[1:], tensor.minimum(current_row[1:], tensor.add(previous_row[:-1], tensor.neq(target,x))))
        current_row = tensor.set_subtensor(current_row[1:], tensor.minimum(current_row[1:], current_row[0:-1] + 1))
        return current_row
    source, target = ifelse(tensor.lt(s.shape[0], t.shape[0]), (t, s), (s, t))
    previous_row = tensor.arange(target.size + 1, dtype=theano.config.floatX)
    result, updates = theano.scan(fn = update, sequences=source, outputs_info=previous_row, non_sequences=target, name='editdist')
    return result[-1,-1]

então eu definir duas funções f1 e f2 como:

x1 = tensor.fvector()
x2 = tensor.fvector()
r1 = editdist(x1,x2)
f1 = theano.function([x1,x2], r1)
x3 = tensor.zeros(3, dtype='float32')
x4 = tensor.zeros(3, dtype='float32')
r2 = editdist(x3,x4)
f2 = theano.function([x3,x4], r2)

Ao calcular com F1 e F2, os resultados são diferentes:

>>f1([1,2,3],[1,3,3])
   array(1.0)

>>f2([1,2,3],[1,3,3])
   array(3.0)

f1 dá o resultado certo, mas f2 doe.

Portanto, meu problema é: qual é o caminho certo para definir uma função Theano? E, o que realmente deu errado sobre F2?

Atualizar:

Estou usando Theano da versão 0.8.0.dev0. Eu apenas tentei Theano 0.7.0, tanto F1 e F2 dar resultado correto. Talvez este seja um bug de Teano?

Update_1st 2016/01/27:

De acordo com a explicação do @lamblin sobre esta questão ( https://github.com/Theano/Theano/issues/3925#issuecomment-175088918 ), este foi realmente um erro de Teano, e foi corrigido na mais recente (1- 26-2016) versão. Por conveniência, a explicação de Lamblin é citado aqui:

A primeira forma é a mais natural, mas, em teoria, ambos devem ser equivalentes. x3 e x4 são criados como a saída de uma operação de alocação, cuja entrada seria a constante 3, em vez de entradas gratuitas como x1 e x2, mas isso não importa desde que você passar [x3, x4] como entradas para theano.function, que deve cortar o gráfico computação ali.

Meu palpite é que varredura é otimizar prematuramente, acreditando que x3 ou x4 é garantido para ser sempre a constante 0, e faz algumas simplificações que se mostrou incorreta quando os valores são fornecidos por eles. Isso seria um erro real em varredura .

Update_2nd 2016/01/27:

Infelizmente o erro não é totalmente corrigido ainda. Na seção fundo eu mencionei se uma entrada da função de custo é declarado como tensor.zeros () o processo de convergência será muito mais rápido, eu descobri a razão: quando a entrada declarado como tensor.zeros (), a função de custo deu resultado incorreto, embora misteriosamente isso ajudou a convergência. Eu consegui um problema reprodução de demonstração simplificada aqui ( https://github.com/daweileng/TheanoDebug ), execute o ctc_bench.py e você pode ver os resultados.

Publicado 24/01/2016 em 23:56
fonte usuário
Em outras línguas...                            


1 respostas

votos
2

theano.tensor.zeros(...) não pode tomar qualquer valor diferente de 0.

A menos que você adicionar nós ao gráfico de curso e modificar partes dos zeros tensor usando theano.tensor.set_subtensor.

O tensor de entrada theano.tensor.fmatrixpode assumir qualquer valor que você entrada.

Respondeu 25/01/2016 em 06:45
fonte usuário

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