Exemplo n.º 1
0
def train():
    X = T.tensor4('images')
    y = T.lvector('labels')

    X_ = nn.placeholder((bs, ) + image_shape, name='images_plhd')
    y_ = nn.placeholder((bs, ), dtype='int64', name='labels_plhd')

    net = nets[architecture]((None, ) + image_shape)
    nn.set_training_on()
    updates, losses, grad_norms = net.get_updates(X, y, l2_coeff, lr)
    train_net = nn.function([],
                            list(losses.values()),
                            updates=updates,
                            givens={
                                X: X_,
                                y: y_
                            },
                            name='train net')

    nn.set_training_off()
    err, losses = net.get_accuracy(X, y)
    valid_net = nn.function([], [err, losses['loss']],
                            givens={
                                X: X_,
                                y: y_
                            },
                            name='validate net')

    train_data = CIFAR10((X_train, y_train), (X_, y_),
                         bs,
                         n_epochs,
                         training=True,
                         shuffle=True,
                         augmentation=transforms)
    valid_data = CIFAR10((X_test, y_test), (X_, y_),
                         bs,
                         1,
                         training=False,
                         shuffle=False)
    mon = nn.Monitor(model_name=architecture, print_freq=print_freq)
    for it in train_data:
        with mon:
            losses_ = train_net()
            if np.any(np.isnan(losses_)) or np.any(np.isinf(losses_)):
                raise ValueError('NAN loss!')

            for j, k in enumerate(losses.keys()):
                mon.plot(k, losses_[j])

            if it % valid_freq == 0:
                mean_res = np.mean([valid_net() for _ in valid_data], 0)
                mon.plot('validation error', mean_res[0])
                mon.plot('validation loss', mean_res[1])
                mon.dump(nn.utils.shared2numpy(net.params),
                         '%s.npy' % architecture, 5)
    print('Training finished!')
Exemplo n.º 2
0
def train(input_shape,
          output_size,
          image_path,
          bs=64,
          z_dim=1024,
          n_iters=int(1e6)):
    batch_input_shape = (bs, ) + input_shape
    net = LSGAN((bs, z_dim), output_size)

    X__ = T.tensor4('image', 'float32')
    X = DataManager.preprocess(X__)
    z = srng.uniform((bs, z_dim), -1, 1, ndim=2, dtype='float32')
    X_ = theano.shared(np.zeros(batch_input_shape, 'float32'),
                       'image placeholder')

    nn.set_training_status(True)
    gen_loss, dis_loss, updates_gen, updates_dis = net.learn(X, z, 1e-3, .5)
    train_gen = nn.function([],
                            gen_loss,
                            updates=updates_gen,
                            name='train generator')
    train_dis = nn.function([],
                            dis_loss,
                            updates=updates_dis,
                            givens={X__: X_},
                            name='train discriminator')

    nn.set_training_status(False)
    fixed_noise = T.constant(np.random.uniform(-1, 1, (bs, z_dim)),
                             'fixed noise', 2, 'float32')
    gen_imgs = net(fixed_noise)
    generate = nn.function([], gen_imgs, name='generate images')

    n_epochs = int(bs * n_iters / len(os.listdir(image_path)))
    dm = DataManager(output_size, X_, image_path, bs, n_epochs, True)
    mon = nn.monitor.Monitor(model_name='LSGAN', use_visdom=True)
    batches = dm.get_batches()
    start = time.time()
    for it in batches:
        dis_loss_ = train_dis()
        gen_loss_ = train_gen()
        if np.isnan(gen_loss_ + dis_loss_) or np.isinf(dis_loss_ + gen_loss_):
            raise ValueError('Training failed! Stopped.')
        mon.plot('discriminator loss', dis_loss_)
        mon.plot('generator loss', gen_loss_)

        if it % 500 == 499:
            fake_imgs = generate()
            mon.imwrite('fake images', fake_imgs / 2. + .5)
            mon.plot('time elapsed', (time.time() - start) / 60.)
            nn.utils.save(net, mon.current_folder + '/training.pkl')
            mon.flush()
        mon.tick()
    net.save_params(mon.current_folder + '/params.npz')
    print('Training finished')
