6

Ho una domanda sull'uso di Keras a cui sono piuttosto nuovo. Sto usando una rete neurale convoluzionale che alimenta i suoi risultati in uno strato percettivo standard, che genera la mia produzione. Questa CNN è alimentata con una serie di immagini. Questo è finora abbastanza normale.Keras: come alimentare l'input direttamente in altri strati nascosti della rete neurale rispetto al primo?

Ora mi piace passare un breve vettore di input non immagine direttamente nell'ultimo livello perceptron senza inviarlo attraverso tutti gli strati CNN. Come può essere fatto in Keras?

Il mio codice è simile al seguente:

# 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)) 

Tutte le risposte sono molto apprezzate, grazie!

risposta

3

A condizione backend del vostro Keras è Theano, è possibile effettuare le seguenti operazioni:

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) 
+0

Grazie per il vostro aiuto, Serj. Penso di aver capito il concetto. –

5

Lei non ha mostrato che tipo di modello che si sta utilizzando, ma sto supponendo che si inizializzato il modello come sequenziale . In un modello sequenziale è possibile impilare solo uno strato dopo l'altro, quindi non è possibile aggiungere una connessione "scorciatoia".

Per questo motivo gli autori di Keras hanno aggiunto l'opzione di costruire modelli "grafici". In questo caso puoi costruire un grafico (DAG) dei tuoi calcoli. È più complicato del progettare una pila di livelli, ma è ancora abbastanza facile.

Controllare il sito di documentazione per cercare ulteriori informazioni: http://keras.io/models/#using-the-graph-model

+0

Oh, capisco. Sì, ho davvero usato un set-up "sequenziale". Grazie per il tuo aiuto e il link! –

0

La risposta here opere è più alto livello e funziona anche per tensorflow backend:

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) 
Problemi correlati