{TypeError}不可用类型:'numpy.ndarray'

时间:2018-06-19 02:17:11

标签: python tensorflow

我使用tensorflow来构建模型并想要训练它,但是我得到了这个错误:

  

{TypeError}不可用类型:'numpy.ndarray'

我的代码的一部分如下:

with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)
    for epoch in range(a.epochs):
        input, target = load_batch_data(batch_size=16, a=a)
        batch_input = input.astype(np.float32)
        batch_target = target.astype(np.float32)
        sess.run(predict_real, feed_dict={input: batch_input, target: batch_target})

'predict_real'是我模型的输出,我只是尝试运行它,但错误!

这是我模型的代码:

def build_model(input, target):
    with tf.variable_scope("generator"):
      out_channels = int(target.get_shape()[-1])
      outputs = create_generator(input, out_channels)


    with tf.name_scope("real_discriminator"):
        with tf.variable_scope("discriminator"):
           predict_real = create_discriminator(input, target)

    with tf.name_scope("fake_discriminator"):
         with tf.variable_scope("discriminator", reuse=True):
           predict_fake = create_discriminator(input, outputs)

    with tf.name_scope("discriminator_loss"):
         discrim_loss = tf.reduce_mean(-(tf.log(predict_real + EPS) + tf.log(1 - predict_fake + EPS)))

    with tf.name_scope("generator_loss"):
       gen_loss_GAN = tf.reduce_mean(-tf.log(predict_fake + EPS))
       gen_loss_L1 = tf.reduce_mean(tf.abs(target - outputs))
       gen_loss = gen_loss_GAN * a.gan_weight + gen_loss_L1 * a.l1_weight

    with tf.name_scope("discriminator_train"):
       discrim_tvars = [var for var in tf.trainable_variables() if var.name.startswith("discriminator")]
       discrim_optim = tf.train.AdamOptimizer(a.lr, a.beta1)
       discrim_grads_and_vars = discrim_optim.compute_gradients(discrim_loss, var_list=discrim_tvars)
       discrim_train = discrim_optim.apply_gradients(discrim_grads_and_vars)

    with tf.name_scope("generator_train"):
        with tf.control_dependencies([discrim_train]):
            gen_tvars = [var for var in tf.trainable_variables() if var.name.startswith("generator")]
            gen_optim = tf.train.AdamOptimizer(a.lr, a.beta1)
            gen_grads_and_vars = gen_optim.compute_gradients(gen_loss, var_list=gen_tvars)
            gen_train = gen_optim.apply_gradients(gen_grads_and_vars)

    ema = tf.train.ExponentialMovingAverage(decay=0.99)
    update_losses = ema.apply([discrim_loss, gen_loss_GAN, gen_loss_L1])

    global_step = tf.train.get_or_create_global_step()
    incr_global_step = tf.assign(global_step, global_step+1)
    return Model(
      predict_real=predict_real,
      predict_fake=predict_fake,
      discrim_loss=ema.average(discrim_loss),
      discrim_grads_and_vars=discrim_grads_and_vars,
      gen_loss_GAN=ema.average(gen_loss_GAN),
      gen_loss_L1=ema.average(gen_loss_L1),
      gen_grads_and_vars=gen_grads_and_vars,
      outputs=outputs,
      train=tf.group(update_losses, incr_global_step, gen_train),
)

1 个答案:

答案 0 :(得分:1)

来自python文档:

  

如果对象具有永不更改的哈希值,则该对象是可清除的   在它的生命周期中(它需要一个哈希()方法),并且可以   与其他对象相比(它需要 eq ()方法)。可哈希   比较相等的对象必须具有相同的哈希值。

     

Hashability使对象可用作字典键和集合   member,因为这些数据结构在内部使用哈希值。

     

所有Python的不可变内置对象都是可清除的,而没有   可变容器(如列表或词典)是。对象   用户定义的类的实例默认是可以清除的;他们   所有比较不相等,它们的哈希值是它们的id()。

https://docs.python.org/3.1/glossary.html

您正在尝试从ndarray创建一个不可清除的dict。

您可以尝试使用tuple(np.ndarray)

P.S。请让您的问题更容易理解。发布您的整个代码不是获得答案的好方法。您应该调试并找到问题所在的确切行,打印输入,输出并说出您所期望的而不是您所获得的内容。