示例#1
0
def define_net():
    net = {}
    # net['input_img'] = ll.InputLayer(shape=(None, 1, 28, 28), input_var=input_img)
    # net['input_noise'] = ll.InputLayer(shape=(None, 1, 28, 28), input_var=noise)
    # ll.ConcatLayer([net['input_img'], net['input_noise']], axis=1)
    net['input'] = ll.InputLayer(shape=(None, 2, 28, 28))

    net['conv_1'] = ll.batch_norm(
        ll.Conv2DLayer(net['input'],
                       num_filters=32,
                       stride=(2, 2),
                       filter_size=(5, 5),
                       pad='same'))
    net['conv_2'] = ll.batch_norm(
        ll.Conv2DLayer(net['conv_1'],
                       num_filters=64,
                       stride=(2, 2),
                       filter_size=(5, 5),
                       pad='same'))
    net['unconv_3'] = ll.batch_norm(
        ll.TransposedConv2DLayer(net['conv_2'],
                                 filter_size=(5, 5),
                                 num_filters=32,
                                 stride=(2, 2),
                                 crop=(2, 2)))
    net['out'] = ll.batch_norm(
        ll.TransposedConv2DLayer(net['unconv_3'],
                                 filter_size=(4, 4),
                                 num_filters=1,
                                 stride=(2, 2),
                                 crop=(0, 0),
                                 nonlinearity=lasagne.nonlinearities.sigmoid))
    return net
示例#2
0
def build_generator(input_var=None):
    #D_inp = T.tensor4('ds')
    G = l.InputLayer(shape=(None, 1, noise_H, noise_W), input_var=input_var)
    G = batch_norm(
        l.DenseLayer(G, num_units=(noise_H * noise_W * 256),
                     nonlinearity=reLU))
    G = l.ReshapeLayer(G, shape=([0], 256, noise_H, noise_W))  #4
    G = l.TransposedConv2DLayer(G,
                                1,
                                filter_size=(2, 2),
                                stride=(2, 2),
                                output_size=8)  #8
    G = batch_norm(l.Conv2DLayer(G, 40, (3, 3), nonlinearity=reLU,
                                 pad='full'))  #10
    G = l.TransposedConv2DLayer(G,
                                1,
                                filter_size=(2, 2),
                                stride=(2, 2),
                                output_size=20)  #20
    G = batch_norm(l.Conv2DLayer(G, 20, (3, 3), nonlinearity=reLU,
                                 pad='full'))  #22
    G = batch_norm(l.Conv2DLayer(G, 20, (5, 5), nonlinearity=reLU,
                                 pad='full'))  #26
    G = batch_norm(l.Conv2DLayer(G, 1, (3, 3), nonlinearity=reLU,
                                 pad='full'))  #28

    return G
示例#3
0
def build_auto_encoder_mnist_cnn(input_var=None):
    """
    Generate an auto-encoder cnn using the Lasagne library
    """
    # Build encoder part
    network = lyr.InputLayer(shape=(None, 1, 28, 28), input_var=input_var)
    network = lyr.Conv2DLayer(network, 64, (5, 5), W=lasagne.init.Normal())
    network = lyr.MaxPool2DLayer(network, (2, 2))
    network = lyr.Conv2DLayer(network, 128, (5, 5), W=lasagne.init.Normal())
    network = lyr.MaxPool2DLayer(network, (2, 2))
    network = lyr.FlattenLayer(network)

    network = lyr.DenseLayer(network, 2048, W=lasagne.init.Normal())
    network = lyr.ReshapeLayer(network, (input_var.shape[0], 2048, 1, 1))

    # Build decoder part
    network = lyr.TransposedConv2DLayer(network,
                                        128, (5, 5),
                                        W=lasagne.init.Normal())
    network = lyr.Upscale2DLayer(network, (2, 2))
    network = lyr.TransposedConv2DLayer(network,
                                        64, (4, 4),
                                        W=lasagne.init.Normal())
    network = lyr.Upscale2DLayer(network, (2, 2))
    network = lyr.TransposedConv2DLayer(network,
                                        1, (3, 3),
                                        W=lasagne.init.Normal(),
                                        nonlinearity=None)

    return network
