2017-06-29 7 views
0

Whit dieser Code:Tensorflow und Numpy Mismatch-Datenformat

import tensorflow as tf 

w = tf.Variable(tf.random_normal([ 3 , 3 , 1 , 1 ], stddev = 0.01)) 
if __name__ == '__main__': 
    initVar = tf.global_variables_initializer() 
    with tf.Session() as sess: 
     sess.run(initVar) 
     print w.eval() 

Wegen des Datenformats w = tf.Variable(tf.random_normal([kernel_height, kernel_width, input_channel, output_chhannel], stddev = 0.01)), würde ich erwarten, eine Matrix so zu sehen:

[[[[ -0.004 0.003 0.006] 
    [ -0.005 -0.008 0.001] 
    [ 0.006 0.007 0.002]]]] 

aber er druckt diese:

[[[[ 0.001]] 
    [[-0.031]] 
    [[-0.005]]] 

[[[ 0.006]] 
    [[ 0.011]] 
    [[ 0.006]]] 

[[[ 0.008]] 
    [[-0.001]] 
    [[ 0.014]]]] 

Was ich will ist, meine Gewicht Tensor-Werte eins nach dem anderen mit einem konstanten Tensor von 0 und 1 zu multiplizieren maskiert Gewichte wie zu haben:

w = [[[[ -0.004 0.003 0.006] 
     [ -0.005 -0.008 0.001] 
     [ 0.006 0.007 0.002]]]] 

mask = [[[[ 1 1 1] 
      [ 1 1 0] 
      [ 0 0 0]]]] 

w * mask = [[[[ -0.004 0.003 0.006] 
       [ -0.005 -0.008 0. ] 
       [ 0.  0.  0. ]]]] 

Der Code, den ich es benutzen:

mask = np.ones((3, 3, 1, 1), dtype=np.float32) 
    mask[1, 2, :, :] = 0. 
    mask[2, :, :, :] = 0. 

    weight = tf.get_variable("weight", [3, 3, 1, 1], tf.float32, tf.contrib.layers.xavier_initializer()) 

    weight *= tf.constant(mask, dtype=tf.float32) 

aber scheint es nicht richtig funktioniert. Ich schätze Ihre Hilfe.

Antwort

2

Sie benötigen

w = tf.Variable(tf.random_normal([1, 1, 3, 3], stddev=0.01)) 

und schließlich können Sie

import tensorflow as tf 
import numpy as np 

mask = np.ones((1, 1, 3, 3), dtype=np.float32) 
mask[:, :, 1, 2] = 0. 
mask[:, :, 2, :] = 0. 

print(mask) 

weight = tf.get_variable("weight", [3, 3, 1, 1], tf.float32, tf.contrib.layers.xavier_initializer()) 
weight *= tf.transpose(tf.constant(mask, dtype=tf.float32)) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print(tf.transpose(weight).eval()) 

verwenden Sie

[[[[ 1. 1. 1.] 
    [ 1. 1. 0.] 
    [ 0. 0. 0.]]]] 

[[[[ 0.88993669 0.80872607 0.57259583] 
    [ 0.5067296 -0.20804334 -0.  ] 
    [ 0.   0.   0.  ]]]] 
+0

erhalten Sie für Ihre ausführliche Antwort danken, aber wie ich schon erwähnt, verwende ich diese Daten formatiere '[kernel_height, kernel_width, input_channel, output_channel]' in meinem Modell. Ihr vorgeschlagener Ansatz passt also nicht zu meiner Aufgabe. Da Sie '[input_channel, output_channel, kernel_height, kernel_width] verwendet haben, hat' –

+0

@AliAbbasi tf ein festes Datenformat wie andere dl-Plattformen. Wenn Sie ein Bild verarbeiten, sollte ** W ** das [BHWC] -Format sein. – danche

+0

Also ich frage mich, die Tensorflow BHWC verwenden, aber mit Numpy, es in umgekehrter Reihenfolge BCHW, so dass Sie sagen, dass es kein Problem, und TF kann damit umgehen? habe ich recht? –