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:
BatchLengthis a "time" axis, used to denote data sequences; it is mainly used in recurrent networksBatchWidthcorresponds to the batch, used to pass several independent objects togetherListSizeis the dimensions for the objects that are connected (for example, pixels out of one image) but do not form a sequenceHeightis the height of a matrix or an imageWidthis the width of a matrix or an imageDepthis the width of a 3-dimensional imageChannelscorresponds 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.
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.