3 from __future__
import absolute_import
4 from __future__
import division
5 from __future__
import print_function
6 from __future__
import unicode_literals
8 from caffe2.python
import core, schema
9 from caffe2.python.layers.layers
import (
13 from caffe2.python.layers.sampling_trainable_mixin
import SamplingTrainableMixin
18 class FC(SamplingTrainableMixin, ModelLayer):
20 def __init__(self, model, input_record, output_dims, weight_init=None,
21 bias_init=None, weight_optim=None, bias_optim=None, name='fc',
23 super(FC, self).__init__(model, name, input_record, **kwargs)
24 assert isinstance(input_record,
schema.Scalar),
"Incorrect input type" 25 assert len(input_record.field_types()[0].shape) > 0, (
26 "FC expects limited dimensions of the input tensor")
28 input_dims = input_record.field_types()[0].shape[0]
29 assert input_dims > 0, (
30 "FC expects input dimensions > 0, got {}".format(input_dims))
33 (np.float32, (output_dims, )),
34 model.net.NextScopedBlob(name +
'_output')
37 scale = math.sqrt(1.0 / input_dims)
38 weight_init = weight_init
if weight_init
else (
39 'UniformFill', {
'min': -scale,
'max': scale})
40 bias_init = bias_init
if bias_init
else (
41 'UniformFill', {
'min': -scale,
'max': scale})
43 self.
w = model.net.NextScopedBlob(name +
"_w")
44 self.
b = model.net.NextScopedBlob(name +
"_b")
52 shape=[output_dims, input_dims],
55 optimizer=weight_optim))
62 shape=[output_dims, ],
65 optimizer=bias_optim))
67 def _add_ops(self, net, params):
72 def param_blobs(self):
73 return [self.
w, self.
b]
def CreateOperator(operator_type, inputs, outputs, name='', control_input=None, device_option=None, arg=None, engine=None, kwargs)