2017-03-09 4 views
6

Ich verwende tf.slim, um einen Autoencoder zu implementieren. Ich bin voll Faltungs mit folgenden Architektur:Wiederverwenden von Schichtgewichten in Tensorflow

[conv, outputs = 1] => [conv, outputs = 15] => [conv, outputs = 25] => 
=> [conv_transpose, outputs = 25] => [conv_transpose, outputs = 15] => 
[conv_transpose, outputs = 1] 

Es muss vollständig Faltungs und ich kann Pooling (Grenzen des größeren Problems) nicht. Ich möchte gebunden Gewichte verwenden, so

encoder_W_3 = decoder_W_1_Transposed 

(so die Gewichte des ersten Decoders Schicht sind diejenigen der letzten Encoderschicht, umgesetzt).

Wenn ich Gewichte der reguläre Weg tfslim wiederverwenden können Sie wiederverwenden, dh Wiederverwendung = True und geben Sie dann nur den Umfang Namen der Ebene, die Sie wiederverwenden möchten, bekomme ich Größe Ausgabe:

ValueError: Trying to share variable cnn_block_3/weights, but specified shape (21, 11, 25, 25) and found shape (21, 11, 15, 25). 

Dies macht Sinn, wenn Sie die Gewichte des Vorgängermodells nicht transponieren. Hat jemand eine Idee, wie ich diese Gewichte umsetzen kann?

PS: Ich weiß, das ist sehr abstrakt und Hand-winkend, aber ich arbeite mit einer benutzerdefinierten API, auf der Oberseite von tfslim, so dass ich hier keine Codebeispiele buchen kann.

+0

Wie ich weiß, haben Gewichte in Tensorflow Form wie '[filter_height, filter_width, in_channels, out_channels]'. Ich nehme an, dass Sie für jede Ebene die gleiche Filtergröße haben. Wenn Sie also die Gewichte transponieren, sollte es eine Entsprechung für Decoder und Codierer geben? z. B. '[outputs = 1] => [outputs = 15]' kann nur von '[outputs = 15] => [outputs = 1]' verwendet werden. Aus der Fehlermeldung, ich nehme an, dass '15 => 25' zu '25 => 25' zugewiesen wurde. Aber wenn die Gewichte dieser beiden Schichten unterschiedlich sind, wie können sie geteilt werden? – Seven

Antwort

2

Hat jemand eine Idee, wie ich diese Gewichte transponieren kann?

Umsetzung ist einfach:

new_weights = tf.transpose(weights, perm=[0, 1, 3, 2]) 

werden die letzten beiden Achsen tauschen.

Wie jedoch @Seven erwähnt, würde das nicht ausreichen, um den Fehler zu beheben, da sich die Gesamtzahl der Gewichte geändert hat.

+0

Dies funktioniert gut für eine Transposition einer vorhandenen Variablen. Bei tf.slim sind die Kernelgewichte jedoch hinter einer Abstraktion versteckt - also sollte die Wiederverwendung (und das Transponieren) durch eine andere, noch unbekannte Methode erfolgen ... –

Verwandte Themen