modelo correr em sentido inverso em Keras

votos
4

Atualmente estou brincando com o quadro Keras. E ter feito alguns testes de classificação simples, etc. eu gostaria de encontrar uma maneira de executar a rede no sentido inverso, utilizando as saídas como entradas e vice-versa. Qualquer maneira de fazer isso?

Publicado 06/05/2016 em 12:55
fonte usuário
Em outras línguas...                            


4 respostas

votos
3

Não existe tal coisa como "executando uma rede neural em sentido inverso", como uma arquitetura genérica de rede neural não define qualquer processamento de dados não-forward . Há, no entanto, uma subclasse de modelos que fazer - os modelos de geradores, que não fazem parte do keras agora. A única coisa que você pode fazer é criar uma rede que de alguma forma "simula" o processo generativo que você está interessado. Mas este é método específico modelo paricular, e não tem solução geral.

Respondeu 08/05/2016 em 18:56
fonte usuário

votos
1

Eu não tenho certeza do caso de uso para isso, mas apenas adicionando em uma solução rápida, seria apenas para redesenhar uma arquitetura, de tal forma que as entradas foram então tratados como as saídas e vice-versa.

Supondo que os dados de entrada é na forma (como exemplo):

n_obs, n_feat = 1000, 20
n_labels = 2
n_hidden = 100 # you can make this whatever you want

Você normalmente iria projetar a camada de entrada como:

Dense(input_dim = n_feat, output_dim = n_hidden)

E a camada de saída como:

Dense(input_dim = n_hidden, output_dim = n_labels)

Se você, em seguida, queria correr esse "em sentido inverso", basta fazer um outro modelo, com a arquitetura oposto, como:

camada de entrada Nova:

Dense(input_dim = n_labels, output_dim = n_hidden)

camada de saída Nova:

Dense(input_dim = n_hidden, output_dim = n_feat)

Mas semelhante ao que lejlot disse acima, não existe uma solução única modelo aqui. Você não pode treinar o seu modelo com os dados introduzidos e, em seguida, testá-lo sobre os dados de saída. Isso faz sentido?

As matrizes de peso subjacentes tem que ter as dimensões corretas para os dados, e no momento em que você tentar dar-lhe diferentes dados em forma (ou seja, dados de saída no lugar dos dados de entrada), ele não pode executar a multiplicação de matrizes, que está no coração de cada rede neural.

Se você está confuso quanto a este ponto, você deve rever como Redes Neurais realmente funcionar, sob o capô.

Respondeu 15/07/2016 em 22:04
fonte usuário

votos
0

O que você está procurando, eu acho, é a rede neural "Auto-associativa". que tem uma entrada de n dimensões, de várias camadas, uma das quais é a "camada de meio" de dimensões m, e, em seguida, várias mais camadas que conduzem a uma camada de saída, que tem o mesmo número de dimensões que a camada de entrada, n.

A chave aqui é que m é muito menor do que n.

Como funciona é que você treinar a rede para recriar a entrada, exatamente na saída. Em seguida, você cortar a rede em duas metades. A metade da frente vai de n para m (dimensões que codificam a entrada em um espaço menor). A meia volta vai de dimensões de m para n dimensões (de descodificao, ou "reverso", se quiserem).

Muito útil para criptografia, compressão, aprendizagem não supervisionada, etc.

Respondeu 20/08/2018 em 22:51
fonte usuário

votos
1

Há uma maneira, mas sua milhagem pode variar, e ele só poderia voltar lixo na entrada, embora esse 'lixo' vai ainda produzir a saída que você está partindo. A frase chave é 'inputs tratar como pesos e treiná-los com o resto do modelo fixo'.

Ou seja, você pode substituir a camada de entrada com uma camada de pesos, congelar o resto do modelo e treinar os pesos enquanto que fixa as saídas.

Para ajustar este no tecido da Keras, eu criei uma camada de costume e chamou-lhe 'Recuperar'. Ele não é disparado, enquanto o modelo é treinado, no entanto, serve como uma camada de entrada do falso para o passo de formação inversa. (Eu tenho certeza que a abordagem pode ser otimizado ainda mais, mas isso é o mais rápido cortar eu poderia vir para cima com).

class Recover(Layer):
    def __init__(self, **kwargs):
        super(Recover, self).__init__(**kwargs)
        self.reverse = False

    def build(self, input_shape):
        self.kernel = self.add_weight(name='kernel', 
                                      shape=(input_shape[1],),
                                      initializer='uniform',
                                      trainable=True)
        super(Recover, self).build(input_shape)

    def call(self, x):
        if self.reverse:
            return K.ones_like(x)*self.kernel
        else:          
            return x

    def compute_output_shape(self, input_shape):
        return (input_shape[0], input_shape[0])

Adicionar esta camada directamente após a camada de entrada, definida trainablepara Falsesobre esta camada. Em primeiro lugar, treinar a rede normalmente, esta camada deve ser ignorado e trabalhar como pass-through.

Após isso é feito, pesos de reposição dentro desta camada, fixados reversea True, trainablea Truepara essa camada e trainablea Falsepara todas as outras camadas, recompilar o modelo e iniciar a formação de novo.

Algo ao longo destas linhas:

for x in model.layers:
    x.trainable = False
model.layers[0].trainable = True
model.layers[0].reverse = True
model.compile( ...your compile parameters... )

Neste ponto, as entradas reais será ignorado no momento da chamada model.fit, e uma apenas poderia especificar zeros na forma correta para a matriz de entrada.

Com esta abordagem, por vezes, ele vai ficar preso a uma solução sub-óptima. Apenas reinicializar os pesos da Recovercamada e repita. Depois de formados isso, os pesos da Recovercamada pode ser obtido através da chamada get_weights()e corresponderá às entradas do modelo original que vai fazer com que ele para produzir os resultados desejados.

O resultado mais provável será o ruído-like, e que poderia ser necessário introduzir perdas adicionais (via chamando self.add_lossdentro da callfunção) para coagir o modelo em produção de insumos significativos.

Respondeu 10/02/2020 em 23:02
fonte usuário

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