def get_FullCifar10Datapool(batch_size, shift):
    imgs, labels = load_full_cifar_10(shift)
    imgs = np.reshape(imgs, [len(imgs), 3, 32, 32])
    imgs = imgs.transpose([0, 2, 3, 1])
    data_pool = utils.MemoryData({'img': imgs, 'label': labels},
                                 batch_size)
    return data_pool
def getFashion_MNISTDatapool(batch_size, shift, keep=None):
    if keep is None:
        imgs, y, num_train_data = data.mnist_load('fmnist',shift=shift)
    else:
        imgs, y, num_train_data = data.mnist_load('fmnist', keep=keep, shift=shift)
    print "Total number of training dataset: " + str(num_train_data)
    imgs.shape = imgs.shape + (1,)
    data_pool = utils.MemoryData({'img': imgs, 'label':y}, batch_size)
    return data_pool
예제 #3
0
def getMNISTDatapool(batch_size, keep=None, shift=True):
    if keep is None:
        imgs, _, num_train_data = data.mnist_load('MNIST_data', shift=shift)
    else:
        imgs, _, num_train_data = data.mnist_load('MNIST_data',
                                                  keep=keep,
                                                  shift=shift)
    print "Total number of training data: " + str(num_train_data)
    imgs.shape = imgs.shape + (1, )
    data_pool = utils.MemoryData({'img': imgs}, batch_size)
    return data_pool
def getFullFashion_MNISTDatapool(batch_size, shift,keep=None):
    if keep is None:
        imgs, y, num_train_data = data.mnist_load('fmnist',shift=shift)
        imgs_t, y_t, num_train_data_t = data.mnist_load('fmnist',dataset='test',shift=shift)
    else:
        imgs, y, num_train_data = data.mnist_load('fmnist', keep=keep, shift=shift)
        imgs_t, y_t, num_train_data_t = data.mnist_load('fmnist', keep=keep,dataset='test',shift = shift)
    print "Total number of training dataset: " + str(num_train_data + num_train_data_t)
    imgs.shape = imgs.shape + (1,)
    imgs_t.shape = imgs_t.shape + (1,)
    data_pool = utils.MemoryData({'img': np.concatenate((imgs,imgs_t)), 'label':np.concatenate((y,y_t))}, batch_size)
    return data_pool
def getToyDatapool(batch_size, mus, cov, numberPerCluster):
    X = getToyDataset(mus, cov, numberPerCluster)
    print "Total number of training dataset: " + str(len(X))
    data_pool = utils.MemoryData({'point':X}, batch_size)
    return data_pool