Exemplo n.º 3
0
def train():
    enc = VGG19(input_shape)
    decs = [Decoder(enc, i, name='decoder %d' % i) for i in indices]
    sty_net = StyleTransfer(enc, decs)

    X = T.tensor4('input')
    Y = T.tensor4('style')
    idx = T.scalar('iter', 'int32')
    X_ = nn.placeholder((bs,) + input_shape[1:], name='input_plhd')
    Y_ = nn.placeholder((bs,) + input_shape[1:], name='style_plhd')
    lr_ = nn.placeholder(value=lr, name='lr_plhd')

    nn.set_training_on()
    losses = [dec.cost(X) for dec in decs]
    updates = [nn.adam(loss[0] + weight * loss[1], dec.trainable, lr) for loss, dec in zip(losses, decs)]
    nn.anneal_learning_rate(lr_, idx, 'inverse', decay=decay)
    trains = [nn.function([], [loss[0], loss[1], dec(X, True)], givens={X: X_}, updates=update, name='train decoder')
              for loss, dec, update in zip(losses, decs, updates)]

    nn.set_training_off()
    X_styled = sty_net(X, Y)
    transfer = nn.function([], X_styled, givens={X: X_, Y: Y_}, name='transfer style')

    data_train = DataManager(X_, input_path_train, bs, n_epochs, True, num_val_imgs=num_val_imgs, input_shape=input_shape)
    data_test = DataManagerStyleTransfer((X_, Y_), (input_path_val, style_path_val), bs, 1, input_shape=input_shape)
    mon = nn.Monitor(model_name='WCT', valid_freq=print_freq)

    print('Training...')
    for it in data_train:
        results = [train(it) for train in trains]

        with mon:
            for layer, res in zip(indices, results):
                if np.isnan(res[0] + res[1]) or np.isinf(res[0] + res[1]):
                    raise ValueError('Training failed!')
                mon.plot('pixel loss at layer %d' % layer, res[0])
                mon.plot('feature loss at layer %d' % layer, res[1])

            if it % val_freq == 0:
                mon.imwrite('recon img at layer %d' % layer, res[2])

                for i in data_test:
                    img = transfer()
                    mon.imwrite('stylized image %d' % i, img)
                    mon.imwrite('input %d' % i, X_.get_value())
                    mon.imwrite('style %d' % i, Y_.get_value())

                for idx, dec in zip(indices, decs):
                    mon.dump(nn.utils.shared2numpy(dec.params), 'decoder-%d.npz' % idx, 5)
    mon.flush()
    for idx, dec in zip(indices, decs):
        mon.dump(nn.utils.shared2numpy(dec.params), 'decoder-%d-final.npz' % idx)
    print('Training finished!')
Exemplo n.º 4
0
def test_tracking():
    trivial_loops = 5
    shape = (3, 3)

    a = T.matrix('a')
    b = T.scalar('b')
    b_ = nn.placeholder(value=1.)

    def foo(x, y):
        for i in range(trivial_loops):
            nn.track('loop %d' % (i + 1), x)
            x += y
        return x

    c = foo(a, b)
    func = nn.function([a], c, givens={b: b_})

    a_ = np.zeros(shape, 'float32')
    res_numpy = [a_ + i for i in range(trivial_loops + 1)]
    utt.assert_allclose(func(a_), res_numpy[-1])

    for i in range(trivial_loops):
        trackeds = nn.eval_tracked_vars({a: a_, b: b_.get_value()})
        assert all(
            np.allclose(x, y)
            for x, y in zip(list(trackeds.values()), res_numpy[:-1]))
