I want to switch from Mathematica to Python/MxNet for a neural network project using Munsell color notation. I am very experienced in C++, somewhat experienced in Mathematica but next to no experience in Python. My Ms Thesis was about using neural nets for finding and replacing missing values in databases and I also worked on authonomous robot navigation using Neural Nets but my career was really in 3D rendering. Now that I am retired, I want to return to neural networks.
I’m following the MxNet tutorials and I’m having a difficulty with the “Custom Layers (Beginners)” tutorial. I traced the issue to either the declaration of the usage of the “scales” custom parameter.
class NormHybridLayer( gluon.HybridBlock ): def __init__( self, hidden_units, scales ): super( NormHybridLayer, self ).__init__() with self.name_scope(): self.weights = self.params.get( 'weights', shape = ( hidden_units, 0 ), allow_deferred_init = True ) self.scales = self.params.get( 'scales', shape = scales.shape, init = mx.init.Constant( scales.asnumpy() ), differentiable = False ) def hybrid_forward( self, F, x, weights, scales ): normalized_data = F.broadcast_div( F.broadcast_sub( x, F.min( x ) ), ( F.broadcast_sub( F.max( x ), F.min( x ) ) ) ) weighted_data = F.FullyConnected( normalized_data, weights, num_hidden = self.weights.shape[ 0 ], no_bias = True ) scaled_data = F.broadcast_mul( scales, weighted_data ) return scaled_data net2 = gluon.nn.HybridSequential() with net2.name_scope(): net2.add( Dense( 5 ) ) net2.add( NormHybridLayer( hidden_units = 5, scales = nd.array( [ 2 ] ) ) ) net2.add( Dense( 1 ) ) net2.initialize( mx.init.Xavier( magnitude = 2.24 ) ) net2.hybridize()
I followed the tutorial and when
output = net2( input )
is called, I get an error ending in
TypeError: Object of type ndarray is not JSON serializable
I traced the error to the ‘var’ function in symbol.py, line 2651. From what I see there, I concluded that one of the custom parameter “init” is wrong somehow and a dump is called, which results in this TypeError.
I figured the fault parameter is “scales” by commenting it out and running the code, which then ran without error.
With my lack of experience in Python and MxNet, I can’t figure what is wrong and I would appreciate any help in figuring this out. For now, I’m going to set this tutorial aside and move to the next tutorial…