我使用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),
)
答案 0 :(得分:1)
来自python文档:
如果对象具有永不更改的哈希值,则该对象是可清除的 在它的生命周期中(它需要一个哈希()方法),并且可以 与其他对象相比(它需要 eq ()方法)。可哈希 比较相等的对象必须具有相同的哈希值。
Hashability使对象可用作字典键和集合 member,因为这些数据结构在内部使用哈希值。
所有Python的不可变内置对象都是可清除的,而没有 可变容器(如列表或词典)是。对象 用户定义的类的实例默认是可以清除的;他们 所有比较不相等,它们的哈希值是它们的id()。
(https://docs.python.org/3.1/glossary.html)
您正在尝试从ndarray创建一个不可清除的dict。
您可以尝试使用tuple(np.ndarray)
P.S。请让您的问题更容易理解。发布您的整个代码不是获得答案的好方法。您应该调试并找到问题所在的确切行,打印输入,输出并说出您所期望的而不是您所获得的内容。