2016-12-04 10 views
2

Angenommen, ich habe eine Schicht mit Ausgang verdunkelt (4, x, y). Ich möchte dies in 4 separate (1, x, y) Tensoren aufteilen, die ich als Eingabe für 4 andere Schichten verwenden kann.Split-Ausgabe einer Schicht in Keras

Was ich im Wesentlichen suchen ist das Gegenteil der Merge-Ebene. Ich weiß, dass es in Keras keine geteilte Schicht gibt, aber gibt es eine einfache Möglichkeit, dies in Keras zu tun?

Antwort

3

Sind Sie auf der Suche nach so etwas?

import keras.backend as K 
import numpy as np 

val = np.random.random((4, 2, 3)) 
t = K.variable(value=val) 
t1 = t[0, :, :] 
t2 = t[1, :, :] 
t3 = t[2, :, :] 
t4 = t[3, :, :] 

print('t1:\n', K.eval(t1)) 
print('t2:\n', K.eval(t2)) 
print('t3:\n', K.eval(t3)) 
print('t4:\n', K.eval(t4)) 
print('t:\n', K.eval(t)) 

Es gibt die folgende Ausgabe:

t1: 
[[ 0.18787734 0.1085723 0.01127671] 
[ 0.06032621 0.14528386 0.21176969]] 
t2: 
[[ 0.34292713 0.56848335 0.83797884] 
[ 0.11579451 0.21607392 0.80680907]] 
t3: 
[[ 0.1908586 0.48186591 0.23439431] 
[ 0.93413448 0.535191 0.16410089]] 
t4: 
[[ 0.54303145 0.78971165 0.9961108 ] 
[ 0.87826216 0.49061012 0.42450914]] 
t: 
[[[ 0.18787734 0.1085723 0.01127671] 
    [ 0.06032621 0.14528386 0.21176969]] 

[[ 0.34292713 0.56848335 0.83797884] 
    [ 0.11579451 0.21607392 0.80680907]] 

[[ 0.1908586 0.48186591 0.23439431] 
    [ 0.93413448 0.535191 0.16410089]] 

[[ 0.54303145 0.78971165 0.9961108 ] 
    [ 0.87826216 0.49061012 0.42450914]]] 

Man beachte, dass jetzt t1, t2, t3, t4 von shape(2,3) ist.

print(t1.shape.eval()) # prints [2 3] 

Also, wenn Sie die 3D-Form behalten möchten, müssen Sie Folgendes tun:

t1 = t[0, :, :].reshape((1, 2, 3)) 
t2 = t[1, :, :].reshape((1, 2, 3)) 
t3 = t[2, :, :].reshape((1, 2, 3)) 
t4 = t[3, :, :].reshape((1, 2, 3)) 

Nun Sie die aufgespießt Tensoren in der richtigen Dimension bekommen.

print(t1.shape.eval()) # prints [1 2 3] 

Ich hoffe, dass es Ihnen helfen wird, Ihr Problem zu lösen.

+0

Ich war eigentlich auf der Suche nach etwas, das zu einer Split/Slice-Schicht analog ist. Aber ich denke, ich muss so etwas mit einer Lambda-Ebene verwenden, wenn ich dafür keine eigene Ebene schreiben möchte. Danke –

+0

besten Weg zu danken ist durch die Annahme der Antwort. Übrigens, soweit ich weiß, ist Split-Layer in Keras in Entwicklung. aber ja, Sie können Lambda-Layer verwenden. Ich habe kein Beispiel mit Lambda-Layer angegeben, weil ich immer daran glaube, die Dinge einfach zu halten. Also dachte ich, du wirst dein Ziel erreichen, indem du meine Antwort änderst :) –

Verwandte Themen