Exemplo n.º 5
0
def test_lr_annealing():
    base_lr = 1.
    n_iters = 50
    decay = 1e-2
    step = 10

    def anneal_learning_rate(lr, t, method='half-life', **kwargs):
        lr_ = lr
        if method == 'half-life':
            num_iters = kwargs.pop('num_iters', None)
            decay = kwargs.pop('decay', .1)
            if num_iters is None:
                raise ValueError('num_iters must be provided.')

            if (t == num_iters // 2) or (t == 3 * num_iters // 4):
                return lr_ * decay
            else:
                return lr_
        elif method == 'step':
            step = kwargs.pop('step', None)
            decay = kwargs.pop('decay', .5)
            if step is None:
                raise ValueError('step must be provided.')

            if t % step == 0:
                return lr_ * decay
            else:
                return lr_
        elif method == 'exponential':
            decay = kwargs.pop('decay', 1e-4)
            return lr_ * np.exp(-decay * t)
        elif method == 'linear':
            num_iters = kwargs.pop('num_iters', None)
            if num_iters is None:
                raise ValueError('num_iters must be provided.')
            return lr_ * (1. - t / np.cast[theano.config.floatX](num_iters))
        elif method == 'inverse':
            decay = kwargs.pop('decay', .01)
            return lr_ / (1. + decay * t)
        else:
            raise ValueError('Unknown annealing method.')

    idx = T.scalar('it', 'int32')
    for method in ('linear', 'step', 'exponential', 'inverse', 'half-life'):
        print('Testing method %s' % method)
        lr_ = nn.placeholder(dtype=theano.config.floatX, value=base_lr, name='lr')
        y = 0. + lr_
        nn.anneal_learning_rate(lr_, idx, method, num_iters=n_iters, decay=decay, step=step)
        func = nn.function([idx], y)
        vals_th, vals_np = [], []
        lr = base_lr
        for it in range(n_iters):
            func(it + 1)
            vals_th.append(lr_.get_value())
            lr = anneal_learning_rate(lr if method in ('step', 'half-life') else base_lr, it+1, method,
                                      num_iters=n_iters, decay=decay, step=step)
            vals_np.append(lr)
        assert_allclose(vals_th, vals_np)
Exemplo n.º 6
0
def style_transfer():
    enc = VGG19(input_shape)
    decs = [Decoder(enc, i, name='decoder %d' % i) for i in indices]
    sty_net = StyleTransfer(enc, decs)

    X = T.tensor4('input')
    Y = T.tensor4('style')

    mon = nn.Monitor(current_folder=args.path_to_weight_files)
    for idx, layer in enumerate(indices):
        weights = mon.load('decoder-%d-final.npz' % layer)
        nn.utils.numpy2shared(weights, decs[idx].params)

    nn.set_training_off()
    X_styled = sty_net(X, Y)
    transfer = nn.function([X, Y], X_styled, name='transfer style')

    if os.path.isfile(input_path_test) and os.path.isfile(style_path_test):
        input = prep_image_test(misc.imread(input_path_test))
        style = prep_image_test(misc.imread(style_path_test))
        output = transfer(input, style)
        mon.imwrite('test %s' % input_path_test[:-4], input)
        mon.imwrite('test %s' % style_path_test[:-4], style)
        mon.imwrite('test %s %s' % (input_path_test[:-4], style_path_test[:-4]), output)
    elif os.path.isfile(input_path_test) and os.path.isdir(style_path_test):
        input = prep_image_test(misc.imread(input_path_test))
        style_files = os.listdir(style_path_test)
        for style_file in style_files:
            style = prep_image_test(misc.imread(os.path.join(style_path_test, style_file)))
            output = transfer(input, style)
            mon.imwrite('test %s' % style_file[:-4], style)
            mon.imwrite('test %s %s' % (input_path_test[:-4], style_file[:-4]), output)
        mon.imwrite('test %s' % input_path_test[:-4], input)
    elif os.path.isdir(input_path_test) and os.path.isfile(style_path_test):
        style = prep_image_test(misc.imread(style_path_test))
        input_files = os.listdir(input_path_test)
        for input_file in input_files:
            input = prep_image_test(misc.imread(os.path.join(input_path_test, input_file)))
            output = transfer(input, style)
            mon.imwrite('test %s' % input_file[:-4], input)
            mon.imwrite('test %s %s' % (input_file[:-4], style_path_test[:-4]), output)
        mon.imwrite('test %s' % style_path_test[:-4], style)
    else:
        style_files = os.listdir(style_path_test)
        input_files = os.listdir(input_path_test)
        for style_file in style_files:
            style = prep_image_test(misc.imread(os.path.join(style_path_test, style_file)))
            for input_file in input_files:
                input = prep_image_test(misc.imread(os.path.join(input_path_test, input_file)))
                output = transfer(input, style)
                mon.imwrite('test %s' % input_file[:-4], input)
                mon.imwrite('test %s %s' % (input_file[:-4], style_file[:-4]), output)
            mon.imwrite('test %s' % style_file[:-4], style)
    mon.flush()
    print('Testing finished!')
Exemplo n.º 7
0
def test_yiq():
    from scipy import misc
    im = misc.imread('test_files/lena.jpg').astype(theano.config.floatX) / 255.
    im = np.transpose(im[None], (0, 3, 1, 2))

    a = T.tensor4('input')
    b = nn.utils.rgb2yiq(a)
    c = nn.utils.yiq2rgb(b)
    func = nn.function([a], [b[:, 0:1], c])

    im_out_y, im_out = func(im)
    misc.imsave('test_files/lena_from_yiq.jpg', np.transpose(im_out[0], (1, 2, 0)))
    misc.imsave('test_files/lena_y.jpg', im_out_y[0, 0])
Exemplo n.º 8
0
def test_diff_of_gaussians():
    size1 = 21
    size2 = 51
    
    x = T.tensor4('image')
    x1 = nn.utils.difference_of_gaussian(x, size1)
    x2 = nn.utils.difference_of_gaussian(x, size2)
    func = nn.function([x], [x1, x2])
    
    from scipy import misc
    im = misc.imread('test_files/lena_small.png').astype(theano.config.floatX) / 255.
    im = np.transpose(im[None], (0, 3, 1, 2))
    x1_, x2_ = func(im)
    misc.imsave('test_files/lena_small_dog1.jpg', np.transpose(x1_[0], (1, 2, 0)))
    misc.imsave('test_files/lena_small_dog2.jpg', np.transpose(x2_[0], (1, 2, 0)))
Exemplo n.º 9
0
def test_downsample():
    shape = (1, 3, 220, 220)
    kernel_type = 'gauss1sq2'

    x = T.tensor4('input')
    downsample = nn.DownsamplingLayer(shape, 4, kernel_type=kernel_type)
    y = downsample(x)
    f = nn.function([x], y)

    from imageio import imwrite, imread
    x = imread('test_files/lena_small.png').astype('float32') / 255.
    x = np.transpose(x[None], (0, 3, 1, 2))
    out = f(x)
    out = np.transpose(out[0], (1, 2, 0))
    imwrite('test_files/lena_small_downsampled.jpg', out)
Exemplo n.º 10
0
def test_partial_conv_based_padding():
    shape = (1, 3, 5, 5)
    num_filters = 2
    filter_size = 3

    x = T.ones(shape)
    conv = nn.Conv2DLayer(shape,
                          num_filters,
                          filter_size,
                          border_mode='partial')
    y = conv(x)
    f = nn.function([], y)
    print(f())
    print(conv.update_mask.eval())
    print(conv.mask_ratio)
Exemplo n.º 11
0
def test_pearsonr():
    size = (64, 1000)

    pred = T.matrix('pred')
    gt = T.matrix('gt')
    corr = nn.pearsonr(pred, gt)
    f = nn.function([pred, gt], corr)

    gt = np.random.normal(size=size).astype(theano.config.floatX)
    pred = np.random.uniform(size=size).astype(theano.config.floatX)
    c = f(pred, gt)

    from scipy import stats
    c_ref, _ = stats.pearsonr(pred.flatten(), gt.flatten())
    utt.assert_allclose(c_ref, c)
Exemplo n.º 12
0
def test_upsampling_layer():
    input_shape = (1, 3, 220, 220)
    X = T.tensor4('input')
    bilinear_up = nn.UpsamplingLayer(input_shape, 4, method='bilinear')
    nearest_up = nn.UpsamplingLayer(input_shape, 4, method='nearest')

    x_bilinear = bilinear_up(X)
    x_nearest = nearest_up(X)
    func = nn.function([X], [x_bilinear, x_nearest])

    from scipy import misc
    im = np.transpose(misc.imread('test_files/lena_small.png').astype(theano.config.floatX), (2, 0, 1))[None] / 255.
    x_bi_, x_ne_ = func(im)
    x_bi_ = np.transpose(x_bi_[0], (1, 2, 0))
    x_ne_ = np.transpose(x_ne_[0], (1, 2, 0))
    misc.imsave('test_files/lena_small_bilinear.jpg', x_bi_)
    misc.imsave('test_files/lena_small_nearest.jpg', x_ne_)
Exemplo n.º 13
0
def test_meshgrid():
    height = 10.
    width = 100.

    h = T.scalar()
    w = T.scalar()
    x, y = nn.utils.linspace(0, w, w), nn.utils.linspace(0, h, h)
    X, Y = nn.utils.meshgrid(x, y)
    f = nn.function([w, h], [X, Y])

    X_th, Y_th = f(width, height)

    x, y = np.linspace(0, width, width), np.linspace(0, height, height)
    X_np, Y_np = np.meshgrid(x, y)

    utt.assert_allclose(X_th, X_np)
    utt.assert_allclose(Y_th, Y_np)
Exemplo n.º 14
0
def test_rfft2():
    X = T.tensor4('input')
    Y = nn.utils.rfft2(X)
    Y_i = nn.utils.irfft2(Y)
    rfft2 = nn.function([X], [Y, Y_i])

    from imageio import imread
    x = imread('test_files/lena_small.png').astype('float32') / 255.
    x = np.transpose(x, (2, 0, 1))
    x_fft_np = np.fft.rfft2(x)

    x = x[None]
    x_fft_th, x_ifft_th = rfft2(x)
    x_fft_th = x_fft_th[0]

    utt.assert_allclose(np.real(x_fft_np), x_fft_th[..., 0])
    utt.assert_allclose(np.imag(x_fft_np), x_fft_th[..., 1])
    np.allclose(x_ifft_th, x, 1e-4)
Exemplo n.º 15
0
def test_frac_bilinear_upsampling():
    frac_ratio1 = ((5, 2), (11, 5))
    frac_ratio2 = ((2, 3), (5, 13))
    frac_ratio3 = ((2, 3), (17, 7))

    X = T.tensor4('input')
    Y1 = nn.utils.frac_bilinear_upsampling(X, frac_ratio1)
    Y2 = nn.utils.frac_bilinear_upsampling(X, frac_ratio2)
    Y3 = nn.utils.frac_bilinear_upsampling(X, frac_ratio3)
    f = nn.function([X], [Y1, Y2, Y3])

    from imageio import imread, imwrite
    x = imread('test_files/lena_small.png').astype('float32') / 255.
    x = np.transpose(x, (2, 0, 1))[None]
    y1, y2, y3 = f(x)

    out = np.array(np.transpose(y1[0], (1, 2, 0)))
    imwrite('test_files/lena_small_frac_bi_up.jpg', out)
    out = np.array(np.transpose(y2[0], (1, 2, 0)))
    imwrite('test_files/lena_small_frac_bi_down.jpg', out)
    out = np.array(np.transpose(y3[0], (1, 2, 0)))
    imwrite('test_files/lena_small_frac_bi_mixed.jpg', out)

    input_x = np.array(
        [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]],
        ndmin=4).astype(theano.config.floatX)
    up_x = nn.utils.frac_bilinear_upsampling(input=input_x,
                                             frac_ratio=((7, 4), (5, 3)))
    num_up_x = np.array([[[[1., 1.2, 1.8, 2.],
                           [1.28571429, 1.48571429, 2.08571429, 2.28571429],
                           [2.42857143, 2.62857143, 3.22857143, 3.42857143],
                           [3., 3.2, 3.8, 4.]],
                          [[5., 5.2, 5.8, 6.],
                           [5.28571429, 5.48571429, 6.08571429, 6.28571429],
                           [6.42857143, 6.62857143, 7.22857143, 7.42857143],
                           [7., 7.2, 7.8, 8.]],
                          [[9., 9.2, 9.8, 10.],
                           [9.28571429, 9.48571429, 10.08571429, 10.28571429],
                           [
                               10.42857143, 10.62857143, 11.22857143,
                               11.42857143
                           ], [11., 11.2, 11.8,
                               12.]]]]).astype(theano.config.floatX)
    utt.assert_allclose(up_x.eval(), num_up_x, rtol=1e-6)
