手动对数据进行张化时,如何创建TensorFloat16Bit
?
我们根据这个Microsoft示例对数据进行了张化,在该示例中,我们将255 - 0转换为1 - 0,并更改RGBA顺序。
...
std::vector<int64_t> shape = { 1, channels, height , width };
float* pCPUTensor;
uint32_t uCapacity;
// The channels of image stored in buffer is in order of BGRA-BGRA-BGRA-BGRA.
// Then we transform it to the order of BBBBB....GGGGG....RRRR....AAAA(dropped)
TensorFloat tf = TensorFloat::Create(shape);
com_ptr<ITensorNative> itn = tf.as<ITensorNative>();
CHECK_HRESULT(itn->GetBuffer(reinterpret_cast<BYTE**>(&pCPUTensor), &uCapacity));
// 2. Transform the data in buffer to a vector of float
if (BitmapPixelFormat::Bgra8 == pixelFormat)
{
for (UINT32 i = 0; i < size; i += 4)
{
// suppose the model expects BGR image.
// index 0 is B, 1 is G, 2 is R, 3 is alpha(dropped).
UINT32 pixelInd = i / 4;
pCPUTensor[pixelInd] = (float)pData[i];
pCPUTensor[(height * width) + pixelInd] = (float)pData[i + 1];
pCPUTensor[(height * width * 2) + pixelInd] = (float)pData[i + 2];
}
}
参考:www.example.comhttps://github.com/microsoft/Windows-Machine-Learning/blob/2179a1dd5af24dff4cc2ec0fc4232b9bd3722721/Samples/CustomTensorization/CustomTensorization/TensorConvertor.cpp#L59-L77
我刚刚将我们的.onnx
模型转换为float16,以验证在可用硬件支持float16时,这是否会在推断方面提供一些性能改进。但是,绑定失败,这里的建议是传递一个TensorFloat16Bit
。
如果我把TensorFloat换成TensorFloat16Bit,我会在pCPUTensor[(height * width * 2) + pixelInd] = (float)pData[i + 2];
处得到一个访问冲突异常,因为pCPUTensor
的大小是原来的一半。看起来我应该把_cast重新解释为uint16_t**
或这些行中的其他内容,所以pCPUTensor
的大小与它是TensorFloat时的大小相同,但随后我得到了进一步的错误,它只能是uint8_t**
或BYTE**
。
有什么想法可以修改这个代码,以便我可以得到一个自定义的TensorFloat16Bit?
1条答案
按热度按时间ilmyapht1#
在
TensorFloat16Bit
上试用factory methods。但是,您需要将数据转换为
float16
:https://stackoverflow.com/a/60047308/11998382
另外,我可能建议您在onnx模型中进行转换。