gpt4 book ai didi

python - 无效参数错误 : cannot compute MatMul as input #0(zero-based) was expected to be a float tensor but is a double tensor [Op:MatMul]

转载 作者:太空狗 更新时间:2023-10-30 00:42:24 24 4
gpt4 key购买 nike

有人可以解释一下,TensorFlow 的 eager 模式是如何工作的吗?我正在尝试构建一个简单的回归,如下所示:

import tensorflow as tf

tfe = tf.contrib.eager
tf.enable_eager_execution()

import numpy as np


def make_model():
net = tf.keras.Sequential()
net.add(tf.keras.layers.Dense(4, activation='relu'))
net.add(tf.keras.layers.Dense(1))
return net

def compute_loss(pred, actual):
return tf.reduce_mean(tf.square(tf.subtract(pred, actual)))

def compute_gradient(model, pred, actual):
"""compute gradients with given noise and input"""
with tf.GradientTape() as tape:
loss = compute_loss(pred, actual)
grads = tape.gradient(loss, model.variables)
return grads, loss

def apply_gradients(optimizer, grads, model_vars):
optimizer.apply_gradients(zip(grads, model_vars))

model = make_model()
optimizer = tf.train.AdamOptimizer(1e-4)

x = np.linspace(0,1,1000)
y = x+np.random.normal(0,0.3,1000)
y = y.astype('float32')
train_dataset = tf.data.Dataset.from_tensor_slices((y.reshape(-1,1)))

epochs = 2# 10
batch_size = 25
itr = y.shape[0] // batch_size
for epoch in range(epochs):
for data in tf.contrib.eager.Iterator(train_dataset.batch(25)):
preds = model(data)
grads, loss = compute_gradient(model, preds, data)
print(grads)
apply_gradients(optimizer, grads, model.variables)
# with tf.GradientTape() as tape:
# loss = tf.sqrt(tf.reduce_mean(tf.square(tf.subtract(preds, data))))
# grads = tape.gradient(loss, model.variables)
# print(grads)
# optimizer.apply_gradients(zip(grads, model.variables),global_step=None)

渐变输出:[None, None, None, None, None, None]错误如下:

----------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-3-a589b9123c80> in <module>
35 grads, loss = compute_gradient(model, preds, data)
36 print(grads)
---> 37 apply_gradients(optimizer, grads, model.variables)
38 # with tf.GradientTape() as tape:
39 # loss = tf.sqrt(tf.reduce_mean(tf.square(tf.subtract(preds, data))))

<ipython-input-3-a589b9123c80> in apply_gradients(optimizer, grads, model_vars)
17
18 def apply_gradients(optimizer, grads, model_vars):
---> 19 optimizer.apply_gradients(zip(grads, model_vars))
20
21 model = make_model()

~/anaconda3/lib/python3.6/site-packages/tensorflow/python/training/optimizer.py in apply_gradients(self, grads_and_vars, global_step, name)
589 if not var_list:
590 raise ValueError("No gradients provided for any variable: %s." %
--> 591 ([str(v) for _, v, _ in converted_grads_and_vars],))
592 with ops.init_scope():
593 self._create_slots(var_list)

ValueError: No gradients provided for any variable:

编辑

我更新了我的代码。现在,问题出现在梯度计算中,它返回零。我检查了非零的损失值。

最佳答案

第 1 部分:问题确实出在您输入的数据类型上。默认情况下,您的 keras 模型需要 float32,但您传递的是 float64。您可以更改模型的 dtype 或将输入更改为 float32。

要更改您的模型:

def make_model():
net = tf.keras.Sequential()
net.add(tf.keras.layers.Dense(4, activation='relu', dtype='float32'))
net.add(tf.keras.layers.Dense(4, activation='relu'))
net.add(tf.keras.layers.Dense(1))
return net

要更改您的输入:y = y.astype('float32')

第 2 部分:您需要在 tf.GradientTape() 下调用计算模型(即 model(data))的函数。例如,您可以将 compute_loss 方法替换为以下内容:

def compute_loss(model, x, y):
pred = model(x)
return tf.reduce_mean(tf.square(tf.subtract(pred, y)))

关于python - 无效参数错误 : cannot compute MatMul as input #0(zero-based) was expected to be a float tensor but is a double tensor [Op:MatMul],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54255431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com