示例#4
0
def build_generator(input_var=None,
                    noise_size=100,
                    nfilters=[512, 256, 128, 64, 3]):

    ###############################
    # Build Network Configuration #
    ###############################

    print('... Building the generator')

    # Input of the network : shape = (batch_size, 100)
    network = layers.InputLayer(shape=(None, noise_size), input_var=input_var)

    # Reshape layer : shape = (batch_size, 100, 1, 1)
    network = layers.ReshapeLayer(network, (-1, noise_size, 1, 1))

    # Tranposed conv layer : shape = (batch_size, 512, 4, 4)
    network = layers.batch_norm(
        layers.TransposedConv2DLayer(network,
                                     num_filters=nfilters[0],
                                     filter_size=(4, 4),
                                     stride=(1, 1)))

    # Tranposed conv layer : shape = (batch_size, 256, 8, 8)
    network = layers.batch_norm(
        layers.TransposedConv2DLayer(network,
                                     num_filters=nfilters[1],
                                     filter_size=(5, 5),
                                     stride=(2, 2),
                                     crop=2,
                                     output_size=8))

    # Tranposed conv layer : shape = (batch_size, 128, 16, 16)
    network = layers.batch_norm(
        layers.TransposedConv2DLayer(network,
                                     num_filters=nfilters[2],
                                     filter_size=(5, 5),
                                     stride=(2, 2),
                                     crop=2,
                                     output_size=16))

    # Tranposed conv layer : shape = (batch_size, 64, 32, 32)
    network = layers.batch_norm(
        layers.TransposedConv2DLayer(network,
                                     num_filters=nfilters[3],
                                     filter_size=(5, 5),
                                     stride=(2, 2),
                                     crop=2,
                                     output_size=32))

    # Tranposed conv layer : shape = (batch_size, 3, 64, 64)
    network = layers.TransposedConv2DLayer(network,
                                           num_filters=nfilters[4],
                                           filter_size=5,
                                           stride=2,
                                           crop=2,
                                           output_size=64,
                                           nonlinearity=nonlinearities.sigmoid)

    return network
示例#5
0
def generator(z_dim=100, num_units=64, input_var=None, batch_size=64):
    generator = []

    theano_rng = RandomStreams(rng.randint(2**15))
    noise = theano_rng.normal(size=(batch_size, z_dim))
    input_var = noise if input_var is None else input_var
    relu = lasagne.nonlinearities.rectify

    generator.append(
        ll.InputLayer(shape=(batch_size, z_dim), input_var=input_var))

    # no bn
    generator.append((ll.DenseLayer(generator[-1],
                                    num_units * 8 * 4 * 4,
                                    nonlinearity=None)))

    generator.append(
        ll.ReshapeLayer(generator[-1], shape=(-1, num_units * 8, 4, 4)))

    # no bn
    generator.append((ll.TransposedConv2DLayer(generator[-1],
                                               num_filters=num_units * 4,
                                               filter_size=(4, 4),
                                               stride=(2, 2),
                                               crop=1,
                                               nonlinearity=relu)))
    # no bn
    generator.append((ll.TransposedConv2DLayer(generator[-1],
                                               num_filters=num_units * 2,
                                               filter_size=(4, 4),
                                               stride=(2, 2),
                                               crop=1,
                                               nonlinearity=relu)))
    # no bn
    generator.append((ll.TransposedConv2DLayer(generator[-1],
                                               num_filters=num_units,
                                               filter_size=(4, 4),
                                               stride=(2, 2),
                                               crop=1,
                                               nonlinearity=relu)))

    generator.append(
        ll.TransposedConv2DLayer(generator[-1],
                                 num_filters=3,
                                 filter_size=(4, 4),
                                 stride=(2, 2),
                                 crop=1,
                                 nonlinearity=T.tanh))

    for layer in generator:
        print layer.output_shape
    print ""

    return generator
示例#6
0
def generator(z_dim=100, num_units=128, input_var=None, batch_size=64):
    generator = []

    theano_rng = RandomStreams(rng.randint(2**15))
    noise = theano_rng.normal(size=(batch_size, z_dim), avg=0.0, std=1.0)
    input_var = noise if input_var is None else input_var

    generator.append(
        ll.InputLayer(shape=(batch_size, z_dim), input_var=input_var))

    generator.append(ll.DenseLayer(generator[-1], num_units * 8 * 5 * 10))

    generator.append(
        ll.ReshapeLayer(generator[-1], shape=(-1, num_units * 8, 5, 10)))

    generator.append(
        ll.batch_norm(
            ll.TransposedConv2DLayer(generator[-1],
                                     num_filters=num_units * 4,
                                     filter_size=(4, 4),
                                     stride=(2, 2),
                                     crop=1)))

    generator.append(
        ll.batch_norm(
            ll.TransposedConv2DLayer(generator[-1],
                                     num_filters=num_units * 2,
                                     filter_size=(4, 4),
                                     stride=(2, 2),
                                     crop=1)))

    generator.append(
        ll.batch_norm(
            ll.TransposedConv2DLayer(generator[-1],
                                     num_filters=num_units,
                                     filter_size=(4, 4),
                                     stride=(2, 2),
                                     crop=1)))

    generator.append(
        ll.TransposedConv2DLayer(generator[-1],
                                 num_filters=3,
                                 filter_size=(4, 4),
                                 stride=(2, 2),
                                 crop=1,
                                 nonlinearity=T.tanh))

    for layer in generator:
        print layer.output_shape
    print ""

    return generator