Exemplo n.º 16
0
def test_model_zoo_vgg19():
    top = 1
    root = 'test_files/'
    weight_file = root + 'vgg19_from_pytorch.npz'
    imagenet_classes_file = root + 'imagenet_classes.txt'
    image_list = [
        'ILSVRC2012_val_00000001.JPEG', 'ILSVRC2012_val_00000002.JPEG',
        'ILSVRC2012_val_00000003.JPEG', 'ILSVRC2012_val_00000004.JPEG',
        'ILSVRC2012_val_00000005.JPEG'
    ]

    net = nn.model_zoo.VGG19((None, 3, 224, 224))
    net.load_params(weight_file)

    X = T.tensor4('input')
    test = nn.function([X], net(X))

    with open(imagenet_classes_file, 'r') as f:
        classes = [s.strip() for s in f.readlines()]
    mean_rgb = np.array([0.485, 0.456, 0.406],
                        dtype=theano.config.floatX)[None, None, :]
    std_rgb = np.array([0.229, 0.224, 0.225],
                       dtype=theano.config.floatX)[None, None, :]

    results = []
    for fname in image_list:
        print(fname)
        rawim, im = nn.utils.prep_image2(root + fname, mean_rgb, std_rgb)
        prob = test(im)[0]
        res = sorted(zip(classes, prob), key=lambda t: t[1],
                     reverse=True)[:top]
        for c, p in res:
            print('  ', c, p)
            results.append(c)
        print('\n')

    sample_res = [
        'rock python, rock snake, Python sebae', 'ski',
        'Shetland sheepdog, Shetland sheep dog, Shetland', 'soup bowl',
        'bassinet'
    ]
    assert results == sample_res
