2016-10-09 9 views
7

を与え、私はtf.reshape()を使用してコンボリューションの出力を再構築しようとすると、私は例外TypeErrorは例外TypeError

TypeError: Expected binary or unicode string, got -1 

を取得し、私が書かれているモデルは次のとおりです。

with tf.name_scope('conv1'): 
    filter = tf.Variable(tf.truncated_normal([5, 5, 1, self.num_hidden/2], mean=0.0, 
              stddev=0.02, dtype=tf.float32), 
         name='filter') 
    b = tf.Variable(tf.zeros([self.num_hidden/2], dtype=tf.float32), 
        name='b') 
    h1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(inp, filter, 
            [1, 2, 2, 1], padding='SAME'), b)) 
with tf.name_scope('conv2'): 
    filter = tf.Variable(tf.truncated_normal([5, 5, self.num_hidden/2, self.num_hidden], mean=0.0, 
              stddev=0.02, dtype=tf.float32), 
         name='filter') 
    b = tf.Variable(tf.zeros([self.num_hidden], dtype=tf.float32), 
        name='b') 
    h2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(h1, filter, 
            [1, 2, 2, 1], padding='SAME'), b)) 
    # h2 -> [-1, 7, 7, 32] 
    # num_units -> [-1, 1568] 
    shape = h2.get_shape() 
    num_units = shape[1]*shape[2]*shape[3] 
with tf.name_scope('reshape'): 
    h2_flattened = tf.reshape(h2, [-1, num_units]) 
    h2_flattened = tf.nn.dropout(h2_flattened, keep_prob=0.9) 
with tf.name_scope('prediction'): 
    W = tf.Variable(tf.truncated_normal([num_units, 1], mean=0.0, stddev=0.01, 
             dtype=tf.float32), name='W') 
    b = tf.Variable(tf.zeros([1], dtype=tf.float32), name='b') 
    self.pred = tf.matmul(h2_flattened, W) + b 

そして、正確なエラーは次のとおりです。

Traceback (most recent call last): 
    File "single_model_conv.py", line 108, in <module> 
    gan = GAN(num_latent, 28, 'single') 
    File "single_model_conv.py", line 23, in __init__ 
    self.adversary(self.gen_image) 
    File "single_model_conv.py", line 93, in adversary 
    h2_flattened = tf.reshape(h2, [-1, num_units]) 
    File "/nfs/nemo/u3/idurugkar/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 1977, in reshape 
    name=name) 
    File "/nfs/nemo/u3/idurugkar/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/op_def_library.py", line 490, in apply_op 
    preferred_dtype=default_dtype) 
    File "/nfs/nemo/u3/idurugkar/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 657, in convert_to_tensor 
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) 
    File "/nfs/nemo/u3/idurugkar/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 180, in _constant_tensor_conversion_function 
    return constant(v, dtype=dtype, name=name) 
    File "/nfs/nemo/u3/idurugkar/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 163, in constant 
    tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape)) 
    File "/nfs/nemo/u3/idurugkar/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 422, in make_tensor_proto 
    tensor_proto.string_val.extend([compat.as_bytes(x) for x in proto_values]) 
    File "/nfs/nemo/u3/idurugkar/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/util/compat.py", line 64, in as_bytes 
    (bytes_or_text,)) 
TypeError: Expected binary or unicode string, got -1 

私はこれがなぜ起こっているのか分かりません。形状配列をテンソルに変換する際に何らかのエラーがあるようですが、任意の配列をテンソルに変換しようとすると動作します。 私はまた、実際の値(-1の代わりにbatch_size)にすべての次元を変換しようとしたが、どちらも動作しません。

私のテンソルフローバージョンは0.11で、GPUをサポートしているLinuxマシンで実行しています。

答えて

8

私はこれを前にしなければなりませんでした。これまでこの

shape = h2.get_shape() 

を変更します。

shape = h2.get_shape().as_list() 
+0

これはあなたに感謝し、また私の(同様の)問題を解決しました!なぜこれが起こっているのか? – agrinh

+0

私は、あなたが実際に望むのは、numpy配列か、または普通のpythonリストで動作するのに対し、.get_shape()は型テンソルを返します。ドキュメンテーションと機能はうまくいけばそれほどうまくいけません。それがうまくいくか、それがフォークすると、何が起こっているのかがより明白になります。 – Steven