示例#7
0
def build_deconv(l_input):
    l_input = L.ReshapeLayer(l_input, ([0], 1, 4, 6))
    l_out = L.TransposedConv2DLayer(l_input,
        num_filters=1, filter_size=(4,4), stride=2,
        nonlinearity=None, W=LI.Constant(0.4), b=LI.Constant(0.)
    )
    l_out = L.TransposedConv2DLayer(l_out,
        num_filters=1, filter_size=(4,4), stride=2,
        nonlinearity=None, W=LI.Constant(0.4), b=LI.Constant(0.)
    )
    l_out = L.TransposedConv2DLayer(l_out,
        num_filters=1, filter_size=(6,6), stride=2,
        nonlinearity=None, W=LI.Constant(0.4), b=LI.Constant(0.)
    )
    return l_out
示例#8
0
def simpleConv(input_var=None, num_units=32):

    network = layers.InputLayer(shape=(None, input_n_channel, input_height,
                                       input_width),
                                input_var=input_var)

    network = layers.Conv2DLayer(network,
                                 num_filters=num_units,
                                 filter_size=(9, 9))
    network = layers.MaxPool2DLayer(network, pool_size=(2, 2))
    network = layers.Conv2DLayer(network,
                                 num_filters=num_units,
                                 filter_size=(9, 9))
    network = layers.MaxPool2DLayer(network, pool_size=(2, 2))
    network = layers.Conv2DLayer(network,
                                 num_filters=1000,
                                 filter_size=(10, 10))

    network = layers.DenseLayer(layers.DropoutLayer(network, p=0.2),
                                num_units=1000)
    network = layers.DenseLayer(layers.DropoutLayer(network, p=0.5),
                                num_units=1000)

    network = layers.ReshapeLayer(network,
                                  shape=(input_var.shape[0], 1000, 1, 1))
    '''
	network = layers.TransposedConv2DLayer(network, num_filters=num_units, filter_size=(4,4))
	network = layers.Upscale2DLayer(network, 2)
	network = layers.TransposedConv2DLayer(network, num_filters=num_units, filter_size=(5,5))
	network = layers.Upscale2DLayer(network, 2)
	network = layers.TransposedConv2DLayer(network, num_filters=3, filter_size=(9,9))
	'''
    network = layers.TransposedConv2DLayer(network,
                                           num_filters=num_units,
                                           filter_size=(8, 8))
    network = layers.TransposedConv2DLayer(network,
                                           num_filters=num_units,
                                           filter_size=(9, 9))
    network = layers.TransposedConv2DLayer(network,
                                           num_filters=num_units,
                                           filter_size=(9, 9))
    network = layers.TransposedConv2DLayer(network,
                                           num_filters=3,
                                           filter_size=(9, 9))

    return network
示例#9
0
def build_transition_up(incoming,
                        incoming_skip,
                        layers_per_block,
                        growth_rate,
                        W_init=lasagne.init.GlorotUniform(),
                        b_init=None):
    """"Builds a transition in the DenseNet model. 

    Transitions consist of the sequence: Batch Normalization, 1x1 Convolution,
    2x2 Average Pooling. The channels can be compressed by specifying 
    0 < m <= 1, where num_channels = channels * m.
    """
    network = nn.TransposedConv2DLayer(incoming,
                                       growth_rate * layers_per_block,
                                       filter_size=3,
                                       stride=2,
                                       crop='valid',
                                       W=W_init,
                                       b=b_init)
    cropping = [None, None, 'center', 'center']
    return nn.ConcatLayer([network, incoming_skip], cropping=cropping)
示例#10
0
    def __init__(self,
                 input,
                 num_filters,
                 filter_size,
                 stride=(2, 2),
                 padding=(0, 0),
                 activation=rectify):
        """
                Allocate a TransposedConvLayer with shared variable internal parameters.

                """

        self.input = input
        self.output = layers.TransposedConv2DLayer(
            self.input,
            num_filters,
            filter_size,
            stride=stride,
            crop=padding,
            W=initialize_parameters()[0],
            b=initialize_parameters()[1],
            nonlinearity=activation)
示例#11
0
def build_expand_level(incoming,
                       incoming_skip,
                       num_filters,
                       nonlin,
                       W_init=lasagne.init.GlorotUniform(),
                       b_init=lasagne.init.Constant(0.01),
                       filter_size=3):
    """Builds a Conv-Conv-Deconv-Concat block of U-Net."""

    network = nn.Conv2DLayer(incoming,
                             num_filters,
                             filter_size,
                             pad='same',
                             W=W_init,
                             b=b_init,
                             nonlinearity=nonlin)
    network = nn.batch_norm(network)
    network = nn.Conv2DLayer(network,
                             num_filters,
                             filter_size,
                             pad='same',
                             W=W_init,
                             b=b_init,
                             nonlinearity=nonlin)
    network = nn.batch_norm(network)
    network = nn.TransposedConv2DLayer(network,
                                       num_filters // 2,
                                       filter_size,
                                       stride=2,
                                       crop='valid',
                                       W=W_init,
                                       b=b_init,
                                       nonlinearity=nonlin)
    network = nn.batch_norm(network)

    crop_mode = [None, None, 'center', 'center']
    return nn.ConcatLayer([network, incoming_skip], cropping=crop_mode)