Exemplo n.º 17
0
def test_random():
    enc = Encoder((None, ) + input_size, vgg_param_file)
    dec = Decoder(enc.output_shape, dec_param_file)

    X = T.tensor4('input')
    Y = T.tensor4('style')
    weights = [T.vector('weights') for i in range(len(vgg_info))]

    nn.set_training_off()
    X_styled = dec(enc((X, Y), weights))
    test = nn.function([X, Y] + weights, X_styled, name='test generator')

    style_folder = os.listdir(style_img_folder)
    input_folder = os.listdir(input_img_folder)

    time_list = []
    if not os.path.exists('outputs'):
        os.mkdir('outputs')

    for style_file in style_folder:
        sty_img = prep_image_test(
            misc.imread(style_img_folder + '/' + style_file))
        for input_file in input_folder:
            try:
                input_img = prep_image_test(
                    misc.imread(input_img_folder + '/' + input_file))
            except ValueError:
                continue

            for i in range(num_styles):
                start = time.time()
                output = test(input_img, sty_img, *get_weights(vgg_info))
                time_list.append(time.time() - start)
                output = np.transpose(output[0], (1, 2, 0))
                misc.imsave(
                    os.path.join(
                        'outputs', input_file[:-4] + '_' + style_file[:-4] +
                        '_%d.jpg' % i), output)

    print('Took %f s/image' % np.mean(time_list))
    print('Testing finished!')
