【问题标题】:TypeError: Input 'y' of 'Mul' Op has type float32 that does not match type float64 of argument 'x'TypeError:“Mul”Op 的输入“y”的类型为 float32,与参数“x”的类型 float64 不匹配
【发布时间】:2019-01-19 16:55:50
【问题描述】:

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

import numpy as np
import tensorflow as tf
from tensorflow import keras

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'.

【问题讨论】:

  • 尝试使用data.astype(np.float32) 将您的输入数据和标签转换为float32
  • 我尝试使用 tf.cast 将所有列强制转换为 float64 和 float32,然后给出错误“列表索引超出范围”
  • 我无法让数据集作为 Keras 模型的输入。在张量流 1.10
  • 更改数据 = np.random.random((2000,32)) data.astype(np.float32) 错误 \site-packages\tensorflow\python\ keras\engine\training_arrays.py in fit_loop (模型,...,详细,回调,val_inputs,val_targets,val_sample_weights,shuffle,callback_metrics,initial_epoch,steps_per_epoch,validation_steps)175 indices_for_conversion_to_dense = [] 176 for i in range(len(feed)): --> 177 if issparse is not None and issparse(ins[i]) and not K.is_sparse(feed[i]): 178 indices_for_conversion_to_dense.append(i) IndexError: list index out of range

标签: python tensorflow keras dataset


【解决方案1】:

我遇到了同样的问题,我假设model 中使用的默认数据类型是float32,而numpy 的默认数据类型是float64,而from_tensor_slices 保留了该类型。要修复它,只需更改您的代码:

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

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

但我确实认为,作为教程中的一段示例代码,tensorflow 应该确保它运行。

更新:有一个与此相关的已关闭问题:https://github.com/tensorflow/tensorflow/issues/22207

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。我用这个代码sn-p。

    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)
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 2021-01-06
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多