예제 #6
0
def experiment(name, data_func, init_w):
    """ param """
    epoch = 80
    batch_size = 64
    n_centroid = 10

    gan_type = name
    dir = "results/" + gan_type + "-" + datetime.datetime.now().strftime(
        "%Y%m%d-%H%M%S")
    ''' dataset '''

    X, Y = data_func()

    import utils
    data_pool = utils.MemoryData({'img': X, 'label': Y}, batch_size)
    """ graphs """

    # heads =1
    # generator = partial(models.mgan_gen, heads=1)
    # discriminator = partial(models.mgan_dis, name='d_2')

    # generator_ = partial(models.generator_m2_32X32, heads=1)
    def generator(z, training=True, reuse=True, heads=10):
        imgs = []
        for i in range(heads):
            imgs += models.generator_m2_32X32(z=z,
                                              training=training,
                                              reuse=reuse,
                                              name='generator' + str(i),
                                              heads=1)
        return imgs

    discriminator = partial(models.discriminator2, name='d_2')
    # encoder = partial(models.cnn_discriminator, out_dim = 10)
    # from cnn_classifier import cnn_classifier
    encoder = partial(models.cnn_classifier2, keep_prob=1., name='classifier')
    # encoder = partial(vat.forward, is_training=False, update_batch_stats=False)
    optimizer = tf.train.AdamOptimizer
    #==============================
    # inputs
    real = tf.placeholder(tf.float32, shape=[batch_size, 32, 32, 3])
    real2 = tf.placeholder(tf.float32, shape=[None, 32, 32, 3])
    # with tf.variable_scope("CNN") as scope:
    r_mean = encoder(real2, reuse=False)
    r_p = tf.nn.softmax(r_mean)
    # r_p = r_mean
    predicts = tf.argmax(r_p, axis=1)

    #=====================
    z = tf.random_normal(shape=(batch_size, 100),
                         mean=0,
                         stddev=1,
                         dtype=tf.float32)
    # z =  tf.placeholder(tf.float32, shape=[None, z_dim])
    fake_set = generator(z, reuse=False)
    fake = tf.concat(fake_set, 0)
    # print(fake.shape)
    r_logit = discriminator(real, reuse=False)
    f_logit = discriminator(fake)

    d_loss_real = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=r_logit,
                                                labels=tf.ones_like(r_logit)))
    d_loss_fake = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=f_logit,
                                                labels=tf.zeros_like(f_logit)))
    d_loss = d_loss_real + 1. * d_loss_fake

    g_loss = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=f_logit,
                                                labels=tf.ones_like(f_logit)))

    g_loss_ori = tf.identity(g_loss)
    g_loss = 1. * g_loss  #weight down real loss

    for i in range(len(fake_set)):
        onehot_labels = tf.one_hot(indices=tf.cast(
            tf.scalar_mul(i, tf.ones(batch_size)), tf.int32),
                                   depth=n_centroid)

        f_mean = encoder(fake_set[i])
        f_p = tf.nn.softmax(f_mean)

        g_loss += 3. * tf.reduce_mean(
            objectives.categorical_crossentropy(onehot_labels, f_p))

    # trainable variables for each network
    T_vars = tf.trainable_variables()

    en_var = [var for var in T_vars if var.name.startswith('classifier')]
    g_var = [var for var in T_vars if var.name.startswith('generator')]
    dis_var = [var for var in T_vars if var.name.startswith('d_2')]

    #optimizer
    # global_step = tf.Variable(0, name='global_step',trainable=False)
    d_step = optimizer(learning_rate=0.0002,
                       beta1=0.5).minimize(d_loss, var_list=dis_var)
    g_step = optimizer(learning_rate=0.0002,
                       beta1=0.5).minimize(g_loss, var_list=g_var)
    g_step2 = optimizer(learning_rate=0.0002,
                        beta1=0.5).minimize(g_loss_ori, var_list=g_var)
    """ train """
    ''' init '''
    # session
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=1)
    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

    # saver
    saver = tf.train.Saver(max_to_keep=5)
    # summary writer
    # Send summary statistics to TensorBoard
    tf.summary.scalar('d_loss', d_loss)
    tf.summary.scalar('g_loss', g_loss)
    image_sets = generator(z, training=False)
    for img_set in image_sets:
        tf.summary.image('G_images', img_set, 12)

    merged = tf.summary.merge_all()
    logdir = dir + "/tensorboard"
    writer = tf.summary.FileWriter(logdir, sess.graph)
    print('Tensorboard dir: ' + logdir)

    # ''' initialization '''
    sess.run(tf.global_variables_initializer())
    ''' train '''
    batch_epoch = len(data_pool) // (batch_size)
    max_it = epoch * batch_epoch

    def cluster_acc(Y_pred, Y):
        from sklearn.utils.linear_assignment_ import linear_assignment
        assert Y_pred.size == Y.size
        D = max(Y_pred.max(), Y.max()) + 1
        w = np.zeros((D, D), dtype=np.int64)
        for i in range(Y_pred.size):
            w[Y_pred[i], Y[i]] += 1
        ind = linear_assignment(w.max() - w)
        return sum([w[i, j] for i, j in ind]) * 1.0 / Y_pred.size, w

    def gan_train(max_it, it_offset):
        print("GAN iteration: " + str(max_it))
        # total_it = it_offset + max_it
        for it in range(it_offset, it_offset + max_it):
            real_ipt, y = data_pool.batch(['img', 'label'])

            if it > 30000:
                _, _ = sess.run([d_step, g_step], feed_dict={real: real_ipt})
            else:
                _, _ = sess.run([d_step, g_step2],
                                feed_dict={real: real_ipt})  #ori g loss
            if it % 10 == 0:
                summary = sess.run(merged, feed_dict={real: real_ipt})
                writer.add_summary(summary, it)
            if it % 1000 == 0:
                i = 0
                for f in fake_set:
                    sample_imgs = sess.run(f)
                    # if normalize:
                    #     for i in range(len(sample_imgs)):
                    sample_imgs = sample_imgs * 2. - 1.
                    save_dir = dir + "/sample_imgs"
                    utils.mkdir(save_dir + '/')
                    # for imgs, name in zip(sample_imgs, list_of_names):
                    my_utils.saveSampleImgs(imgs=sample_imgs,
                                            full_path=save_dir + "/" +
                                            'sample-%d-%d.jpg' % (i, it),
                                            row=8,
                                            column=8)
                    i += 1

    total_it = 0
    try:
        ae_saver = tf.train.Saver(var_list=en_var)

        ae_saver.restore(sess, init_w)  #0.86 cifar
        # dist = [0]*10
        predict_y = sess.run(predicts, feed_dict={real2: X[:1000]})
        acc = cluster_acc(predict_y, Y[:1000])
        print('Accuracy of clustering model: ', acc[0])

        gan_train(max_it, 0)

    except Exception, e:
        traceback.print_exc()
import models_mnist as models


""" param """
epoch = 50
batch_size = 64
lr = 0.0002
z_dim = 100
gpu_id = 3

''' data '''
utils.mkdir('./data/mnist/')
data.mnist_download('./data/mnist')
imgs, _, _ = data.mnist_load('./data/mnist')
imgs.shape = imgs.shape + (1,)
data_pool = utils.MemoryData({'img': imgs}, batch_size)


""" graphs """
with tf.device('/gpu:%d' % gpu_id):
    ''' models '''
    generator = models.generator
    discriminator = models.discriminator

    ''' graph '''
    # inputs
    real = tf.placeholder(tf.float32, shape=[None, 28, 28, 1])
    z = tf.placeholder(tf.float32, shape=[None, z_dim])

    # generate
    fake = generator(z, reuse=False)
예제 #8
0
batch_size = 64
n_centroid = 10

gan_type = "gan-svhn"
dir = "results/" + gan_type + "-" + datetime.datetime.now().strftime(
    "%Y%m%d-%H%M%S")
''' data '''
#===========svhn=================
import scipy.io as sio
train_data = sio.loadmat('../train_32x32.mat')
X = train_data['X'] / 255.
Y = train_data['y']
X = X.transpose([3, 0, 1, 2])
# data_pool = my_utils.getFullMNISTDatapool(batch_size, shift=False) #range 0 ~ 1
import utils
data_pool = utils.MemoryData({'img': X, 'label': Y}, batch_size)
# data_pool = my_utils.getFullFashion_MNISTDatapool(batch_size, shift=False)
# X,Y = my_utils.loadFullFashion_MNSIT(shift=False)
# # X, Y = my_utils.load_data('mnist')
# X = np.reshape(X, [70000,28,28,1])
# num_data = 70000
# plt.ion() # enables interactive mode
# test_data_list, numPerClass = my_utils.getTest_data(numPerClass=100)
# colors =  ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'black', 'purple', 'pink', 'brown']
# #             0       1       2       3        4          5        6        7         8       9
""" graphs """
heads = 1
# generator = partial(models.generator_m2_32X32, heads=1)
# discriminator = partial(models.discriminator2, name='d_2')