示例#12
0
def build_uunet_network(network, input_var, num_classes, num_filters=64,
                  nonlin=lasagne.nonlinearities.rectify, noise=0.0, # Would leaky_rectify improve network?
                  W_init=lasagne.init.GlorotUniform(),
                  b_init=lasagne.init.Constant(0.01), **kwargs):
    """Builds a fully-convolutional U-Net model."""

    crop_mode = [None, None, 'center', 'center']
    image_mean = np.array([103.939, 116.779, 123.68]).reshape(1, 3, 1, 1)

    # To use VGG weights, change RGB to BGR and subtract the mean BGR values
    sym_var = input_var[:, ::-1] - image_mean.astype(theano.config.floatX)

    input_layer = nn.InputLayer((None, 3, None, None), sym_var)

    network = nn.Conv2DLayer(input_layer, 64, 3, pad=1, flip_filters=False)
    level1  = nn.Conv2DLayer(network, 64, 3, pad=1, flip_filters=False)
    network = nn.Pool2DLayer(level1,  2)

    network = nn.Conv2DLayer(network, 128, 3, pad=1, flip_filters=False)
    level2  = nn.Conv2DLayer(network, 128, 3, pad=1, flip_filters=False)
    network = nn.Pool2DLayer(level2,  2)

    network = nn.Conv2DLayer(network, 256, 3, pad=1, flip_filters=False)
    network = nn.Conv2DLayer(network, 256, 3, pad=1, flip_filters=False)
    level3  = nn.Conv2DLayer(network, 256, 3, pad=1, flip_filters=False)
    network = nn.Pool2DLayer(level3,  2)

    network = nn.Conv2DLayer(network, 512, 3, pad=1, flip_filters=False)
    network = nn.Conv2DLayer(network, 512, 3, pad=1, flip_filters=False)
    level4  = nn.Conv2DLayer(network, 512, 3, pad=1, flip_filters=False)
    network = nn.Pool2DLayer(level4,  2)

    network = nn.Conv2DLayer(network, 512, 3, pad=1, flip_filters=False)
    network = nn.Conv2DLayer(network, 512, 3, pad=1, flip_filters=False)
    level5  = nn.Conv2DLayer(network, 512, 3, pad=1, flip_filters=False)
    network = nn.Pool2DLayer(level5,  2)

    # Set the weights for VGG portion
    vgg_layers = network

    # Decoder phase, all these weights will be learned
    network = nn.batch_norm(nn.Conv2DLayer(network, 1024, 1, pad='same'))
    network = nn.batch_norm(nn.Conv2DLayer(network, 1024, 1, pad='same'))
    network = nn.TransposedConv2DLayer(network, 512, 3, stride=2, crop='valid')
    network = nn.batch_norm(network)
    network = nn.ConcatLayer([network, level5], cropping=crop_mode)

    network = nn.batch_norm(nn.Conv2DLayer(network, 512, 3, pad='same'))
    network = nn.batch_norm(nn.Conv2DLayer(network, 521, 3, pad='same'))
    network = nn.TransposedConv2DLayer(network, 512, 3, stride=2, crop='valid')
    network = nn.batch_norm(network)
    network = nn.ConcatLayer([network, level4], cropping=crop_mode)

    # @two convolutions of the same size with a max pooling step in the middle. How is this useful?
    network = nn.batch_norm(nn.Conv2DLayer(network, 512, 3, pad='same'))
    network = nn.batch_norm(nn.Conv2DLayer(network, 521, 3, pad='same'))
    network = nn.TransposedConv2DLayer(network, 256, 3, stride=2, crop='valid')
    network = nn.batch_norm(network)
    network = nn.ConcatLayer([network, level3], cropping=crop_mode)

    network = nn.batch_norm(nn.Conv2DLayer(network, 256, 3, pad='same'))
    network = nn.batch_norm(nn.Conv2DLayer(network, 256, 3, pad='same'))
    network = nn.TransposedConv2DLayer(network, 128, 3, stride=2, crop='valid')
    network = nn.batch_norm(network)
    network = nn.ConcatLayer([network, level2], cropping=crop_mode)

    network = nn.batch_norm(nn.Conv2DLayer(network, 128, 3, pad='same'))
    network = nn.batch_norm(nn.Conv2DLayer(network, 128, 3, pad='same'))
    network = nn.TransposedConv2DLayer(network, 64, 3, stride=2, crop='valid')
    network = nn.batch_norm(network)
    network = nn.ConcatLayer([network, level1], cropping=crop_mode)

    # Final few valid convolutions to output class predictions
    network = nn.batch_norm(nn.Conv2DLayer(network, 64, 3, pad='same'))
    network = nn.Conv2DLayer(network, num_classes, 1, pad='same', nonlinearity=None)
    softmax = SpatialNonlinearityLayer(network, lasagne.nonlinearities.softmax)

    # This reshapes previous layer from 2d [batch_size, num_channels * rows * cols]
    # to [batch_size, num_channels, rows, cols]
    target_shape = (sym_var.shape[0], num_classes,
                    sym_var.shape[2], sym_var.shape[3])
    output = SpatialReshapeLayer(softmax, target_shape)

    # Applies a CRF to the output predictions & cleans everything up
    output_crf = CRFasRNNLayer(output, input_layer, normalize_final_iter=True)

    return softmax, output, output_crf, vgg_layers
