struct TF_Tensor {
~TF_Tensor();
TF_DataType dtype;
tensorflow::TensorShape shape;
tensorflow::TensorBuffer* buffer;
};
It's simple compares to the definition to class Tensor which is defined in tensorflow/core/framework/tensor.h
/// @ingroup core
/// Represents an n-dimensional array of values.
class Tensor {
public:
/// \brief Creates a 1-dimensional, 0-element float tensor.
///
/// The returned Tensor is not a scalar (shape {}), but is instead
/// an empty one-dimensional Tensor (shape {0}, NumElements() ==
/// 0). Since it has no elements, it does not need to be assigned a
/// value and is initialized by default (IsInitialized() is
/// true). If this is undesirable, consider creating a one-element
/// scalar which does require initialization:
///
/// ```c++
///
/// Tensor(DT_FLOAT, TensorShape({}))
///
/// ```
Tensor();
/// \brief Creates a Tensor of the given `type` and `shape`. If
/// LogMemory::IsEnabled() the allocation is logged as coming from
/// an unknown kernel and step. Calling the Tensor constructor
/// directly from within an Op is deprecated: use the
/// OpKernelConstruction/OpKernelContext allocate_* methods to
/// allocate a new tensor, which record the kernel and step.
///
/// The underlying buffer is allocated using a `CPUAllocator`.
Tensor(DataType type, const TensorShape& shape);
...
// Only needed by variable op to set the shape of an uninitialized
// Tensor.
// TODO: Remove this when we have a better story for detecting
// uninitialized tensors.
void set_shape(const TensorShape& shape) {
DataType dt = dtype();
shape_ = shape;
set_dtype(dt);
}
void CopyFromInternal(const Tensor& other, const TensorShape& shape);
template <typename T>
T* base() const;
template <size_t NDIMS>
void FillDimsAndValidateCompatibleShape(
gtl::ArraySlice<int64> new_sizes,
Eigen::array<Eigen::DenseIndex, NDIMS>* dims) const;
template <typename T, size_t NDIMS>
void FillDimsAndValidateCompatibleShape(
gtl::ArraySlice<int64> new_sizes,
Eigen::array<Eigen::DenseIndex, NDIMS>* dims) const;
};
Since a class has many functions , those will be a function pointer at the virtual function table, don't know where that is. But once TF_Tensor is changed, class Tensor needs to be changed too.
Member functions besides, I really can't match the member variables in class Tensor with struct TF_Tensor. There are tensorflow::TensorShape shape; tensorflow::TensorBuffer* buffer;
no where to find TF_DataType dtype;
If I want to add a new member variable, I can put it at the end, it works.
They do have differences, from the comments in TF_NewTensor()
// TF_STRING and TF_RESOURCE tensors have a different representation in
// TF_Tensor than they do in tensorflow::Tensor. So a copy here is a waste
// (any alignment requirements will be taken care of by TF_TensorToTensor
// and TF_TensorFromTensor).
//
// Other types have the same representation, so copy only if it is safe to
// do so.
没有评论:
发表评论