generator = partial(models.generator_m2_32X32, heads=2)
def experiment():
    epoch = 40
    batch_size = 100
    lr = 2e-4
    beta1 = 0.5
    z_dim = 128
    n_critic = 1  #
    n_generator = 1
    model_name = "modified_CatGAN"
    dir = "results/" + model_name + "-" + datetime.datetime.now().strftime(
        "%Y%m%d-%H%M%S")
    ''' dataset '''

    from data import load_fmnist
    X, Y = load_fmnist()
    num_data = len(X)
    import utils
    data_pool = utils.MemoryData({'img': X, 'label': Y}, batch_size)
    """ graphs """

    generator = models.generator
    encoder = partial(models.cnn_discriminator, name='encoder', out_dim=10)
    optimizer = tf.train.AdamOptimizer

    # inputs
    real = tf.placeholder(tf.float32, shape=[None, 28, 28, 1])
    random_z = tf.random_normal(shape=(batch_size, z_dim),
                                mean=0,
                                stddev=1,
                                dtype=tf.float32)
    random_z2 = tf.random_normal(shape=(10000, z_dim),
                                 mean=0,
                                 stddev=1,
                                 dtype=tf.float32)

    #marginal entropy
    def mar_entropy(y):
        y1 = tf.reduce_mean(y, axis=0)
        y2 = tf.reduce_sum(-y1 * tf.log(y1))
        return y2

    #conditional entropy
    def cond_entropy(y):
        y1 = -y * tf.log(y)
        y2 = tf.reduce_sum(y1) / batch_size
        return y2

    fake = generator(random_z, reuse=False)
    # print('fake shape ',fake.shape)
    r_mean = encoder(real, reuse=False)
    f_mean = encoder(fake)

    r_p = tf.nn.softmax(r_mean)
    f_p = tf.nn.softmax(f_mean)

    # weight = tf.placeholder(tf.float32, shape=[])
    # init_weight = 1.

    #discriminator loss
    d_loss = -1 * (mar_entropy(r_p) - cond_entropy(r_p) + cond_entropy(f_p)
                   )  # Equation (7) upper

    #generator loss
    g_loss = -mar_entropy(f_p) + cond_entropy(f_p)  # Equation (7) lower

    # trainable variables for each network
    T_vars = tf.trainable_variables()
    d_var = [var for var in T_vars if var.name.startswith('encoder')]
    g_var = [var for var in T_vars if var.name.startswith('generator')]

    # optimize
    global_step = tf.Variable(0, name='global_step', trainable=False)
    d_step = optimizer(learning_rate=lr,
                       beta1=beta1).minimize(d_loss,
                                             var_list=d_var,
                                             global_step=global_step)
    g_step = optimizer(learning_rate=lr, beta1=beta1).minimize(g_loss,
                                                               var_list=g_var)

    d_reg_loss = d_loss + 0.001 * tf.add_n([tf.nn.l2_loss(v) for v in d_var])
    d_reg_step = optimizer(learning_rate=lr,
                           beta1=beta1).minimize(d_reg_loss, var_list=d_var)
    """ train """
    ''' init '''
    # session
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=1)
    sess = tf.InteractiveSession(config=tf.ConfigProto(
        gpu_options=gpu_options))

    # saver
    saver = tf.train.Saver(max_to_keep=5)
    # summary writer
    # Send summary statistics to TensorBoard
    tf.summary.scalar('d_loss', d_loss)
    tf.summary.scalar('g_loss', g_loss)
    images_from_g = generator(random_z, training=False)
    images_from_g2 = generator(random_z2, training=False)
    tf.summary.image('Generator_image', images_from_g, 12)

    #predict
    embed_mean = encoder(real)
    y = tf.nn.softmax(embed_mean)
    predicts = tf.argmax(y, axis=1)

    merged = tf.summary.merge_all()
    logdir = dir + "/tensorboard"
    writer = tf.summary.FileWriter(logdir, sess.graph)
    print('Tensorboard dir: ' + logdir)
    ''' initialization '''
    sess.run(tf.global_variables_initializer())
    ''' train '''
    batch_epoch = len(data_pool) // (batch_size * n_critic)
    max_it = epoch * batch_epoch

    def sample_once(it):
        rows = 10
        columns = 10
        feed = {random_z: np.random.normal(size=[rows * columns, z_dim])}
        list_of_generators = [images_from_g]  # used for sampling images
        list_of_names = ['it%d-g.jpg' % it]
        save_dir = dir + "/sample_imgs"
        my_utils.sample_and_save(sess=sess,
                                 list_of_generators=list_of_generators,
                                 feed_dict=feed,
                                 list_of_names=list_of_names,
                                 save_dir=save_dir)

    def cluster_acc(Y_pred, Y):
        from sklearn.utils.linear_assignment_ import linear_assignment
        assert Y_pred.size == Y.size
        D = max(Y_pred.max(), Y.max()) + 1
        w = np.zeros((D, D), dtype=np.int64)
        for i in range(Y_pred.size):
            w[Y_pred[i], Y[i]] += 1
        ind = linear_assignment(w.max() - w)
        return sum([w[i, j] for i, j in ind]) * 1.0 / Y_pred.size, w

    def training(max_it, it_offset):
        print("Modified CatGAN iteration: " + str(max_it))

        for it in range(it_offset, it_offset + max_it):
            real_ipt, y = data_pool.batch(['img', 'label'])

            if it // batch_epoch > 25:
                #print('stop G')
                _ = sess.run([d_reg_step], feed_dict={real: real_ipt})

            else:

                _, _ = sess.run([d_step, g_step], feed_dict={real: real_ipt})

            if it % 10 == 0:

                summary = sess.run(merged, feed_dict={real: real_ipt})
                writer.add_summary(summary, it)
            #
            if it % (batch_epoch) == 0:
                predict_y = sess.run(predicts,
                                     feed_dict={real: X[60000:62000]})

                acc = cluster_acc(predict_y, Y[60000:62000])

                print('Epoch', (it // (batch_epoch)),
                      'Accuracy of clustering model: ', acc[0])

    try:

        training(max_it, 0)
        total_it = sess.run(global_step)
        print("Total iterations: " + str(total_it))
    except Exception, e:
        traceback.print_exc()
def experiment():
    """ param """
    epoch = 80
    batch_size = 64
    n_centroid = 10

    gan_type = "LearningByAssociation+GAN+VAEGAN+SVHN"
    dir = "results/" + gan_type + "-" + datetime.datetime.now().strftime(
        "%Y%m%d-%H%M%S")
    ''' dataset '''

    X, Y = load_svhn_code()

    import utils
    data_pool = utils.MemoryData({'img': X, 'label': Y}, batch_size)
    """ graphs """

    # heads =1
    # generator = partial(models.mgan_gen, heads=1)
    # discriminator = partial(models.mgan_dis, name='d_2')

    # generator = partial(models.ss_generator2, heads=10) #for aegan
    # generator = partial(models.ss_generator3, heads=10) #for vaegan
    #no weight sharing
    def G(z,
          reuse=True,
          name="generator",
          training=True,
          heads=10,
          model=None):
        out = []
        with tf.variable_scope(name, reuse=reuse):
            for i in range(heads):
                out += model(z,
                             reuse=reuse,
                             training=training,
                             name=name + str(i))
            return out

    generator = partial(G,
                        heads=10,
                        model=partial(models.ss_generator3,
                                      heads=1))  # for vaegan
    # generator = partial(G, heads=10, model = partial(models.ss_generator2, heads=1))  # for ae,aegan
    import models_32x32
    discriminator = partial(models.ss_discriminator2, name='d_2')
    decoder = partial(models_32x32.decoder, name='decoder')
    # encoder = partial(models.cnn_discriminator, out_dim = 10)
    # from cnn_classifier import cnn_classifier
    encoder = partial(models.ss_classifier, keep_prob=1., name='classifier')
    # encoder = partial(vat.forward, is_training=False, update_batch_stats=False)
    optimizer = tf.train.AdamOptimizer
    #==============================
    # inputs
    real = tf.placeholder(tf.float32, shape=[batch_size, 100])
    real2 = tf.placeholder(tf.float32, shape=[None, 100])
    # with tf.variable_scope("CNN") as scope:
    r_mean = encoder(real2, reuse=False)
    r_p = tf.nn.softmax(r_mean)
    # r_p = r_mean
    predicts = tf.argmax(r_p, axis=1)

    #=====================
    z = tf.random_normal(shape=(batch_size, 100),
                         mean=0,
                         stddev=1,
                         dtype=tf.float32)
    # z =  tf.placeholder(tf.float32, shape=[None, z_dim])
    fake_set = generator(z, reuse=False)
    fake = tf.concat(fake_set, 0)
    # print(fake.shape)
    r_logit = discriminator(real, reuse=False)
    f_logit = discriminator(fake)

    d_loss_real = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=r_logit,
                                                labels=tf.ones_like(r_logit)))
    d_loss_fake = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=f_logit,
                                                labels=tf.zeros_like(f_logit)))
    d_loss = d_loss_real + 1. * d_loss_fake

    g_loss = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=f_logit,
                                                labels=tf.ones_like(f_logit)))

    g_loss_ori = tf.identity(g_loss)
    g_loss = 1. * g_loss  #weight down real loss

    for i in range(len(fake_set)):
        onehot_labels = tf.one_hot(indices=tf.cast(
            tf.scalar_mul(i, tf.ones(batch_size)), tf.int32),
                                   depth=n_centroid)
        # if i == 0:
        #     f_mean = encoder(fake_set[i],reuse=False)
        # else:
        # with tf.variable_scope("CNN") as scope:
        #     scope.reuse_variables()
        f_mean = encoder(fake_set[i])
        f_p = tf.nn.softmax(f_mean)
        # f_p = f_mean
        # g_loss += .5*cond_entropy(f_p)
        g_loss += 2. * tf.reduce_mean(
            objectives.categorical_crossentropy(onehot_labels, f_p))
        # g_loss += cat_weight*tf.reduce_mean(tf.losses.softmax_cross_entropy(logits=f_l, onehot_labels=onehot_labels))

    # trainable variables for each network
    T_vars = tf.trainable_variables()
    # en_var = [var for var in T_vars if var.name.startswith('discriminator')]
    # en_var = [var for var in T_vars if var.name.startswith('CNN')]

    en_var = [var for var in T_vars if var.name.startswith('classifier')]
    g_var = [var for var in T_vars if var.name.startswith('generator')]
    dis_var = [var for var in T_vars if var.name.startswith('d_2')]

    #optimizer
    global_step = tf.Variable(0, name='global_step', trainable=False)
    d_step = optimizer(learning_rate=0.0002,
                       beta1=0.5).minimize(d_loss, var_list=dis_var)
    g_step = optimizer(learning_rate=0.0002,
                       beta1=0.5).minimize(g_loss, var_list=g_var)
    g_step2 = optimizer(learning_rate=0.0002,
                        beta1=0.5).minimize(g_loss_ori, var_list=g_var)
    """ train """
    ''' init '''
    # session
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=1)
    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

    # saver
    saver = tf.train.Saver(max_to_keep=5)
    # summary writer
    # Send summary statistics to TensorBoard
    tf.summary.scalar('d_loss', d_loss)
    tf.summary.scalar('g_loss', g_loss)
    image_sets_ = generator(z, training=False)
    image_sets = []
    for i in range(len(image_sets_)):
        if i == 0:
            image_sets.append(decoder(image_sets_[i], reuse=False))
        else:
            image_sets.append(decoder(image_sets_[i]))
    #todo
    for img_set in image_sets:
        tf.summary.image('G_images', img_set, 12)

    merged = tf.summary.merge_all()
    logdir = dir + "/tensorboard"
    writer = tf.summary.FileWriter(logdir, sess.graph)
    print('Tensorboard dir: ' + logdir)

    # ''' initialization '''
    sess.run(tf.global_variables_initializer())
    ''' train '''
    batch_epoch = len(data_pool) // (batch_size)
    max_it = epoch * batch_epoch

    def cluster_acc(Y_pred, Y):
        from sklearn.utils.linear_assignment_ import linear_assignment
        assert Y_pred.size == Y.size
        D = max(Y_pred.max(), Y.max()) + 1
        w = np.zeros((D, D), dtype=np.int64)
        for i in range(Y_pred.size):
            w[Y_pred[i], Y[i]] += 1
        ind = linear_assignment(w.max() - w)
        return sum([w[i, j] for i, j in ind]) * 1.0 / Y_pred.size, w

    def gan_train(max_it, it_offset):
        print("GAN iteration: " + str(max_it))
        # total_it = it_offset + max_it
        for it in range(it_offset, it_offset + max_it):
            real_ipt, y = data_pool.batch(['img', 'label'])

            if it > 30000:
                _, _ = sess.run([d_step, g_step], feed_dict={real: real_ipt})
            else:
                _, _ = sess.run([d_step, g_step2], feed_dict={real: real_ipt})
            if it % 10 == 0:
                summary = sess.run(merged, feed_dict={real: real_ipt})
                writer.add_summary(summary, it)
            if it % 1000 == 0:
                i = 0
                # todo
                for f in image_sets:
                    sample_imgs = sess.run(f)
                    # if normalize:
                    #     for i in range(len(sample_imgs)):
                    sample_imgs = sample_imgs * 2. - 1.
                    save_dir = dir + "/sample_imgs"
                    utils.mkdir(save_dir + '/')
                    # for imgs, name in zip(sample_imgs, list_of_names):
                    my_utils.saveSampleImgs(imgs=sample_imgs,
                                            full_path=save_dir + "/" +
                                            'sample-%d-%d.jpg' % (i, it),
                                            row=8,
                                            column=8)
                    i += 1

    total_it = 0
    try:
        ae_saver = tf.train.Saver(var_list=en_var)
        de_var = [
            var for var in tf.trainable_variables()
            if var.name.startswith('decoder')
        ]
        de_saver = tf.train.Saver(var_list=de_var)
        # ckpt = tf.train.get_checkpoint_state('../vat_tf/log/svhnaug/')
        # print("Checkpoints:", ckpt)
        # if ckpt and ckpt.model_checkpoint_path:

        # ae_saver.restore(sess, ckpt.model_checkpoint_path)
        # sess.run(tf.local_variables_initializer())

        # ae_saver.restore(sess, 'results/cnn-classifier-model.ckpt')  # 0.49
        # ae_saver.restore(sess, 'results/cnn-classifier-noshift-model.ckpt')

        # ae_saver.restore(sess, 'results/svhn-encoder-classifier-model.ckpt')#0.89 ae
        # ae_saver.restore(sess, 'results/svhn-encoder-2-classifier-model.ckpt')#0.81 aegan weight 1
        # ae_saver.restore(sess, 'results/svhn-encoder-3-classifier-model.ckpt')  # 0.85 aegan weight 0.5
        # ae_saver.restore(sess, 'results/svhn-encoder-4-classifier-model.ckpt')  # 0.8134 vaegan weight 0.5
        # ae_saver.restore(sess, 'results/svhn-encoder-5-classifier-model.ckpt')  # 0.9 vaegan weight 0.5->mean embed
        # ae_saver.restore(sess, 'results/svhn-encoder-6-classifier-model.ckpt')  # 0.84 aegan weight 0.2
        ae_saver.restore(
            sess, 'weights/lba-svhn-code/svhn-encoder-7-classifier-model.ckpt'
        )  # 0.92 vaegan weight 0.5->reduce KL->mean embed
        # ae_saver.restore(sess, 'results/cifar-encode-2-classifier-model.ckpt')  # 0.87 vaegan weight 1->mean embed

        # de_saver.restore(sess, 'results/dcgan-ae-20180813-193414/checkpoint/model.ckpt')#ae encoder 1
        # de_saver.restore(sess, 'results/aegan-20180815-185953/checkpoint/model.ckpt')#aegan weight 1->encode2
        # de_saver.restore(sess, 'results/aegan-20180816-094249/checkpoint/model.ckpt')#aeganweight 0.5->encode 3
        # de_saver.restore(sess, 'results/vaegan-20180816-141528/checkpoint/model.ckpt') #vaeganweight 0.5->encode 4
        # de_saver.restore(sess, 'results/aegan-20180823-105228/checkpoint/model.ckpt')  # aeganweight 0.2->encode 6
        de_saver.restore(sess, 'weights/vaegan-svhn/model.ckpt'
                         )  # vaeganweight 0.5->reduce KL->mean embed->encode 7

        # de_saver.restore(sess, 'results/vaegan-20180827-154620/checkpoint/model.ckpt')#cifar
        # de_saver.restore(sess, 'results/vaegan-20180827-171731/checkpoint/model.ckpt') #cifar good
        # dist = [0]*10
        predict_y = sess.run(predicts, feed_dict={real2: X[:1000]})
        acc = cluster_acc(predict_y, Y[:1000])
        print('Accuracy of clustering model: ', acc[0])

        gan_train(max_it, 0)

    except Exception, e:
        traceback.print_exc()
