#python #tensorflow
#python #тензорный поток
Вопрос:
Когда я пытаюсь изменить форму вывода свертки с помощью tf.reshape()
, я получаю ошибку типа
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
Я не понимаю, почему это происходит. Кажется, что при преобразовании массива shape в тензор есть какая-то ошибка, но когда я пытаюсь преобразовать произвольный массив в тензор, он работает.
Я также попытался преобразовать все измерения в фактические значения (batch_size вместо -1), и это тоже не сработало.
Моя версия tensorflow равна 0.11, и я запускаю ее на компьютере Linux с поддержкой GPU.
Ответ №1:
Мне приходилось делать это раньше. Измените это
shape = h2.get_shape()
к этому:
shape = h2.get_shape().as_list()
Комментарии:
1. Это также решило мою (аналогичную) проблему, спасибо! Есть идеи, почему это происходит?
2. Я считаю, что .get_shape() возвращает тип tensor, в то время как на самом деле вам нужен либо массив numpy, либо простой список python для работы. Документация и функциональность не очень хороши, надеюсь, это улучшится, или развилка сделает более очевидным, что происходит.