【问题标题】:TensorFlow Casting Internal Tensor PointerTensorFlow Casting 内部张量指针
【发布时间】:2016-10-07 21:38:01
【问题描述】:
我previously asked 如何获取张量内的指针。我现在想弄清楚存储的数据类型,然后能够将void* 转换为这种数据类型。
张量有一个功能,
DataType dtype() const { return shape_.data_type(); }
DataType 是一个简单的枚举,实际上并不能帮助我投射。我希望static_cast<type> 能够得到dtype() 的结果。因此,我正在寻找可以为我执行此操作的宏或模板。
这样的存在吗?
【问题讨论】:
标签:
c++
templates
macros
tensorflow
【解决方案1】:
框架在types.h中构建,在queue_base.cc中使用
不幸的是,因为它是一个模板,你需要使用宏等来编译每个不同的模板。
首先编写获取类型作为模板参数的函数
template <DataType DT>
Status HandleSliceToElement(const Tensor& parent, Tensor* element,
int64 index) {
typedef typename EnumToDataType<DT>::Type T;
...
}
然后使用宏来处理每种数据类型。为简洁起见(见完整版list of macros)
Status QueueBase::CopySliceToElement(const Tensor& parent, Tensor* element,
int64 index) {
#define HANDLE_TYPE(DT) \
if (parent.dtype() == DT) { \
TF_RETURN_IF_ERROR(HandleSliceToElement<DT>(parent, element, index)); \
return Status::OK(); \
}
HANDLE_TYPE(DT_FLOAT);
HANDLE_TYPE(DT_HALF);
HANDLE_TYPE(DT_DOUBLE);
...
#undef HANDLE_TYPE
return errors::Unimplemented("CopySliceToElement Unhandled data type: ",
parent.dtype());
}