Tensorflow keras示例代码:引发TypeError:输入'Mul'的'y'Op具有与参数'x'的float64类型不匹配的float32类型

时间:2018-08-13 01:42:22

标签: python tensorflow keras dataset

Google Colab(python 2.7)或我的本地系统(python 3.6)上的Tensorflow 1.10 使用https://www.tensorflow.org/guide/keras中的示例代码 代码是

import tensorflow as tf
from tensorflow import keras
import numpy as np
import os
data =np.random.random((1000,32))
labels =np.random.random((1000,10))
dataset1 = tf.data.Dataset.from_tensor_slices((data, labels))
dataset1 = dataset1.batch(32)
dataset1 = dataset1.repeat()
model = keras.Sequential()  
model.add(keras.layers.Dense(64,activation='relu'))
model.add(keras.layers.Dense(64,activation='relu'))
model.add(keras.layers.Dense(10,activation='softmax'))

model.compile(optimizer=tf.train.AdamOptimizer(0.001),
          loss='categorical_crossentropy',
          metrics=['accuracy'])

model.fit(dataset1 ,epochs=10,steps_per_epoch=30)

引发以下错误:

    Error TypeError: Input 'y' of 'Mul' Op has type float32 that does not match type float64 of argument 'x'.

packages/tensorflow/python/framework/op_def_library.pyc in _apply_op_helper(self, op_type_name, name, **keywords)
    544                   "%s type %s of argument '%s'." %
    545                   (prefix, dtypes.as_dtype(attrs[input_arg.type_attr]).name,
--> 546                    inferred_from[input_arg.type_attr]))
    547 
    548           types = [values.dtype]

TypeError: Input 'y' of 'Mul' Op has type float32 that does not match type float64 of argument 'x'.

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我假设model中使用的默认数据类型是float32,而numpy中使用的默认数据类型是float64和{{1} }保留该类型。要解决此问题,只需更改代码:

from_tensor_slices

data = np.random.random((1000,32))
labels = np.random.random((1000,10))

但我确实认为tensorflow作为其教程中的一部分示例代码,应确保其运行。

编辑:刚刚发现这实际上是github上的一个未解决的问题:https://github.com/tensorflow/tensorflow/issues/22207

答案 1 :(得分:0)

我遇到了类似的问题。我使用此代码段。

model.compile(optimizer=opt,
          loss=keras.losses.categorical_crossentropy)

我猜Keras中的损失函数只需要'float'类型(我没有检查源代码)。为解决此问题,我在输出层的末尾添加了一层。

decoder_outputs = Lambda(lambda x: K.cast(x, 'float32'), name='change_to_float')(decoder_outputs)

希望这会有所帮助。