def cnn_autoencoder(input_var=None):
    """
    Build the network using Lasagne library
    """

    ##################
    # Network config #
    ##################

    input_channels = 3
    weight_init = lasagne.init.Normal()

    # encoder
    conv1_nb_filt = 32
    conv1_sz_filt = (9, 9)
    conv1_sz_padd = 2
    # conv1 output size = (60, 60)

    pool1_sz = (2, 2)
    # pool1 output size = (30, 30)

    conv2_nb_filt = 64
    conv2_sz_filt = (7, 7)
    conv2_sz_padd = 0
    # conv2 output size = (24, 24)

    pool2_sz = (4, 4)
    # pool2 size = (6, 6)

    conv3_nb_filt = 128
    conv3_sz_filt = (5, 5)
    conv3_sz_padd = 0
    # conv3 output size = (2, 2)

    pool3_sz = (2, 2)
    # pool3 output size = (32, 1, 1)

    dens1_nb_unit = 256
    # dense1 output (vector 256)

    dens2_nb_unit = 256
    # dense2 output (vector 256)

    rshp_sz = 1
    # reshape output (256, 1, 1)

    # decoder
    tconv1_nb_filt = 64
    tconv1_sz_filt = (5, 5)
    tconv1_sz_strd = (1, 1)
    # conv1 output size = (5, 5)

    upsamp1_sz = (2, 2)
    # upsamp1 output size = (10, 10)

    tconv2_nb_filt = 32
    tconv2_sz_filt = (4, 4)
    tconv2_sz_strd = (1, 1)
    # tconv2 output size = (13, 13)

    upsamp2_sz = (2, 2)
    # upsamp2 output size = (26, 26)

    tconv3_nb_filt = 32
    tconv3_sz_filt = (5, 5)
    tconv3_sz_strd = (1, 1)
    # tconv3 output size = (30, 30)

    tconv4_nb_filt = 3
    tconv4_sz_filt = (3, 3)
    tconv4_sz_strd = (1, 1)
    # tconv4 output size = (32, 32)

    # final output = (3 channels, 32 x 32)

    #####################
    # Build the network #
    #####################

    # Add input layer
    network = lyr.InputLayer(shape=(None, input_channels, 64, 64),
                             input_var=input_var)

    # Add convolution layer
    network = lyr.Conv2DLayer(incoming=network,
                              num_filters=conv1_nb_filt,
                              filter_size=conv1_sz_filt,
                              pad=conv1_sz_padd,
                              W=weight_init)
    # Add pooling layer
    network = lyr.MaxPool2DLayer(incoming=network, pool_size=pool1_sz)

    # Add convolution layer
    network = lyr.Conv2DLayer(incoming=network,
                              num_filters=conv2_nb_filt,
                              filter_size=conv2_sz_filt,
                              pad=conv2_sz_padd,
                              W=weight_init)
    # Add pooling layer
    network = lyr.MaxPool2DLayer(incoming=network, pool_size=pool2_sz)

    # Add convolution layer
    network = lyr.Conv2DLayer(incoming=network,
                              num_filters=conv3_nb_filt,
                              filter_size=conv3_sz_filt,
                              pad=conv3_sz_padd,
                              W=weight_init)
    # Add pooling layer
    network = lyr.MaxPool2DLayer(incoming=network, pool_size=pool3_sz)

    network = lyr.FlattenLayer(network)

    # Add dense layer
    network = lyr.DenseLayer(network, dens1_nb_unit, W=weight_init)
    network = lyr.DenseLayer(network, dens2_nb_unit, W=weight_init)

    network = lyr.ReshapeLayer(network, (input_var.shape[0], dens2_nb_unit /
                                         (rshp_sz**2), rshp_sz, rshp_sz))

    # Add transposed convolution layer
    network = lyr.TransposedConv2DLayer(incoming=network,
                                        num_filters=tconv1_nb_filt,
                                        filter_size=tconv1_sz_filt,
                                        stride=tconv1_sz_strd,
                                        W=weight_init)
    # Add upsampling layer
    network = lyr.Upscale2DLayer(incoming=network, scale_factor=upsamp1_sz)

    # Add transposed convolution layer
    network = lyr.TransposedConv2DLayer(incoming=network,
                                        num_filters=tconv2_nb_filt,
                                        filter_size=tconv2_sz_filt,
                                        stride=tconv2_sz_strd,
                                        W=weight_init)
    # Add upsampling layer
    network = lyr.Upscale2DLayer(incoming=network, scale_factor=upsamp2_sz)

    # Add transposed convolution layer
    network = lyr.TransposedConv2DLayer(incoming=network,
                                        num_filters=tconv3_nb_filt,
                                        filter_size=tconv3_sz_filt,
                                        stride=tconv3_sz_strd,
                                        W=weight_init)

    # Add transposed convolution layer
    network = lyr.TransposedConv2DLayer(
        incoming=network,
        num_filters=tconv4_nb_filt,
        filter_size=tconv4_sz_filt,
        stride=tconv4_sz_strd,
        W=weight_init,
        nonlinearity=lasagne.nonlinearities.sigmoid)

    return network
