gpt4 book ai didi

python - 将 TensorFlow 张量转换为 Numpy 数组

转载 作者:行者123 更新时间:2023-12-03 14:37:35 25 4
gpt4 key购买 nike

问题描述
我正在尝试在 TensorFlow 2.3.0 中编写自定义损失函数。要计算损失,我需要 y_pred要转换为 numpy 数组的参数。但是,我找不到从 <class 'tensorflow.python.framework.ops.Tensor'> 转换它的方法到 numpy 数组,尽管 TensorFlow 函数似乎可以这样做。
代码示例

def custom_loss(y_true, y_pred):
print(type(y_pred))
npa = y_pred.make_ndarray()
...


if __name__ == '__main__':
...
model.compile(loss=custom_loss, optimizer="adam")
model.fit(x=train_data, y=train_data, epochs=10)
给出错误信息: AttributeError: 'Tensor' object has no attribute 'make_ndarray打印类型后 y_pred参数: <class 'tensorflow.python.framework.ops.Tensor'>到目前为止我尝试过的
在寻找解决方案时,我发现这似乎是一个常见问题,并且有一些建议,但到目前为止它们对我不起作用:
1.“...所以只需在 Tensor 对象上调用 .numpy()。”:How can I convert a tensor into a numpy array in TensorFlow?
所以我试过:
def custom_loss(y_true, y_pred):
npa = y_pred.numpy()
...
给我 AttributeError: 'Tensor' object has no attribute 'numpy' 2.“使用tensorflow.Tensor.eval()将张量转换为数组”:How to convert a TensorFlow tensor to a NumPy array in Python
所以我试过:
def custom_loss(y_true, y_pred):
npa = y_pred.eval(session=tf.compat.v1.Session())
...
给了我我见过的最长的错误消息跟踪之一,核心是:
InvalidArgumentError: 2 root error(s) found.
(0) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
[[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]
[[functional_1/cropping2d/strided_slice/_1]]
(1) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
[[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]
还必须从 1.x 版调用 TensorFlow 兼容函数感觉不太适应 future ,所以无论如何我不太喜欢这种方法。
3.查看TensorFlow Docs似乎有我需要的功能等待:tf.make_ndarray从张量创建一个 numpy ndarray。
所以我试过:
def custom_loss(y_true, y_pred):
npa = tf.make_ndarray(y_pred)
...
给我 AttributeError: 'Tensor' object has no attribute 'tensor_shape'查看 TF 文档中的示例,他们在 proto_tensor 上使用它,因此我尝试首先转换为 proto:
def custom_loss(y_true, y_pred):
proto_tensor = tf.make_tensor_proto(y_pred)
npa = tf.make_ndarray(proto_tensor)
...
但已经是 tf.make_tensor_proto(y_pred)引发错误: TypeError: Expected any non-tensor type, got a tensor instead.同样尝试首先创建一个 const 张量会给出相同的错误:
def custom_loss(y_true, y_pred):
a = tf.constant(y_pred)
proto_tensor = tf.make_tensor_proto(a)
npa = tf.make_ndarray(proto_tensor)
...
关于这个的帖子还有很多,但似乎他们都回到了这三个基本想法。期待您的建议!

最佳答案

y_pred.numpy()在 TF 2 中工作,但 AttributeError: 'Tensor' object has no attribute 'make_ndarray表示您的代码的某些部分没有在 Eager 模式下运行,否则您将没有 Tensor对象但是一个 EagerTensor .
要启用 Eager 模式,请在构建图表中的任何内容之前将其放在代码的开头:

tf.config.experimental_run_functions_eagerly(True)
其次,当你编译你的模型时,添加这个参数:
model.compile(..., run_eagerly=True, ...)
现在您正在 Eager 模式下执行,并且所有变量实际上都包含您可以打印和使用的值。请注意,切换到 Eager 模式可能需要对代码进行额外调整(请参阅 here 以获得概述)。

关于python - 将 TensorFlow 张量转换为 Numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63869134/

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