dir(Net): backward, blobs, channel_swap, deprocess, forward, forward_all, forward_backward_all, input_scale, inputs, layers, mean, outputs, params, preprocess, raw_scale, reshape, save, set_channel_swap, set_input_arrays, set_input_scale, set_mean, set_raw_scale
dir(Blob): channels, count, data::ndarray, diff::ndarray, height, num, reshape, width
dir(Layer): blobs::BlobVec
dir(np.ndarray): all, any, argmax, argmin, argpartition, argsort, astype, base, byteswap, choose, clip, compress, conj, conjugate, copy, ctypes, cumprod, cumsum, data, diagonal, dot, dtype, dump, dumps, fill, flags, flat, flatten, getfield, imag, item, itemset, itemsize, max, mean, min, nbytes, ndim, newbyteorder, nonzero, partition, prod, ptp, put, ravel, real, repeat, reshape, resize, round, searchsorted, setfield, setflags, shape, size, sort, squeeze, std, strides, sum, swapaxes, take, tobytes, tofile, tolist, tostring, trace, transpose, var, view]

net.inputs: []		# because we have an hdf5 layer?
net.outputs [loss]

# These dimensions are for 1326x20000x3 with batchsize 937

# Blobs contain data running through the network (their size depend on batchsize).
# Their data and diff are initialized to 0.

net.blobs: OrderedDict<Blob>[5]		# net.blobs[data].data.shape
net.blobs[data]: Blob(937,1326,1,1)	# x1
net.blobs[label]: Blob(937,1,1,1)	# ylabel
net.blobs[fc1]: Blob(937,20000,1,1)	# x2=y1
net.blobs[fc2]: Blob(937,3,1,1)		# x3=y2
net.blobs[loss]: Blob(1,1,1,1)		# just the loss

# Params contain weights and biases in their data field.
# Their diff is initialized to 0.

net.params: OrderedDict<BlobVec>[2]	# net.params[fc1][0].data.shape
net.params[fc1][0]: Blob(1,1,20000,1326) # w1
net.params[fc1][1]: Blob(1,1,1,20000)	 # b1
net.params[fc2][0]: Blob(1,1,3,20000)	 # w2
net.params[fc2][1]: Blob(1,1,1,3)	 # b2

# net.layers point to the same ndarrays as params, so we don't need the layers interface.
# The blob addresses are different
# But the array addresses are the same:
# net.layers[3].blobs[1].data.__array_interface__ == net.params['fc2'][1].data.__array_interface__
# See http://stackoverflow.com/questions/11264838/how-to-get-the-memory-address-of-a-numpy-array-for-c
# See also 'x is y' (which gives false?) and 'id(x)==id(y)' which gives true.

net.layers: LayerVec[data,fc1,activation,fc2,loss]	# net.layers.__len__()==5
net.layers[0].blobs: {}		# net.layers.blobs.__len__() == 0
net.layers[1].blobs[0]: Blob(1,1,20000,1326)
net.layers[1].blobs[1]: Blob(1,1,1,20000)
net.layers[2].blobs: {}
net.layers[3].blobs[0]: Blob(1,1,3,20000)
net.layers[3].blobs[1]: Blob(1,1,1,3)
net.layers[4].blobs: {}