示例#14
0
def build_context_encoder(input_var=None,
                          nfilters=[64, 128, 256, 512, 3000, 512, 256, 128, 3],
                          input_channels=3):
    ###############################
    # Build Network Configuration #
    ###############################

    print('... Building the generator')

    leaky = nonlinearities.LeakyRectify(0.2)

    # Input of the network : shape = (batch_size, 3, 64, 64)
    network = layers.InputLayer(shape=(None, input_channels, 64, 64),
                                input_var=input_var)

    # Conv layer : shape = (batch_size, 64, 32, 32)
    network = layers.Conv2DLayer(network,
                                 num_filters=nfilters[0],
                                 filter_size=(5, 5),
                                 stride=2,
                                 pad=2,
                                 nonlinearity=leaky)

    # Conv layer : shape = (batch_size, 128, 16, 16)
    network = layers.batch_norm(
        lasagne.layers.Conv2DLayer(network,
                                   num_filters=nfilters[1],
                                   filter_size=(5, 5),
                                   stride=2,
                                   pad=2,
                                   nonlinearity=leaky))

    # Conv layer : shape = (batch_size, 256, 8, 8)
    network = layers.batch_norm(
        lasagne.layers.Conv2DLayer(network,
                                   num_filters=nfilters[2],
                                   filter_size=(5, 5),
                                   stride=2,
                                   pad=2,
                                   nonlinearity=leaky))

    # Conv layer : shape = (batch_size, 512, 4, 4)
    network = layers.batch_norm(
        lasagne.layers.Conv2DLayer(network,
                                   num_filters=nfilters[3],
                                   filter_size=(5, 5),
                                   stride=2,
                                   pad=2,
                                   nonlinearity=leaky))

    # Conv layer : shape = (batch_size, 3000, 1, 1)
    network = layers.batch_norm(
        lasagne.layers.Conv2DLayer(network,
                                   num_filters=nfilters[4],
                                   filter_size=(4, 4),
                                   stride=2,
                                   nonlinearity=leaky))

    # Tranposed conv layer : shape = (batch_size, 512, 4, 4)
    network = layers.batch_norm(
        layers.TransposedConv2DLayer(network,
                                     num_filters=nfilters[5],
                                     filter_size=(4, 4),
                                     stride=(1, 1)))

    # Tranposed conv layer : shape = (batch_size, 256, 8, 8)
    network = layers.batch_norm(
        layers.TransposedConv2DLayer(network,
                                     num_filters=nfilters[6],
                                     filter_size=(5, 5),
                                     stride=(2, 2),
                                     crop=2,
                                     output_size=8))

    # Tranposed conv layer : shape = (batch_size, 128, 16, 16)
    network = layers.batch_norm(
        layers.TransposedConv2DLayer(network,
                                     num_filters=nfilters[7],
                                     filter_size=(5, 5),
                                     stride=(2, 2),
                                     crop=2,
                                     output_size=16))

    # Tranposed conv layer : shape = (batch_size, 3, 32, 32)
    network = layers.TransposedConv2DLayer(network,
                                           num_filters=nfilters[8],
                                           filter_size=5,
                                           stride=2,
                                           crop=2,
                                           output_size=32,
                                           nonlinearity=nonlinearities.sigmoid)

    return network
