def test_undefined_shape(self, BiasLayer): # should work: BiasLayer((64, None, 3), shared_axes=(1, 2)) # should not work: with pytest.raises(ValueError) as exc: BiasLayer((64, None, 3), shared_axes=(0, 2)) assert 'needs specified input sizes' in exc.value.args[0]
def test_bias_init(self, BiasLayer, init_b): input_shape = (2, 3, 4) # default: share biases over all but second axis b = BiasLayer(input_shape, b=init_b).b assert np.allclose(b.get_value(), init_b((3,))) # share over first axis only b = BiasLayer(input_shape, b=init_b, shared_axes=0).b assert np.allclose(b.get_value(), init_b((3, 4))) # share over second and third axis b = BiasLayer(input_shape, b=init_b, shared_axes=(1, 2)).b assert np.allclose(b.get_value(), init_b((2,))) # no bias b = BiasLayer(input_shape, b=None).b assert b is None
def test_get_output_for(self, BiasLayer, init_b): input_shape = (2, 3, 4) # random input tensor input = np.random.randn(*input_shape).astype(theano.config.floatX) # default: share biases over all but second axis layer = BiasLayer(input_shape, b=init_b) assert np.allclose(layer.get_output_for(input).eval(), input + init_b((1, 3, 1))) # share over first axis only layer = BiasLayer(input_shape, b=init_b, shared_axes=0) assert np.allclose(layer.get_output_for(input).eval(), input + init_b((1, 3, 4))) # share over second and third axis layer = BiasLayer(input_shape, b=init_b, shared_axes=(1, 2)) assert np.allclose(layer.get_output_for(input).eval(), input + init_b((2, 1, 1))) # no bias layer = BiasLayer(input_shape, b=None) assert layer.get_output_for(input) is input
def test_get_output_for(self, BiasLayer, init_b): input_shape = (2, 3, 4) # random input tensor input = np.random.randn(*input_shape).astype(theano.config.floatX) # default: share biases over all but second axis layer = BiasLayer(input_shape, b=init_b) assert np.allclose( layer.get_output_for(input).eval(), input + init_b((1, 3, 1))) # share over first axis only layer = BiasLayer(input_shape, b=init_b, shared_axes=0) assert np.allclose( layer.get_output_for(input).eval(), input + init_b((1, 3, 4))) # share over second and third axis layer = BiasLayer(input_shape, b=init_b, shared_axes=(1, 2)) assert np.allclose( layer.get_output_for(input).eval(), input + init_b((2, 1, 1))) # no bias layer = BiasLayer(input_shape, b=None) assert layer.get_output_for(input) is input
def test_bias_init(self, BiasLayer, init_b): input_shape = (2, 3, 4) # default: share biases over all but second axis b = BiasLayer(input_shape, b=init_b).b assert np.allclose(b.get_value(), init_b((3, ))) # share over first axis only b = BiasLayer(input_shape, b=init_b, shared_axes=0).b assert np.allclose(b.get_value(), init_b((3, 4))) # share over second and third axis b = BiasLayer(input_shape, b=init_b, shared_axes=(1, 2)).b assert np.allclose(b.get_value(), init_b((2, ))) # no bias b = BiasLayer(input_shape, b=None).b assert b is None
def build_enc_layer(incoming, name, transform, specs, activation, i, p_drop_hidden, shared_net): net = OrderedDict() lname = 'enc_{}_{}'.format(i, transform if 'pool' in transform else 'affine') nbatchn_lname = 'enc_batchn_{}_norm'.format(i) noise_lname = 'enc_noise_{}'.format(i) lbatchn_lname = 'enc_batchn_{}_learn'.format(i) if shared_net is None: # affine pars W = lasagne.init.GlorotUniform() # batchnorm pars beta = lasagne.init.Constant(0) gamma = None if activation == rectify else lasagne.init.Constant(1) else: # batchnorm pars beta = shared_net[lbatchn_lname + '_beta'].get_params()[0] gamma = None if activation == rectify else \ shared_net[lbatchn_lname + '_gamma'].get_params()[0] if not isinstance(shared_net[lname], (pool, unpool)): # affine weights W = shared_net[lname].get_params()[0] else: W = None # affine (conv/dense/deconv) or (un)pooling transformation: $W \hat{h}$ net[lname] = get_transform_layer(incoming, name + '_' + lname, transform, specs, W) # 1. batchnormalize without learning -> goes to combinator layer layer2bn = net.values()[-1] l_name = '{}_{}'.format(name, nbatchn_lname) bn_broadcast_cond = layer2bn.output_shape[1] == 1 if len(layer2bn.output_shape) == 4 and bn_broadcast_cond: ax = (0, 1, 2, 3) elif len(layer2bn.output_shape) == 2 and bn_broadcast_cond: ax = (0, 1) else: ax = 'auto' net[nbatchn_lname] = BatchNormLayer(layer2bn, axes=ax, alpha=0.1, beta=None, gamma=None, name=l_name) if shared_net is None: # for dirty encoder -> add noise net[noise_lname] = GaussianNoiseLayer(net.values()[-1], sigma=p_drop_hidden, name='{}_{}'.format( name, noise_lname)) # 2. scaling & offsetting batchnormalization + noise l_name = '{}_{}'.format(name, lbatchn_lname) # offset by beta net[lbatchn_lname + '_beta'] = BiasLayer(net.values()[-1], b=beta, name=l_name + '_beta') if gamma is not None: # if not rectify, scale by gamma net[lbatchn_lname + '_gamma'] = ScaleLayer(net.values()[-1], scales=gamma, name=l_name + '_gamma') return net