예제 #11
0
파일: apx-gist.py 프로젝트: wangmn93/VaDE
gan_type = "apx-gist"
dir = "results/" + gan_type + "-" + datetime.datetime.now().strftime(
    "%Y%m%d-%H%M%S")
''' data '''
import utils
#svhn
# X , _ = my_utils.get_svhn()
import scipy.io as sio
train_data = sio.loadmat('../train_32x32.mat')
X = train_data['X'] / 255.
# X = X/255.
X = X.transpose([3, 0, 1, 2])
# X = np.array(X)/float(255.)
gist_feature = np.load('svhn-gist.npy')
# Y = train_data['y']
data_pool = utils.MemoryData({'img': X, 'label': gist_feature}, batch_size)

# inputs
real = tf.placeholder(tf.float32, shape=[None, 32, 32, 3])
target_gist = tf.placeholder(tf.float32, shape=[None, 960])
""" graphs """
import models_mnist as models
encoder = Encoder
optimizer = tf.train.MomentumOptimizer

#encoder
real_logits = encoder(real, reuse=False)
# gist_fit = tf.nn.sigmoid(real_logits)
gist_fit = tf.nn.relu(real_logits)

#variables
예제 #12
0
    with tf.Session() as sess:
        import scipy.io as sio
        import numpy as np
        train_data = sio.loadmat('../train_32x32.mat')
        X = train_data['X'] / 255.
        y = train_data['y'] - 1

        # Y = train_data['y']
        pseudo_y = np.load('svhn-peusdo-label-0.47.npy')
        pseudo_y_onehot = tf.keras.utils.to_categorical(pseudo_y,
                                                        num_classes=10)
        X = X.transpose([3, 0, 1, 2])
        # data_pool = my_utils.getFullMNISTDatapool(batch_size, shift=False) #range 0 ~ 1
        import utils

        data_pool = utils.MemoryData({'img': X, 'label': pseudo_y_onehot}, 50)
        saver = tf.train.Saver(max_to_keep=5)
        sess.run(tf.initialize_all_variables())

        max_steps = 5000
        for step in range(max_steps):
            batch_xs, batch_ys = data_pool.batch()
            if (step % 100) == 0:
                print(
                    step,
                    sess.run(accuracy,
                             feed_dict={
                                 x: X[:1000],
                                 y_: pseudo_y_onehot[:1000],
                                 k_prob: 1.0
                             }))