def define_net():
    net = {}

    print("Generator layer shapes:")
    net['input'] = ll.InputLayer(shape=(None, 3, IMAGE_SHAPE[0],
                                        IMAGE_SHAPE[1]))

    leaky_relu = lasagne.nonlinearities.LeakyRectify(0.2)

    # net['stand'] = ll.standardize(net['input'], offset=np.array([0, 0, 0], dtype='float32'),
    #                             scale=np.array([128.0, 128.0, 128.0], dtype='float32'))

    net['conv_1'] = Conv2DLayer(net['input'],
                                num_filters=64,
                                stride=(2, 2),
                                filter_size=(4, 4),
                                nonlinearity=leaky_relu)
    print(lasagne.layers.get_output_shape(net['conv_1']))
    net['conv_2'] = batch_norm(
        Conv2DLayer(net['conv_1'],
                    num_filters=128,
                    stride=(2, 2),
                    filter_size=(4, 4),
                    nonlinearity=leaky_relu))
    print(lasagne.layers.get_output_shape(net['conv_2']))
    net['conv_3'] = batch_norm(
        Conv2DLayer(net['conv_2'],
                    num_filters=256,
                    stride=(2, 2),
                    filter_size=(4, 4),
                    nonlinearity=leaky_relu))
    print(lasagne.layers.get_output_shape(net['conv_3']))
    net['conv_4'] = batch_norm(
        Conv2DLayer(net['conv_3'],
                    num_filters=512,
                    stride=(2, 2),
                    filter_size=(4, 4),
                    nonlinearity=leaky_relu))
    print(lasagne.layers.get_output_shape(net['conv_4']))
    net['conv_5'] = batch_norm(
        Conv2DLayer(net['conv_4'],
                    num_filters=512,
                    stride=(2, 2),
                    filter_size=(4, 4),
                    nonlinearity=leaky_relu))
    print(lasagne.layers.get_output_shape(net['conv_5']))
    net['conv_6'] = batch_norm(
        Conv2DLayer(net['conv_5'],
                    num_filters=512,
                    stride=(2, 2),
                    filter_size=(4, 4),
                    nonlinearity=leaky_relu))
    print(lasagne.layers.get_output_shape(net['conv_6']))

    net['conv_6'] = DropoutLayer(net['conv_6'])
    net['unconv_1'] = ll.batch_norm(
        ll.TransposedConv2DLayer(net['conv_6'],
                                 num_filters=512,
                                 stride=(2, 2),
                                 filter_size=(4, 4)))
    print(lasagne.layers.get_output_shape(net['unconv_1']))

    concat = DropoutLayer(
        ll.ConcatLayer([net['unconv_1'], net['conv_5']], axis=1))
    net['unconv_2'] = (ll.batch_norm(
        ll.TransposedConv2DLayer(concat,
                                 num_filters=512,
                                 stride=(2, 2),
                                 filter_size=(4, 4))))
    print(lasagne.layers.get_output_shape(net['unconv_2']))

    concat = DropoutLayer(
        ll.ConcatLayer([net['unconv_2'], net['conv_4']], axis=1))
    net['unconv_3'] = ll.batch_norm(
        ll.TransposedConv2DLayer(concat,
                                 num_filters=256,
                                 stride=(2, 2),
                                 filter_size=(4, 4)))
    print(lasagne.layers.get_output_shape(net['unconv_3']))

    concat = ll.ConcatLayer([net['unconv_3'], net['conv_3']], axis=1)
    net['unconv_4'] = ll.batch_norm(
        ll.TransposedConv2DLayer(concat,
                                 num_filters=128,
                                 stride=(2, 2),
                                 filter_size=(4, 4)))
    print(lasagne.layers.get_output_shape(net['unconv_4']))

    concat = ll.ConcatLayer([net['unconv_4'], net['conv_2']], axis=1)
    net['unconv_5'] = ll.batch_norm(
        ll.TransposedConv2DLayer(concat,
                                 num_filters=64,
                                 stride=(2, 2),
                                 filter_size=(5, 5)))
    print(lasagne.layers.get_output_shape(net['unconv_5']))

    concat = ll.ConcatLayer([net['unconv_5'], net['conv_1']], axis=1)
    net['unconv_6'] = ll.batch_norm(
        ll.TransposedConv2DLayer(concat,
                                 num_filters=32,
                                 stride=(2, 2),
                                 filter_size=(4, 4)))

    print(lasagne.layers.get_output_shape(net['unconv_6']))
    net['pre_out'] = batch_norm(
        Conv2DLayer(net['unconv_6'],
                    num_filters=3,
                    filter_size=(3, 3),
                    nonlinearity=lasagne.nonlinearities.tanh,
                    pad='same'))
    print(lasagne.layers.get_output_shape(net['pre_out']))
    net['out'] = ll.standardize(net['pre_out'],
                                offset=np.array([0, 0, 0], dtype='float32'),
                                scale=np.array(
                                    [1 / 128.0, 1 / 128.0, 1 / 128.0],
                                    dtype='float32'))

    print(lasagne.layers.get_output_shape(net['out']))

    return net
