0%

ov::Shape

摘要

  • ov::Shape 类 学习笔记

ov::Shape 详解

ov::Shape 是 OpenVINO 中的一个核心类,用于表示模型中张量的静态形状。它是一个简化的多维数组结构,包含每个维度的大小信息。在 OpenVINO 的模型构建、推理和优化中,ov::Shape 用于定义和操作张量的形状。


核心功能

  1. 静态形状描述
    ov::Shape 表示一个固定的张量形状,所有维度大小都已知。

  2. 多维数组支持
    可以表示任意维数的张量,例如 1D、2D、3D 或更高维度。

  3. 与 OpenVINO 图操作兼容
    用于定义模型输入、输出、权重以及中间节点的形状。

  4. 支持常见操作
    提供操作形状的接口,例如获取维度数、查询具体维度大小、修改形状等。


构造和使用

1. 构造 ov::Shape

从列表初始化

1
ov::Shape shape = {1, 3, 224, 224}; // 表示一个 4D 张量

默认构造

1
ov::Shape shape; // 创建一个空形状

使用初始化列表

1
ov::Shape shape({1, 3, 224, 224}); // 使用初始化列表

2. 获取形状信息

获取维度数

1
2
size_t rank = shape.size();
std::cout << "Rank: " << rank << std::endl;

获取具体维度大小

1
2
3
for (size_t i = 0; i < shape.size(); ++i) {
std::cout << "Dimension " << i << ": " << shape[i] << std::endl;
}

3. 修改形状

修改特定维度大小

1
shape[2] = 256; // 将第 3 维从 224 修改为 256

清空形状

1
shape.clear(); // 清空形状,变为空

重置形状

1
shape = {1, 3, 256, 256}; // 设置新的形状

方法详解

1. 构造函数

  • ov::Shape():默认构造,创建空形状。
  • ov::Shape(std::initializer_list<size_t>):从列表构造形状。
  • ov::Shape(const std::vector<size_t>&):从向量构造形状。

2. 常用方法

获取维度数

1
size_t size() const;

返回形状的维度数(即张量的 rank)。

访问维度大小

1
2
size_t& operator[](size_t idx);
const size_t& operator[](size_t idx) const;

通过索引访问或修改特定维度大小。

清空形状

1
void clear();

将形状清空,变为无维度。

检查是否为空

1
bool empty() const;

返回形状是否为空。

比较形状

1
2
bool operator==(const ov::Shape& other) const;
bool operator!=(const ov::Shape& other) const;

比较两个形状是否相等。


实际应用示例

以下示例展示了如何使用 ov::Shape 构造和操作形状:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <openvino/openvino.hpp>
#include <iostream>

int main() {
// 创建形状
ov::Shape shape = {1, 3, 224, 224};
std::cout << "Initial shape: ";
for (const auto& dim : shape) {
std::cout << dim << " ";
}
std::cout << std::endl;

// 修改维度大小
shape[2] = 256; // 修改高度为 256
shape[3] = 256; // 修改宽度为 256

// 打印修改后的形状
std::cout << "Modified shape: ";
for (const auto& dim : shape) {
std::cout << dim << " ";
}
std::cout << std::endl;

// 获取维度数
std::cout << "Shape rank: " << shape.size() << std::endl;

// 清空形状
shape.clear();
std::cout << "Is shape empty? " << (shape.empty() ? "Yes" : "No") << std::endl;

return 0;
}

与其他类的关系

1. 与 ov::PartialShape 的关系

  • ov::Shape 表示静态形状,每个维度大小固定。
  • ov::PartialShape 可以表示动态形状,其中部分维度大小未知(动态)。

2. 用于 ov::Tensor

ov::Shape 定义了张量的数据布局,例如:

1
ov::Tensor tensor(ov::element::f32, ov::Shape{1, 3, 224, 224});

3. 用于模型输入输出

定义模型输入或输出的形状:

1
auto input = std::make_shared<ov::op::v0::Parameter>(ov::element::f32, ov::Shape{1, 3, 224, 224});

常见问题

1. 如何表示标量?

标量(无维度的张量)用空形状表示:

1
ov::Shape scalar_shape = {};

2. 如何处理动态形状?

ov::Shape 不支持动态形状,需使用 ov::PartialShape

1
ov::PartialShape dynamic_shape = {1, ov::Dimension::dynamic(), 224, 224};

总结

ov::Shape 是 OpenVINO 中定义张量形状的重要类。它简单易用,能够有效描述和操作静态形状。通过与其他 OpenVINO 类的结合使用,ov::Shape 为构建和操作计算图提供了强大的功能支持。熟练掌握 ov::Shape 是进行 OpenVINO 模型开发的基础。

感谢老板支持!敬礼(^^ゞ