This class is used to store and transmit data in neural networks.
A blob is a 7-dimensional array, and each of its dimensions has a specific meaning:
BatchLength
is a "time" axis, used to denote data sequences; it is mainly used in recurrent networksBatchWidth
corresponds to the batch, used to pass several independent objects togetherListSize
is the dimensions for the objects that are connected (for example, pixels out of one image) but do not form a sequenceHeight
is the height of a matrix or an imageWidth
is the width of a matrix or an imageDepth
is the width of a 3-dimensional imageChannels
corresponds to channels for multi-channel image formats and is also used to work with one-dimensional vectors.
The blobs may contain one of the two types of data: float (CT_Float
) and integer (CT_Int
). Both data types are 32-bit.
If the data type is not specified directly anywhere in this documentation, that means float
is used.
The data is stored in memory so that the elements next to each other have the adjacent coordinates along the Channels dimension. To go to the next element along the Depth coordinate, you need to shift by the number of channels, and so on in the order of dimensions specified above (also known as channel-last ordering).
A number of static functions are provided to create blobs.
static CDnnBlob* CreateDataBlob( IMathEngine& mathEngine, TDnnType type, int batchLength, int batchWidth, int channelsCount );
Creates a blob with the type
data that has batchWidth
sequences of batchLength
length, where each element has channelsCount
channels.
static CDnnBlob* CreateListBlob( IMathEngine& mathEngine, TDnnType type, int batchLength, int batchWidth, int listSize, int channelsCount );
The same as CreateDataBlob
, but with every sequence containing listSize
lists of elements.
static CDnnBlob* Create2DImageBlob( IMathEngine& mathEngine, TDnnType type, int batchLength, int batchWidth, int imageHeight, int imageWidth, int channelsCount );
Creates a blob with the type
data that has batchWidth
sequences of batchLength
length, where each element is a two-dimensional image of imageHeight
height and imageWidth
height, with channelsCount
channels.
static CDnnBlob* Create3DImageBlob( IMathEngine& mathEngine, TDnnType type, int batchLength, int batchWidth, int imageHeight, int imageWidth, int imageDepth, int channelsCount );
The same as Create2DImageBlob
, but with 3-dimensional images of imageDepth
depth.
static CDnnBlob* CreateWindowBlob( const CPtr<CDnnBlob>& parent, int windowSize = 1 );
Creates a blob that is a window of windowSize
length over the parent
blob. Its BatchLength
dimension is equal to windowSize
, the other dimensions are the same as for the parent
blob. This blob has no memory buffer of its own: it is just an auxiliary pointer to a place in the parent blob buffer, which becomes invalid once the parent blob is destroyed. The user is responsible for not using the window blobs after the destruction of the parent.
CDnnBlob* GetParent();
const CDnnBlob* GetParent() const;
Retrieves the pointer to the parent blob. This method will return 0
if it is not a window blob.
CDnnBlob* GetOwner();
const CDnnBlob* GetOwner() const;
Retrieves the pointer to the blob that owns the data. If the blob has not been created using CreateWindow
, this
will be returned.
int GetParentPos() const;
void SetParentPos( int pos );
void ShiftParentPos( int shift );
Retrieves, sets, or shifts the window position on the parent blob. The positions are interpreted as BatchLength
axis coordinates.
static CDnnBlob* CreateTensor(IMathEngine& mathEngine, TDnnType type, std::initializer_list<int> dimensions);
// CreateVector(x) is the same as CreateTensor({x})
static CDnnBlob* CreateVector(IMathEngine& mathEngine, TDnnType type, int vectorSize);
// CreateMatrix(x, y) is the same as CreateTensor({x, y})
static CDnnBlob* CreateMatrix(IMathEngine& mathEngine, TDnnType type, int matrixHeight, int matrixWidth);
Creates n-dimensional, 1-dimensional, and 2-dimensional blobs. If you call the CreateTensor
method the dimensions
list should have not more than 7 elements.
int GetBatchLength() const;
int GetBatchWidth() const;
int GetListSize() const;
int GetHeight() const;
int GetWidth() const;
int GetDepth() const;
int GetChannelsCount() const;
int DimSize( int d ) const;
int DimSize( TBlobDim d ) const;
Gets the blob size along the specified axis.
int GetDataSize() const;
Gets the total blob size (the product of 7 dimensions).
int GetObjectCount() const;
Gets the number of objects in the blob. The method returns the BatchLength * BatchWidth * ListSize
product. Use instead of BatchWidth
when you do not need to separate the objects along the BatchLength
and ListSize
dimensions.
int GetObjectSize() const;
Gets the size of a single object in the blob. The method returns the Height * Width * Depth * Channels
product. Use when all objects are to be interpreted as one-dimensional vectors.
int GetGeometricalSize() const;
Gets the blob "geometrical" size. The method returns the Height * Width * Depth
product. Use when Height
, Width
, and Depth
dimensions may be processed together.
bool HasEqualDimensions( const CDnnBlob* other ) const;
Checks that the other blob has the same dimensions.
template<class T = float>
void CopyFrom( const T* src );
template<class T = float>
void CopyTo( T* dst ) const;
template<class T = float>
void CopyTo( T* dst, int size ) const;
Passes the data of the specified type to and from the external code. If no size is specified the whole blob is copied (of GetDataSize
size).
void CopyFrom( const CDnnBlob* other );
Copies the data from another blob. The dimensions and data type should be the same.
void TransposeFrom( const CDnnBlob* other, int d1, int d2 );
Copies the data from another blob, switching the two specified dimensions.
CDnnBlob* GetCopy() const;
Creates a blob copy independent of this blob.
CDnnBlob* GetClone() const;
CDnnBlob* GetClone( TDnnType type ) const;
Creates a blob of the same dimensions but with data contents not initialized. The second method also changes the data type.
CDnnBlob* GetTransposed( int d1, int d2 ) const;
Creates a blob copy with two specified dimensions switched. The data location in memory is changed.
void Add( const CDnnBlob* other );
Elementwise adds the other blob. It should be of the same dimensions.
void Clear();
void ClearObject( int num );
Fills the blob or the specified object with zeros.
template<class T = float>
void Fill( typename CDnnType<T>::TDataType value );
template<class T = float>
void FillObject( int num, typename CDnnType<T>::TDataType value );
Fills the blob or the specified object with the given value.
template<class T>
T* GetBuffer( int pos, int size, bool exchange );
void ReleaseBuffer( void* ptr, bool exchange );
Direct memory read/modification (for cpu memory) or working with data copy (for gpu blobs).
exchange
parameter helps avoid unnecessary data exchange operation (allows read-only and write-only access, implementation specific).
These methods should be used in strict LIFO-order.
CDnnBlobBuffer
wrapper should help control LIFO-consistency.
static void MergeByChannels( IMathEngine& mathEngine, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
static void MergeByDepth( IMathEngine& mathEngine, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
static void MergeByWidth( IMathEngine& mathEngine, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
static void MergeByHeight( IMathEngine& mathEngine, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
static void MergeByListSize( IMathEngine& mathEngine, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
static void MergeByBatchWidth( IMathEngine& mathEngine, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
static void MergeByBatchLength( IMathEngine& mathEngine, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
static void MergeByObject( IMathEngine& mathEngine, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
static void MergeByDim( IMathEngine& mathEngine, TBlobDim d, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
static void MergeByDim( IMathEngine& mathEngine, int d, const CObjectArray<CDnnBlob>& from, const CPtr<CDnnBlob>& to );
Merges the blobs along the specified dimension.
static void SplitByChannels( IMathEngine& mathEngine, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
static void SplitByDepth( IMathEngine& mathEngine, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
static void SplitByWidth( IMathEngine& mathEngine, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
static void SplitByHeight( IMathEngine& mathEngine, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
static void SplitByListSize( IMathEngine& mathEngine, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
static void SplitByBatchWidth( IMathEngine& mathEngine, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
static void SplitByBatchLength( IMathEngine& mathEngine, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
static void SplitByObject( IMathEngine& mathEngine, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
static void SplitByDim( IMathEngine& mathEngine, TBlobDim d, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
static void SplitByDim( IMathEngine& mathEngine, int d, const CPtr<CDnnBlob>& from, const CObjectArray<CDnnBlob>& to );
Splits the blob along the specified dimension. The SplitByObject
method splits along the BatchLength * BatchWidth * ListSize
dimensions.
- mathEngine is the reference to the math engine.
- from is the original blob.
- to is the array of blobs into which the split parts will be put. The size of the parts is determined by these blobs. All the dimensions except the one to split should be the same as for the original blob. The original length of the dimension used for splitting should be equal to the total of corresponding dimension lengths of the parts blobs.