InvalidArgumentError:无法计算 MatMul,因为输入 #1(从零开始)预计是双张量,但实际上是浮点张量 [Op:MatMul] 名称:

问题描述 投票:0回答:1

input_data 的数据类型是 numpy.float64 的数组,但代码在张量流库中仍然失败,因为它不是“double”。不知道如何解决这个问题。

import tensorflow as tf
import numpy as np

input_data = np.random.uniform(low=0.0, high=1.0, size=100)
print("type(input_data):", type(input_data), "type(input_data[0]):", type(input_data[0]))

class ArtificialNeuron(tf.Module):
    def __init__(self):
        self.w = tf.Variable(tf.random.normal(shape=(1, 1)))
        self.b = tf.Variable(tf.zeros(shape=(1,)))

    def __call__(self, x):
        return tf.sigmoid(tf.matmul(x, self.w) + self.b)

neuron = ArtificialNeuron()

# Fails here: InvalidArgumentError: cannot compute MatMul as input #1(zero-based) was expected to be a double tensor but is a float tensor [Op:MatMul] name: 
output_data = neuron(input_data)  
python numpy tensorflow types
1个回答
0
投票

抛出错误是因为您在未转换的情况下混合

float32
float64
张量。默认情况下,
numpy
使用
float64
,而 TensorFlow 使用
float32
。通常较高级别的模块会执行转换,但我认为您使用的是低级构建块,因此您必须自己进行转换。

您可以简单地测试一下:

import numpy as np
import tensorflow as tf

x = np.array([[1.0]], dtype=np.float64)
w = tf.zeros(shape=(1,1))
tf.matmul(x, w)

# => InvalidArgumentError: cannot compute MatMul as input #1(zero-based) was expected to be a double tensor but is a float tensor [Op:MatMul]
# Changing np.float32 to np.float64 above the code works...

因此,您要么必须使用

float32
将输入转换为
np.float32(input_data)
,要么到处使用
float64
张量。您还可以将 TensorFlow 的默认精度更改为
float64
,如下所述:TensorFlow 默认精度模式?

简而言之,要修复代码,请将最后一行中的

input_data
替换为
np.float32(input_data)
,并将
size=100
定义中的
input_data
替换为
size=(100,1)

© www.soinside.com 2019 - 2024. All rights reserved.