예제 #13
0
def experiment(init_w):
    """ param """
    epoch = 40
    batch_size = 64
    n_centroid = 10

    gan_type = "ModifiedCatGAN+GAN+FMNIST"
    dir = "results/" + gan_type + "-" + datetime.datetime.now().strftime(
        "%Y%m%d-%H%M%S")
    ''' dataset '''
    # data_pool = my_utils.getFullMNISTDatapool(batch_size, shift=False) #range 0 ~ 1
    # data_pool = my_utils.getFullFashion_MNISTDatapool(batch_size, shift=False)
    X, Y = load_fmnist()
    num_data = len(X)
    import utils
    data_pool = utils.MemoryData({'img': X, 'label': Y}, batch_size)
    """ graphs """

    generator = partial(models.generator_m2, heads=10)
    discriminator = partial(models.discriminator2, name='d_2')
    encoder = partial(models.cnn_discriminator, out_dim=10)
    optimizer = tf.train.AdamOptimizer

    # inputs
    real = tf.placeholder(tf.float32, shape=[batch_size, 28, 28, 1])
    real2 = tf.placeholder(tf.float32, shape=[None, 28, 28, 1])

    r_mean = encoder(real2, reuse=False)
    r_p = tf.nn.softmax(r_mean)
    predicts = tf.argmax(r_p, axis=1)

    #=====================
    z = tf.random_normal(shape=(batch_size, 62),
                         mean=0,
                         stddev=1,
                         dtype=tf.float32)
    # z =  tf.placeholder(tf.float32, shape=[None, z_dim])
    fake_set = generator(z, reuse=False)
    fake = tf.concat(fake_set, 0)
    r_logit = discriminator(real, reuse=False)
    f_logit = discriminator(fake)

    d_loss_real = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=r_logit,
                                                labels=tf.ones_like(r_logit)))
    d_loss_fake = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=f_logit,
                                                labels=tf.zeros_like(f_logit)))
    d_loss = d_loss_real + 0.1 * d_loss_fake

    g_loss = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=f_logit,
                                                labels=tf.ones_like(f_logit)))

    g_loss = 10. * g_loss  #weight down real loss
    for i in range(len(fake_set)):
        onehot_labels = tf.one_hot(indices=tf.cast(
            tf.scalar_mul(i, tf.ones(batch_size)), tf.int32),
                                   depth=n_centroid)
        f_mean = encoder(fake_set[i])
        f_p = tf.nn.softmax(f_mean)
        # g_loss += .5*cond_entropy(f_p)
        g_loss += tf.reduce_mean(
            objectives.categorical_crossentropy(onehot_labels, f_p))
        # g_loss += cat_weight*tf.reduce_mean(tf.losses.softmax_cross_entropy(logits=f_l, onehot_labels=onehot_labels))

    # trainable variables for each network
    T_vars = tf.trainable_variables()
    en_var = [var for var in T_vars if var.name.startswith('discriminator')]
    # en_var = [var for var in T_vars if var.name.startswith('encoder')]
    g_var = [var for var in T_vars if var.name.startswith('generator')]
    dis_var = [var for var in T_vars if var.name.startswith('d_2')]

    #optimizer
    global_step = tf.Variable(0, name='global_step', trainable=False)
    d_step = optimizer(learning_rate=0.0002,
                       beta1=0.5).minimize(d_loss, var_list=dis_var)
    g_step = optimizer(learning_rate=5 * 0.0002,
                       beta1=0.5).minimize(g_loss, var_list=g_var)
    """ train """
    ''' init '''
    # session
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=1)
    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

    # saver
    saver = tf.train.Saver(max_to_keep=5)
    # summary writer
    # Send summary statistics to TensorBoard
    tf.summary.scalar('d_loss', d_loss)
    tf.summary.scalar('g_loss', g_loss)
    image_sets = generator(z, training=False)
    for img_set in image_sets:
        tf.summary.image('G_images', img_set, 12)

    merged = tf.summary.merge_all()
    logdir = dir + "/tensorboard"
    writer = tf.summary.FileWriter(logdir, sess.graph)
    print('Tensorboard dir: ' + logdir)

    # ''' initialization '''
    sess.run(tf.global_variables_initializer())
    ''' train '''
    batch_epoch = len(data_pool) // (batch_size)
    max_it = epoch * batch_epoch

    def cluster_acc(Y_pred, Y):
        from sklearn.utils.linear_assignment_ import linear_assignment
        assert Y_pred.size == Y.size
        D = max(Y_pred.max(), Y.max()) + 1
        w = np.zeros((D, D), dtype=np.int64)
        for i in range(Y_pred.size):
            w[Y_pred[i], Y[i]] += 1
        ind = linear_assignment(w.max() - w)
        return sum([w[i, j] for i, j in ind]) * 1.0 / Y_pred.size, w

    def gan_train(max_it, it_offset):
        print("GAN iteration: " + str(max_it))
        # total_it = it_offset + max_it
        for it in range(it_offset, it_offset + max_it):
            real_ipt, y = data_pool.batch(['img', 'label'])
            # z_ipt = np.random.normal(size=[batch_size, z_dim])
            # z_ipt = np.random.normal(size=[batch_size, z_dim])
            # if it%700 ==0 and it >0:
            #     global cat_weight_init
            #     cat_weight_init = min(0.7, 1.3*cat_weight_init)
            #     print('cat weight', cat_weight_init)
            _, _ = sess.run([d_step, g_step], feed_dict={real: real_ipt})
            if it % 10 == 0:
                summary = sess.run(merged, feed_dict={real: real_ipt})
                writer.add_summary(summary, it)
            if it % 1000 == 0:
                import utils
                i = 0
                for f in fake_set:
                    sample_imgs = sess.run(f)
                    # if normalize:
                    #     for i in range(len(sample_imgs)):
                    sample_imgs = sample_imgs * 2. - 1.
                    save_dir = dir + "/sample_imgs"
                    utils.mkdir(save_dir + '/')
                    # for imgs, name in zip(sample_imgs, list_of_names):
                    my_utils.saveSampleImgs(imgs=sample_imgs,
                                            full_path=save_dir + "/" +
                                            'sample-%d-%d.jpg' % (i, it),
                                            row=8,
                                            column=8)
                    i += 1

    total_it = 0
    try:
        ae_saver = tf.train.Saver(var_list=en_var)
        ae_saver.restore(sess, init_w)  # 0.73

        # dist = [0]*10
        predict_y = sess.run(predicts, feed_dict={real2: X[:2000]})
        acc = cluster_acc(predict_y, Y[:2000])
        print('Accuracy of clustering model: ', acc[0])
        # for i in predict_y:
        #     dist[i] += 1
        # print(np.array(dist)/float(2000))
        gan_train(max_it, 0)

    except Exception, e:
        traceback.print_exc()
