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)
抛出错误是因为您在未转换的情况下混合
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)
。