示例#16
0
def build_autoencoder(layer,
                      nonlinearity='same',
                      b=init.Constant(0.),
                      learnable_conv=False):
    """
    Unfolds a stack of layers into a symmetric autoencoder with tied weights.
    Given a :class:`Layer` instance, this function builds a
    symmetric autoencoder with tied weights.
    Parameters
    ----------
    layer : a :class:`Layer` instance or a tuple
        The :class:`Layer` instance with respect to which a symmetric
        autoencoder is built.
    nonlinearity : 'same', list, callable, or None
        The nonlinearities that are applied to the decoding layer.
        If 'same', each decoder layer has the same nonlinearity as its
        corresponding encoder layer. If a list is provided, it must contain
        nonlinearities for each decoding layer. Otherwise, if a single
        nonlinearity is provided, it is applied to all decoder layers.
        If set to ``None``, all nonlinearities for the decoder layers are set
        to lasagne.nonlinearities.identity.
    b : callable, Theano shared variable, numpy array, list or None
        An initializer for the decoder biases. By default, all decoder
        biases are initialized to lasagne.init.Constant(0.). If a shared
        variable or a numpy array is provided, the shape must match the
        incoming shape (only in case all incoming shapes are the same).
        Additianlly, a list containing initializers for the biases of each
        decoder layer can be provided. If set to ``None``, the decoder
        layers will have no biases, and pass through their input instead.
    Returns
    -------
    layer: :class:`Layer` instance
       The output :class:`Layer` of the symmetric autoencoder with
       tied weights.
    encoder: :class:`Layer` instance
       The code :class:`Layer` of the autoencoder (see Notes)
    Notes
    -----
    The encoder (input) :class:`Layer` is changed using
    `unfold_bias_and_nonlinearity_layers`. Therefore, this layer is not the
    code layer anymore, because it has got its bias and nonlinearity stripped
    off.
    Examples
    --------
    >>> from lasagne.layers import InputLayer, DenseLayer
    >>> from lasagne.layers import build_autoencoder
    >>> l_in = InputLayer((100, 20))
    >>> l1 = DenseLayer(l_in, num_units=50)
    >>> l2 = DenseLayer(l1, num_units=10)
    >>> l_ae, l2 = build_autoencoder(l2, nonlinearity='same', b=None)
    """

    if isinstance(nonlinearity, (tuple, list)):
        n_idx = 0

    if isinstance(b, (tuple, list)):
        b_idx = 0

    encoder = unfold_bias_and_nonlinearity_layers(layer)
    layers = get_all_layers(encoder)
    autoencoder_layers = [encoder]

    kwargs_b = dict(b=None)
    kwargs_n = dict(nonlinearity=nonlinearities.identity)
    for i, layer in enumerate(layers[::-1]):

        incoming = autoencoder_layers[-1]
        if isinstance(layer, InputLayer):
            continue
        elif isinstance(layer, BiasLayer):
            if b is None:
                kwargs_b = dict(b=None)
            elif isinstance(b, (tuple, list)):
                kwargs_b = dict(b=b[b_idx])
                b_idx += 1
            else:
                kwargs_b = dict(b=b)
        elif isinstance(layer, NonlinearityLayer):
            if nonlinearity == 'same':
                kwargs_n = dict(nonlinearity=layer.nonlinearity)
            elif nonlinearity is None:
                kwargs_n = dict(nonlinearity=nonlinearities.identity)
            elif isinstance(nonlinearity, (tuple, list)):
                kwargs_n = dict(nonlinearity=nonlinearity[n_idx])
                n_idx += 1
            else:
                kwargs_n = dict(nonlinearity=nonlinearity)
        elif isinstance(layer, DropoutLayer):
            a_layer = DropoutLayer(incoming=incoming,
                                   p=layer.p,
                                   rescale=layer.rescale)
            autoencoder_layers.append(a_layer)
        elif isinstance(layer, GaussianNoiseLayer):
            a_layer = GaussianNoiseLayer(incoming=incoming, sigma=layer.sigma)
            autoencoder_layers.append(a_layer)
        elif isinstance(layer, L.Conv2DLayer):
            a_layer = L.TransposedConv2DLayer(incoming=incoming,
                                              num_filters=layer.input_shape[1],
                                              filter_size=layer.filter_size,
                                              stride=layer.stride,
                                              crop=layer.pad,
                                              untie_biases=layer.untie_biases,
                                              b=None,
                                              nonlinearity=None)
        elif isinstance(layer, L.MaxPool2DLayer):
            a_layer = L.Upscale2DLayer(incoming=incoming,
                                       scale_factor=layer.pool_size)
        elif isinstance(layer, L.BatchNormLayer):
            a_layer = L.BatchNormLayer(incoming)
        else:
            a_layer = InverseLayer(incoming=incoming, layer=layer)
            if hasattr(layer, 'b'):
                a_layer = BiasLayer(incoming=a_layer, **kwargs_b)
            if hasattr(layer, 'nonlinearity'):
                a_layer = NonlinearityLayer(incoming=a_layer, **kwargs_n)
            autoencoder_layers.append(a_layer)

    return autoencoder_layers, encoder