예제 #14
0
train_data = sio.loadmat('../train_32x32.mat')

# access to the dict
x_train = train_data['X']
y_train = train_data['y']
x_train = x_train / 255.
x_train = x_train.transpose([3, 0, 1, 2])
# show sample
# print len(y_train)
# for i in range(10):
# 	plt.imshow(x_train[i])
# 	plt.show()
# 	print y_train[i]
# data_pool = my_utils.getFullMNISTDatapool(batch_size, shift=False) #range 0 ~ 1
import utils
data_pool = utils.MemoryData({'img': x_train, 'label': y_train}, batch_size)
# data_pool = my_utils.getFullFashion_MNISTDatapool(batch_size, shift=False)
# X,Y = my_utils.loadFullFashion_MNSIT(shift=False)
# X, Y = my_utils.load_data('mnist')
# X = np.reshape(X, [70000,28,28,1])
# num_data = 70000

# test_data = [[], [], [], [], [], [], [], [], [], []]
# colors =  ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'black', 'purple', 'pink', 'brown']
# plt.ion() # enables interactive mode
# for i, j in zip(X, Y):
#     if len(test_data[j]) < 100:
#         test_data[j].append(i)
# test_data_list = test_data[0]
# for i in range(1,10):
#     test_data_list = np.concatenate((test_data_list, test_data[i]))
def experiment(dec_init):
    """ param """
    epoch = 40
    batch_size = 64
    lr_dec = 0.002
    lr_gan = 0.0002
    beta1 = 0.5
    z_dim = 10
    n_centroid = 10
    original_dim =784

    # n_critic = 1 #
    # n_generator = 1
    gan_type="DEC+GAN+MNIST"
    dir="results/"+gan_type+"-"+datetime.datetime.now().strftime("%Y%m%d-%H%M%S")

    ''' dataset '''
    X, y = load_mnist()
    import utils
    data_pool = utils.MemoryData({'img': X, 'label':y}, batch_size)


    """ graphs """
    encoder = partial(models.encoder, z_dim = z_dim)
    decoder = models.decoder
    num_heads = 10
    generator = partial(models.generator_m2, heads=num_heads)
    discriminator = models.discriminator2
    # sampleing = models.sampleing
    optimizer = tf.train.AdamOptimizer

    with tf.variable_scope('kmean', reuse=False):
        tf.get_variable("u_p", [n_centroid, z_dim], dtype=tf.float32)

    # inputs
    real = tf.placeholder(tf.float32, shape=[batch_size, 28, 28, 1])
    real2 = tf.placeholder(tf.float32, shape=[None, 28, 28, 1])
    # encoder
    z_mean, _ = encoder(real, reuse=False)
    z_mean2, _ = encoder(real2)

    #=====================
    z = tf.random_normal(shape=(batch_size, z_dim),
                           mean=0, stddev=1, dtype=tf.float32)
    fake_set = generator(z, reuse=False)
    fake = tf.concat(fake_set, 0)
    r_logit = discriminator(real,reuse=False)
    f_logit = discriminator(fake)

    d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=r_logit, labels=tf.ones_like(r_logit)))
    d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=f_logit, labels=tf.zeros_like(f_logit)))
    d_loss = d_loss_real + (1./num_heads)*d_loss_fake
    g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=f_logit, labels=tf.ones_like(f_logit)))


    def compute_soft_assign(z):
        with tf.variable_scope('kmean', reuse=True):
            theta_p = tf.get_variable('u_p')
        q = 1.0 / (1.0 + (K.sum(K.square(K.expand_dims(z,dim=1) - theta_p), axis=2) / 1.))
        q **= (1. + 1.0) / 2.0
        q = K.transpose(K.transpose(q) / K.sum(q, axis=1))
        return q

    def target_distribution2(q):
        weight = q ** 1.5 / tf.reduce_sum(q, axis=0)
        return tf.transpose(tf.transpose(weight)/ tf.reduce_sum(q, axis=1))

    def KL(P,Q):
        return tf.reduce_sum(P * tf.log(P/Q), [0,1])

    q = compute_soft_assign(z_mean)
    # predicts = tf.argmax(q, axis=1)
    predicts2 = tf.argmax(compute_soft_assign(z_mean2), axis=1)
    # print('soft dist: ',q.shape)
    t = target_distribution2(q)
    # print('target dist: ',t.shape)
    KL_loss = KL(t, q)
    # beta = 0.01
    # KL_recon_loss = beta*KL_loss + recon_loss

    f_logit_set = []
    real_weight = tf.placeholder(tf.float32, shape=[])
    real_weight_init = 1.
    g_loss = 1.*g_loss #weight down real loss
    diversity_weight = tf.get_variable("diversity_term", [10], dtype=tf.float32)
    for i in range(len(fake_set)):
        onehot_labels = tf.one_hot(indices=tf.cast(tf.scalar_mul(i, tf.ones(batch_size)), tf.int32), depth=n_centroid)
        f_m, _ = encoder(fake_set[i])
        f_l = compute_soft_assign(f_m)
        g_loss += 1.*tf.reduce_mean(objectives.categorical_crossentropy(onehot_labels,f_l))

    # trainable variables for each network
    T_vars = tf.trainable_variables()
    en_var = [var for var in T_vars if var.name.startswith('encoder')]
    de_var = [var for var in T_vars if var.name.startswith('decoder')]
    kmean_var = [var for var in T_vars if var.name.startswith('kmean')]

    g_var = [var for var in T_vars if var.name.startswith('generator')]
    dis_var = [var for var in T_vars if var.name.startswith('discriminator')]


    #optimizer
    learning_rate = tf.placeholder(tf.float32, shape=[])
    global_step = tf.Variable(0, name='global_step',trainable=False)
    # ae_step = optimizer(learning_rate=learning_rate).minimize(recon_loss, var_list=en_var+de_var, global_step=global_step)
    kl_step = tf.train.MomentumOptimizer(learning_rate=lr_dec, momentum=0.9).minimize(KL_loss, var_list=kmean_var+en_var)

    d_step = optimizer(learning_rate=lr_gan, beta1=beta1).minimize(d_loss, var_list=dis_var)
    g_step = optimizer(learning_rate=lr_gan, beta1=beta1).minimize(g_loss, var_list=g_var)

    """ train """
    ''' init '''
    # session
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.6)
    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

    # saver
    saver = tf.train.Saver(max_to_keep=5)
    # summary writer
    # Send summary statistics to TensorBoard
    tf.summary.scalar('d_loss', d_loss)
    tf.summary.scalar('g_loss', g_loss)
    tf.summary.image('Real', real, 12)
    # tf.summary.image('Recon', x_hat, 12)


    image_sets = generator(z, training= False)
    for img_set in image_sets:
        tf.summary.image('G_images', img_set, 12)


    merged = tf.summary.merge_all()
    logdir = dir+"/tensorboard"
    writer = tf.summary.FileWriter(logdir, sess.graph)
    print('Tensorboard dir: '+logdir)

    # ''' initialization '''
    sess.run(tf.global_variables_initializer())

    def kmean_init():
        from sklearn.cluster import KMeans



        sample = sess.run(z_mean2, feed_dict={real2:X})
        kmeans = KMeans(n_clusters=n_centroid, n_init=20).fit(sample)

        with tf.variable_scope('kmean', reuse=True):

            u_p = tf.get_variable('u_p')

            return u_p.assign(kmeans.cluster_centers_)







    def training(max_it, it_offset):
        print("DEC iteration: " + str(max_it))
        for it in range(it_offset, it_offset + max_it):
            real_ipt, y = data_pool.batch(['img','label'])
            _ = sess.run([kl_step], feed_dict={real: real_ipt})


    def gan_train(max_it, it_offset):
        print("GAN iteration: " + str(max_it))

        for it in range(it_offset, it_offset + max_it):
            real_ipt, y = data_pool.batch(['img', 'label'])

            _, _ = sess.run([d_step,g_step], feed_dict={real: real_ipt, real_weight: real_weight_init})
            if it % 10 == 0:
                summary = sess.run(merged, feed_dict={real: real_ipt, real_weight: real_weight_init})
                writer.add_summary(summary, it)
            if it%1000 == 0:
                i = 0
                for f in fake_set:
                    sample_imgs = sess.run(f)

                    sample_imgs = sample_imgs * 2. - 1.
                    save_dir = dir + "/sample_imgs"
                    utils.mkdir(save_dir + '/')

                    my_utils.saveSampleImgs(imgs=sample_imgs, full_path=save_dir + "/" + 'sample-%d-%d.jpg' % (i,it), row=8,
                                            column=8)
                    i += 1
    total_it = 0
    try:
        batch_epoch = len(data_pool) // (batch_size)
        max_it = epoch * batch_epoch

        ae_saver = tf.train.Saver(var_list=en_var+de_var)
        # ae_saver.restore(sess, 'results/ae-20180411-193032/checkpoint/model.ckpt')
        ae_saver.restore(sess, dec_init) #ep100 SGD Momentum 0.94
        # ae_saver.restore(sess, 'results/ae-20180412-134727/checkpoint/model.ckpt')  # ep100 0.824
        #ae_saver.restore(sess,'results/ae-20180427-210832/checkpoint/model.ckpt') #0.62

        #dec training
        load_kmean = kmean_init()
        sess.run(load_kmean)
        #train 2 epochs
        training(2*batch_epoch,0)

        #measure dist
        predict_y = sess.run(predicts2, feed_dict={real2: X})
        acc = my_utils.cluster_acc(predict_y, y)
        print('Accuracy of clustering model: ', acc[0])

        #GAN training
        gan_train(max_it, 2*batch_epoch)

    except Exception, e:
        traceback.print_exc()