Network¶
Networks are the central structure in brainstorm. They contain and manage a directed acyclic graph of layers, manage the memory and provide access to all the internal states.
Creating¶
There are essentially 4 different ways of creating a network in brainstorm.
- with the
create_network_from_spec
tool- using layer wiring in python (with and without helpers)
- writing an architecture yourself (advanced)
- instantiating the layers by hand and setting up a layout (don’t do this)
Setting the Handler¶
If you want to run on CPU in 32bit mode you don’t need to do anything. For GPU you need to do:
from brainstorm.handlers import PyCudaHandler
net.set_handler(PyCudaHandler())
Initializing¶
Just use the initialize()
method.
Running¶
Normally a trainer will run the network for you. But if you want to run a network yourself you have to do this in order:
net.provide_external_data(my_data)
net.forward_pass()
- (optional)
net.backward_pass()
Accessing Internals¶
The recommended way is to always use net.get(PATH)
because that returns
a copy of the buffer in numpy format. If you for some reason want to tamper
with the memory that the network is actually using you can get access with:
net.buffer[PATH]
.
Parameters¶
'parameters'
for an array of all parameters'LAYER_NAME.parameters.PARAM_NAME'
for a specific parameter buffer
- For the corresponding derivatives calculated during the backward pass:
'gradients'
'LAYER_NAME.gradients.GRAD_NAME'
Inputs and Outputs¶
To access the inputs that have been passed to the network you can use the
shortcut net.get_inputs(IN_NAME)
.
To access inputs and outputs of layers use the following paths:
'LAYER_NAME.inputs.IN_NAME'
(often IN_NAME = default)'LAYER_NAME.outputs.OUT_NAME'
(often OUT_NAME = default)
For the corresponding derivatives calculated during the backward pass:
'LAYER_NAME.input_deltas.IN_NAME'
'LAYER_NAME.output_deltas.OUT_NAME'
Internals¶
Some layers also expose some internal buffers. You can access them with this path:
'LAYER_NAME.internals.INTERNAL_NAME'