我正在开发一个项目,使用Keras训练了一系列二元分类器,并使用Tensorflow作为后端引擎。我的输入数据是一系列图像,其中每个二元分类器必须对图像进行预测,稍后我将预测保存在 CSV 文件中。
我遇到的问题是,当我从第一个系列的二元分类器获得预测时,没有任何警告,但是当第五个或第六个二元分类器调用输入数据的预测方法时,我收到以下警告:
警告:tensorflow:最近 5 次调用 <function Model.make_predict_function..predict_function at 0x2b280ff5c158> 触发了 tf.function 回溯。跟踪成本很高,并且跟踪次数过多可能是由于 (1) 在循环中重复创建 @tf.function,(2) 传递不同形状的张量,(3) 传递 Python 对象而不是张量。对于 (1),请在循环外部定义 @tf.function。对于(2),@tf.function具有experimental_relax_shapes=True选项,可以放宽参数形状,从而避免不必要的回溯。对于(3),请参阅 https://www.tensorflow.org/tutorials/customization/performance#python_or_tensor_args 和https://www.tensorflow.org/api_docs/python/tf/function了解更多详细信息。
为了回答括号中的每一点,我的答案如下:
我调试了我的程序,发现调用预测方法时总是会出现此警告。总结我编写的代码如下:
import cv2 as cv
import tensorflow as tf
from tensorflow.keras.models import load_model
# Load the models
binary_classifiers = [load_model(path) for path in path2models]
# Get the images
images = [#Load …Run Code Online (Sandbox Code Playgroud) 我必须使用CUDA解决 GPU 上的代码问题,但我总是收到堆栈大小的警告,因为“函数名称”无法静态确定。
这是我正在开发的一个学生项目,该项目是使用CUDA 9.0库用C语言编写的,并且在NVIDIA Quadro K5000 gpu上运行。
每个线程必须执行一个函数,并且在这个函数中,同一个函数有两个递归调用,我之所以想使用这两个递归调用,是因为它使代码对我来说干净简单,但是如果有只有一次递归调用,不再存在堆栈大小问题。
这是我每次编译代码时遇到的错误:
CUDA支持递归函数调用,但我不明白为什么当有两个递归调用时会出现问题。
__device__ void bitonicMergeGPU(float *arr, int l, int indexT, int order)
{
int k,p;
if(l > 1)
{
p = l/2;
for(k=indexT;k<indexT+p;k++)
{
//Compare the values.
compareAndExchange(arr,k,k+p,order);
}
//THIS IS WHERE I GET THE ERROR
bitonicMergeGPU(arr,p,indexT,order);
bitonicMergeGPU(arr,p,indexT+p,order);
}
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否可以解决递归调用的问题。