Exemplo n.º 18
0
def train_sngan(z_dim=128, image_shape=(3, 32, 32), bs=64, n_iters=int(1e5)):
    gen = DCGANGenerator((None, z_dim))
    dis = SNDCGANDiscriminator(gen.output_shape)

    z = srng.uniform((bs, z_dim), -1, 1, ndim=2, dtype='float32')
    X = T.tensor4('image', 'float32')
    X_ = theano.shared(np.zeros((bs, ) + image_shape, 'float32'),
                       'image_placeholder')

    # training
    nn.set_training_status(True)
    X_fake = gen(z)
    y_fake = dis(X_fake)
    y_real = dis(X)

    dis_loss_real = T.mean(T.nnet.softplus(-y_real))
    dis_loss_fake = T.mean(T.nnet.softplus(y_fake))
    dis_loss = dis_loss_real + dis_loss_fake
    gen_loss = T.mean(T.nnet.softplus(-y_fake))

    updates_gen = nn.adam(gen_loss, gen.trainable, args.adam_alpha,
                          args.adam_beta1, args.adam_beta2)
    updates_dis = nn.adam(dis_loss, dis.trainable, args.adam_alpha,
                          args.adam_beta1, args.adam_beta2)

    train_gen = nn.function([],
                            gen_loss,
                            updates=updates_gen,
                            name='train generator')
    train_dis = nn.function([],
                            dis_loss,
                            updates=updates_dis,
                            givens={X: X_},
                            name='train discriminator')

    # testing
    nn.set_training_status(False)
    fixed_noise = T.constant(np.random.uniform(-1, 1, (bs, z_dim)),
                             'fixed noise', 2, 'float32')
    gen_imgs = gen(fixed_noise)
    generate = nn.function([], gen_imgs, name='generate images')

    dm = DataManager(X_, n_iters, bs, True)
    mon = nn.monitor.Monitor(model_name='LSGAN', use_visdom=args.use_visdom)
    epoch = 0
    print('Training...')
    batches = dm.get_batches(epoch, dm.n_epochs, infinite=True)
    start = time.time()
    for iteration in range(n_iters):
        #update generator
        training_gen_cost = train_gen()
        if np.isnan(training_gen_cost) or np.isinf(training_gen_cost):
            raise ValueError('Training failed due to NaN cost')
        mon.plot('training gen cost', training_gen_cost)

        #update discriminator
        training_disc_cost = []
        for i in range(args.n_dis):
            batches.__next__()
            training_disc_cost.append(train_dis())
            if np.isnan(training_disc_cost[-1]) or np.isinf(
                    training_disc_cost[-1]):
                raise ValueError('Training failed due to NaN cost')
        mon.plot('training disc cost', np.mean(training_disc_cost))

        if iteration % args.valid_freq == 0:
            gen_images = generate()
            mon.imwrite('generated image', dm.unnormalize(gen_images))
            mon.plot('time elapsed', (time.time() - start) / 60.)
            mon.flush()
        mon.tick()
    mon.flush()
    print('Training finished!')
