摘要
ov::Shape 详解
ov::Shape
是 OpenVINO 中的一个核心类,用于表示模型中张量的静态形状。它是一个简化的多维数组结构,包含每个维度的大小信息。在 OpenVINO 的模型构建、推理和优化中,ov::Shape
用于定义和操作张量的形状。
核心功能
静态形状描述
ov::Shape
表示一个固定的张量形状,所有维度大小都已知。
多维数组支持
可以表示任意维数的张量,例如 1D、2D、3D 或更高维度。
与 OpenVINO 图操作兼容
用于定义模型输入、输出、权重以及中间节点的形状。
支持常见操作
提供操作形状的接口,例如获取维度数、查询具体维度大小、修改形状等。
构造和使用
1. 构造 ov::Shape
从列表初始化
1
| ov::Shape shape = {1, 3, 224, 224};
|
默认构造
使用初始化列表
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 = {1, 3, 256, 256};
|
方法详解
1. 构造函数
ov::Shape()
:默认构造,创建空形状。
ov::Shape(std::initializer_list<size_t>)
:从列表构造形状。
ov::Shape(const std::vector<size_t>&)
:从向量构造形状。
2. 常用方法
获取维度数
返回形状的维度数(即张量的 rank)。
访问维度大小
1 2
| size_t& operator[](size_t idx); const size_t& operator[](size_t idx) 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; shape[3] = 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 模型开发的基础。