Keras: Como alimentar de entrada diretamente em outras camadas escondidas da rede neural do que o primeiro?

votos
7

Eu tenho uma pergunta sobre o uso Keras para o qual eu sou bastante novo. Eu estou usando uma rede neural convolutional que alimenta seus resultados em uma camada perceptron padrão, o que gera a minha saída. Este CNN é alimentado com uma série de imagens. Este é até agora bastante normal.

Agora eu gostaria de passar um não-imagem de entrada vector curto diretamente para a última camada perceptron sem enviá-lo através de todas as camadas da CNN. Como isso pode ser feito em Keras?

Meu código parecido com este:

# last CNN layer before perceptron layer
model.add(Convolution2D(200, 2, 2, border_mode='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Dropout(0.25))

# perceptron layer
model.add(Flatten())

# here I like to add to the input from the CNN an additional vector directly

model.add(Dense(1500, W_regularizer=l2(1e-3)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))

Quaisquer respostas são muito apreciadas, obrigado!

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


3 respostas

votos
3

Desde que o seu backend de Keras é Theano, você pode fazer o seguinte:

import theano
import numpy as np

d = Dense(1500, W_regularizer=l2(1e-3), activation='relu') # I've joined activation and dense layers, based on assumption you might be interested in post-activation values
model.add(d)
model.add(Dropout(0.5))
model.add(Dense(1))

c = theano.function([d.get_input(train=False)], d.get_output(train=False))
layer_input_data = np.random.random((1,20000)).astype('float32') # refer to d.input_shape to get proper dimensions of layer's input, in my case it was (None, 20000)
o = c(layer_input_data)
Respondeu 24/02/2016 em 08:17
fonte usuário

votos
6

Você não mostrar que tipo de modelo que você está usando, mas eu estou supondo que você inicializado o seu modelo como sequencial. Em um modelo sequencial só pode empilhar uma camada após a outra - assim que adicionar uma conexão "de atalho" não é possível.

Por esta razão, a opção de construção de modelos "gráfico" autores de Keras acrescentou. Neste caso, você pode construir um gráfico (DAG) de seus cálculos. É um mais complicado do que projetar uma pilha de camadas, mas ainda bastante fácil.

Verifique o site de documentação para procurar mais detalhes: http://keras.io/models/#using-the-graph-model

Respondeu 25/02/2016 em 21:11
fonte usuário

votos
0

A resposta aqui funciona é mais alto nível e funciona também para tensorflowbackend:

input_1 = Input(input_shape)
input_2 = Input(input_shape)

merge = merge([input_1, input_2], mode="concat")  # could also to "sum", "dot", etc.
hidden = Dense(hidden_dims)(merge)
classify = Dense(output_dims, activation="softmax")(hidden)

model = Model(input=[input_1, input_2], output=hidden)
Respondeu 21/02/2018 em 14:46
fonte usuário

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