Exemplo n.º 19
0
def train():
    X_A_full = T.tensor4('A')
    X_B_full = T.tensor4('B')
    X_A = pre_process(X_A_full)
    X_B = pre_process(X_B_full)
    z = nn.utils.srng.normal((bs, latent_dim))
    idx = T.scalar('iter')

    X_A_ = nn.placeholder((bs, 3, image_size*4, image_size*4), name='A_plhd')
    X_B_ = nn.placeholder((bs, 3, image_size*4, image_size*4), name='B_plhd')
    lr_ = nn.placeholder(value=lr, name='lr_plhd')

    net = AugmentedCycleGAN((None, 3, image_size, image_size), latent_dim, n_gen_filters, n_dis_filters, n_enc_filters, 3,
                            use_dropout, use_sigmoid, use_latent_gan)

    nn.set_training_on()
    updates_dis, updates_gen, dis_losses, dis_preds, gen_losses, grad_norms = net.learn(X_A, X_B, z, lambda_A, lambda_B,
                                                                                        lambda_z_B, lr=lr_, beta1=beta1,
                                                                                        max_norm=max_norm)
    train_dis = nn.function([], list(dis_losses.values()), updates=updates_dis, givens={X_A_full: X_A_, X_B_full: X_B_},
                            name='train discriminators')
    train_gen = nn.function([], list(gen_losses.values()), updates=updates_gen, givens={X_A_full: X_A_, X_B_full: X_B_},
                            name='train generators')
    discriminate = nn.function([], list(dis_preds.values()), givens={X_A_full: X_A_, X_B_full: X_B_}, name='discriminate')
    compute_grad_norms = nn.function([], list(grad_norms.values()), givens={X_A_full: X_A_, X_B_full: X_B_},
                                     name='compute grad norms')

    nn.anneal_learning_rate(lr_, idx, 'linear', num_iters=n_epochs_decay)
    train_dis_decay = nn.function([idx], list(dis_losses.values()), updates=updates_dis, givens={X_A_full: X_A_, X_B_full: X_B_},
                                  name='train discriminators with decay')

    nn.set_training_off()
    fixed_z = T.constant(np.random.normal(size=(bs, latent_dim)), dtype='float32')
    fixed_multi_z = T.constant(np.repeat(np.random.normal(size=(n_multi, latent_dim)), bs, 0), dtype='float32')
    visuals = net.generate_cycle(X_A, X_B, fixed_z)
    multi_fake_B = net.generate_multi(X_A, fixed_multi_z)
    visualize_single = nn.function([], list(visuals.values()), givens={X_A_full: X_A_, X_B_full: X_B_}, name='visualize single')
    visualize_multi = nn.function([], multi_fake_B, givens={X_A_full: X_A_}, name='visualize multi')

    train_data = Edges2Shoes((X_A_, X_B_), bs, n_epochs + n_epochs_decay + 1, 'train', True)
    val_data = Edges2Shoes((X_A_, X_B_), bs, 1, 'val', False, num_data=bs)
    mon = nn.Monitor(model_name='Augmented_CycleGAN', print_freq=print_freq)

    print('Training...')
    for it in train_data:
        epoch = 1 + it // (len(train_data) // bs)

        with mon:
            res_dis = train_dis() if epoch <= n_epochs else train_dis_decay(epoch - n_epochs)
            res_gen = train_gen()
            preds = discriminate()
            grads_ = compute_grad_norms()

            mon.plot('lr', lr_.get_value())

            for j, k in enumerate(dis_losses.keys()):
                mon.plot(k, res_dis[j])

            for j, k in enumerate(gen_losses.keys()):
                mon.plot(k, res_gen[j])

            for j, k in enumerate(dis_preds.keys()):
                mon.hist(k, preds[j])

            for j, k in enumerate(grad_norms.keys()):
                mon.plot(k, grads_[j])

            if it % valid_freq == 0:
                for _ in val_data:
                    vis_single = visualize_single()
                    vis_multi = visualize_multi()

                for j, k in enumerate(visuals.keys()):
                    mon.imwrite(k, vis_single[j][:n_imgs_to_save], callback=unnormalize)

                for j, fake_B in enumerate(vis_multi):
                    mon.imwrite('fake_B_multi_%d.jpg' % j, fake_B, callback=unnormalize)

                mon.dump(nn.utils.shared2numpy(net.netG_A_B.params), 'gen_A_B.npy', 5)
                mon.dump(nn.utils.shared2numpy(net.netG_B_A.params), 'gen_B_A.npy', 5)
                mon.dump(nn.utils.shared2numpy(net.netD_A.params), 'dis_A.npy', 5)
                mon.dump(nn.utils.shared2numpy(net.netD_B.params), 'dis_B.npy', 5)
                mon.dump(nn.utils.shared2numpy(net.netE_B.params), 'enc_B.npy', 5)
                if use_latent_gan:
                    mon.dump(nn.utils.shared2numpy(net.netD_z_B.params), 'dis_z_B.npy', 5)

    mon.flush()
    mon.dump(nn.utils.shared2numpy(net.netG_A_B.params), 'gen_A_B.npy')
    mon.dump(nn.utils.shared2numpy(net.netG_B_A.params), 'gen_B_A.npy')
    mon.dump(nn.utils.shared2numpy(net.netD_A.params), 'dis_A.npy')
    mon.dump(nn.utils.shared2numpy(net.netD_B.params), 'dis_B.npy')
    mon.dump(nn.utils.shared2numpy(net.netE_B.params), 'enc_B.npy')
    if use_latent_gan:
        mon.dump(nn.utils.shared2numpy(net.netD_z_B.params), 'dis_z_B.npy')
    print('Training finished!')
