了解 Tensorflow 对象检测模型的 INDArray 维度重塑

Understanding INDArray dimension reshaping for Tensorflow Object detection models

尝试将经过 Tensorflow 训练的模型加载到 Deeplearning4J 中,但出现以下错误:

IllegalStateException: Invalid array shape: cannot associate an array with shape [38880] with a placeholder of shape [-1, -1, -1, 3]:shape is wrong rank or does not match on one or more dimensions
var arr: INDArray = Nd4j.create(data) //.reshape(1, -1, -1, 3);
arr = Nd4j.pile(arr, arr)
sd.associateArrayWithVariable(arr, sd.variables.get(0))

Python 模型是这样加载的:

# Load image using OpenCV and
# expand image dimensions to have shape: [1, None, None, 3]
# i.e. a single-column array, where each item in the column has the pixel RGB value
image = cv2.imread(PATH_TO_IMAGE)
image_expanded = np.expand_dims(image, axis=0)

有知道的请说明问题:

1) 就 Python 数组

而言,[1, None, None, 3] 是什么意思

2) Python

中的np.expand_dims(image, axis=0)是什么意思

3) Deeplearning4J 重塑(1, -1, -1, 3);

您在这里混合了两个不同的概念,TF 占位符和类似 numpy 的命令式重塑。

在您的例子中,模型需要 4D 输入张量,形状为 [-1, -1, -1, 3]。对于人类,它可以翻译成 [Any, Any, Any, 3]。但是你正试图用形状为 [38880]、秩为 1 的张量来喂养它。

现在回答你的问题。

1) 见上。 -1 被视为 "Any".

2) 此函数添加 1 作为维度。即,如果你有 [38880],expand_dims at axis=0 将使它成为 [1, 38880]

3) 不,那是错误的。你不应该使用它作为你的形状。你那里有一些图像,所以你应该指定图像的适当尺寸,即 [1, 800, 600, 3]。