Exemplo n.º 20
0

if __name__ == '__main__':
    from theano.tensor.nnet import conv2d
    from theano.tensor.nnet.conv3d2d import conv3d

    x = T.tensor4()
    h = T.tensor4()
    # conv2d_temp = []
    # for patch_num in range(36):
    #     input = T.concatenate([x[patch_num, :, :, :].dimshuffle(0, 'x', 1, 2)]*512, 1)
    #     filter = h[patch_num, :, :, :].dimshuffle('x', 0, 1, 2)
    #     conv2d_temp.append(conv2d(input, filter,
    #                                border_mode='half'
    #                               ))
    # conv_out = T.concatenate(conv2d_temp, axis=0)

    x_con = T.concatenate([x] * 512, 1)
    x_prime = x_con.dimshuffle(0, 'x', 1, 2, 3)
    conv_out3 = conv3d(x_prime, h.dimshuffle('x', 0, 1, 2, 3), border_mode='half')
    conv_out3 = T.stack([conv_out3[i, i] for i in range(36)])

    # func = nn.function([x, h], conv_out)
    func_3 = nn.function([x, h], conv_out3)

    x = np.random.rand(36, 1, 10, 10).astype('float32')
    h = np.random.rand(36, 512, 3, 3).astype('float32')

    print(func_3(x, h).shape)
    # print(func(x, h).shape)
    # assert np.allclose(func(x, h), func_3(x, h))