{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport tensorflow as tf\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport cv2\nimport scipy.misc\nfrom utils import *\n\nslim = tf.contrib.slim","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"HEIGHT, WIDTH, CHANNEL = 128, 128, 3\nBATCH_SIZE = 64\nEPOCH = 300\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def lrelu(x, n, leak=0.2):\n    return tf.maximum(x, leak * x, name=n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# loading and modifying the data\ndef process_data():\n    root_dir_name = '../input/flowers/flowers/daisy'\n    daisies = []\n    for each in os.listdir(root_dir_name):\n        daisies.append(f'{root_dir_name}/{each}')\n    \n    all_images = tf.convert_to_tensor(daisies, dtype=tf.string)\n    images_queue = tf.train.slice_input_producer(\n                                        [all_images])\n    content = tf.read_file(images_queue[0])\n    image = tf.image.decode_jpeg(content, channels = CHANNEL)\n    \n    # modify images a bit\n    image = tf.image.random_flip_left_right(image)\n    image = tf.image.random_brightness(image, max_delta = 0.1)\n    image = tf.image.random_contrast(image, lower = 0.9, upper = 1.1)\n    \n    # resize to (128 x 128 x 3)\n    size = [HEIGHT, WIDTH]\n    image = tf.image.resize_images(image, size)\n    image.set_shape([HEIGHT,WIDTH,CHANNEL])\n    \n    print(image.get_shape())\n    \n    image = tf.cast(image, tf.float32)\n    image = image / 255.0\n    \n    iamges_batch = tf.train.shuffle_batch(\n                                    [image], batch_size = BATCH_SIZE,\n                                    num_threads = 4, capacity = 200 + 3* BATCH_SIZE,\n                                    min_after_dequeue = 200)\n    num_images = len(daisies)\n\n    return iamges_batch, num_images\n    \n    \nprint((process_data()))\n#process_data()   ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tf.reset_default_graph()\n\n# generator\ndef generator(input, random_dim, is_train, reuse=None):\n    c4, c8, c16, c32, c64 = 512, 256, 128, 64, 32 # channel num\n    s4 = 4\n    output_dim = CHANNEL  # RGB image\n    with tf.variable_scope('gen') as scope:\n        if reuse:\n            scope.reuse_variables()\n        w1 = tf.get_variable('w1', shape=[random_dim, s4 * s4 * c4], dtype=tf.float32,\n                             initializer=tf.truncated_normal_initializer(stddev=0.02))\n        b1 = tf.get_variable('b1', shape=[c4 * s4 * s4], dtype=tf.float32,\n                             initializer=tf.constant_initializer(0.0))\n        flat_conv1 = tf.add(tf.matmul(input, w1), b1, name='flat_conv1')\n         #Convolution, bias, activation, repeat! \n        conv1 = tf.reshape(flat_conv1, shape=[-1, s4, s4, c4], name='conv1')\n        bn1 = tf.contrib.layers.batch_norm(conv1, is_training=is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope='bn1')\n        act1 = tf.nn.relu(bn1, name='act1')\n        # 8*8*256\n        #Convolution, bias, activation, repeat! \n        conv2 = tf.layers.conv2d_transpose(act1, c8, kernel_size=[5, 5], strides=[2, 2], padding=\"SAME\",\n                                           kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),\n                                           name='conv2')\n        bn2 = tf.contrib.layers.batch_norm(conv2, is_training=is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope='bn2')\n        act2 = tf.nn.relu(bn2, name='act2')\n        # 16*16*128\n        conv3 = tf.layers.conv2d_transpose(act2, c16, kernel_size=[5, 5], strides=[2, 2], padding=\"SAME\",\n                                           kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),\n                                           name='conv3')\n        bn3 = tf.contrib.layers.batch_norm(conv3, is_training=is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope='bn3')\n        act3 = tf.nn.relu(bn3, name='act3')\n        # 32*32*64\n        conv4 = tf.layers.conv2d_transpose(act3, c32, kernel_size=[5, 5], strides=[2, 2], padding=\"SAME\",\n                                           kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),\n                                           name='conv4')\n        bn4 = tf.contrib.layers.batch_norm(conv4, is_training=is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope='bn4')\n        act4 = tf.nn.relu(bn4, name='act4')\n        # 64*64*32\n        conv5 = tf.layers.conv2d_transpose(act4, c64, kernel_size=[5, 5], strides=[2, 2], padding=\"SAME\",\n                                           kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),\n                                           name='conv5')\n        bn5 = tf.contrib.layers.batch_norm(conv5, is_training=is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope='bn5')\n        act5 = tf.nn.relu(bn5, name='act5')\n        \n        #128*128*3\n        conv6 = tf.layers.conv2d_transpose(act5, output_dim, kernel_size=[5, 5], strides=[2, 2], padding=\"SAME\",\n                                           kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),\n                                           name='conv6')\n        # bn6 = tf.contrib.layers.batch_norm(conv6, is_training=is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope='bn6')\n        act6 = tf.nn.tanh(conv6, name='act6')\n        return act6\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# discriminator\n\ndef discriminator(input, is_train, reuse=None):\n    c2, c4, c8, c16 = 64, 128, 256, 512  # channel num: 64, 128, 256, 512\n    with tf.variable_scope('dis') as scope:\n        if reuse:\n            scope.reuse_variables()\n\n        #Convolution, activation, bias, repeat! \n        conv1 = tf.layers.conv2d(input, c2, kernel_size=[5, 5], strides=[2, 2], padding=\"SAME\",\n                                 kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),\n                                 name='conv1')\n        bn1 = tf.contrib.layers.batch_norm(conv1, is_training = is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope = 'bn1')\n        act1 = lrelu(conv1, n='act1')\n         #Convolution, activation, bias, repeat! \n        conv2 = tf.layers.conv2d(act1, c4, kernel_size=[5, 5], strides=[2, 2], padding=\"SAME\",\n                                 kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),\n                                 name='conv2')\n        bn2 = tf.contrib.layers.batch_norm(conv2, is_training=is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope='bn2')\n        act2 = lrelu(bn2, n='act2')\n        #Convolution, activation, bias, repeat! \n        conv3 = tf.layers.conv2d(act2, c8, kernel_size=[5, 5], strides=[2, 2], padding=\"SAME\",\n                                 kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),\n                                 name='conv3')\n        bn3 = tf.contrib.layers.batch_norm(conv3, is_training=is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope='bn3')\n        act3 = lrelu(bn3, n='act3')\n         #Convolution, activation, bias, repeat! \n        conv4 = tf.layers.conv2d(act3, c16, kernel_size=[5, 5], strides=[2, 2], padding=\"SAME\",\n                                 kernel_initializer=tf.truncated_normal_initializer(stddev=0.02),\n                                 name='conv4')\n        bn4 = tf.contrib.layers.batch_norm(conv4, is_training=is_train, epsilon=1e-5, decay = 0.9,  updates_collections=None, scope='bn4')\n        act4 = lrelu(bn4, n='act4')\n       \n        # start from act4\n        dim = int(np.prod(act4.get_shape()[1:]))\n        fc1 = tf.reshape(act4, shape=[-1, dim], name='fc1')\n      \n        \n        w2 = tf.get_variable('w2', shape=[fc1.shape[-1], 1], dtype=tf.float32,\n                             initializer=tf.truncated_normal_initializer(stddev=0.02))\n        b2 = tf.get_variable('b2', shape=[1], dtype=tf.float32,\n                             initializer=tf.constant_initializer(0.0))\n\n        # wgan just get rid of the sigmoid\n        logits = tf.add(tf.matmul(fc1, w2), b2, name='logits')\n        # dcgan\n        acted_out = tf.nn.sigmoid(logits)\n        return logits #, acted_out\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"samples = []\n\n# the training ...\ndef train():\n    random_dim = 100\n    \n    with tf.variable_scope('input'):\n        #real and fake image placholders\n        real_image = tf.placeholder(tf.float32, shape = [None, HEIGHT, WIDTH, CHANNEL], name='real_image')\n        random_input = tf.placeholder(tf.float32, shape=[None, random_dim], name='rand_input')\n        is_train = tf.placeholder(tf.bool, name='is_train')\n    \n    # wgan\n    #tf.reset_default_graph()\n    fake_image = generator(random_input, random_dim, is_train)\n    \n    real_result = discriminator(real_image, is_train)\n    fake_result = discriminator(fake_image, is_train, reuse=True)\n    \n    d_loss = tf.reduce_mean(fake_result) - tf.reduce_mean(real_result)  # This optimizes the discriminator.\n    g_loss = -tf.reduce_mean(fake_result)  # This optimizes the generator.\n            \n\n    t_vars = tf.trainable_variables()\n    d_vars = [var for var in t_vars if 'dis' in var.name]\n    g_vars = [var for var in t_vars if 'gen' in var.name]\n    trainer_d = tf.train.RMSPropOptimizer(learning_rate=2e-4).minimize(d_loss, var_list=d_vars)\n    trainer_g = tf.train.RMSPropOptimizer(learning_rate=2e-4).minimize(g_loss, var_list=g_vars)\n    # clip discriminator weights\n    d_clip = [v.assign(tf.clip_by_value(v, -0.01, 0.01)) for v in d_vars]\n\n    \n    batch_size = BATCH_SIZE\n    image_batch, samples_num = process_data()\n    \n    batch_num = int(samples_num / batch_size)\n    total_batch = 0\n    sess = tf.Session()\n    #saver = tf.train.Saver()\n    sess.run(tf.global_variables_initializer())\n    sess.run(tf.local_variables_initializer())\n    # continue training\n    #save_path = saver.save(sess, \"/tmp/model.ckpt\")\n    #ckpt = tf.train.latest_checkpoint('./model/' + version)\n    #saver.restore(sess, save_path)\n    coord = tf.train.Coordinator()\n    threads = tf.train.start_queue_runners(sess=sess, coord=coord)\n\n    print('total training sample num:%d' % samples_num)\n    print('batch size: %d, batch num per epoch: %d, epoch num: %d' % (batch_size, batch_num, EPOCH))\n    print('start training...')\n    for i in range(EPOCH):\n        print(\"Running epoch {}/{}...\".format(i, EPOCH))\n        for j in range(batch_num):\n            #print(j)\n            d_iters = 5\n            g_iters = 1\n\n            train_noise = np.random.uniform(-1.0, 1.0, size=[batch_size, random_dim]).astype(np.float32)\n            for k in range(d_iters):\n                #print(k)\n                train_image = sess.run(image_batch)\n                #wgan clip weights\n                sess.run(d_clip)\n                \n                # Update the discriminator\n                _, dLoss = sess.run([trainer_d, d_loss],\n                                    feed_dict={random_input: train_noise, real_image: train_image, is_train: True})\n\n            # Update the generator\n            for k in range(g_iters):\n                # train_noise = np.random.uniform(-1.0, 1.0, size=[batch_size, random_dim]).astype(np.float32)\n                _, gLoss = sess.run([trainer_g, g_loss],\n                                    feed_dict={random_input: train_noise, is_train: True})\n\n            # print 'train:[%d/%d],d_loss:%f,g_loss:%f' % (i, j, dLoss, gLoss)\n            \n        # save check point every 500 epoch\n#         if i%500 == 0:\n#             if not os.path.exists('./model/' + version):\n#                 os.makedirs('./model/' + version)\n#             saver.save(sess, './model/' +version + '/' + str(i))  \n        if i%50 == 0:\n            # save images\n#             if not os.path.exists(newPoke_path):\n#                 os.makedirs(newPoke_path)\n            sample_noise = np.random.uniform(-1.0, 1.0, size=[batch_size, random_dim]).astype(np.float32)\n            imgtest = sess.run(fake_image, feed_dict={random_input: sample_noise, is_train: False})\n            # imgtest = imgtest * 255.0\n            # imgtest.astype(np.uint8)\n            # save_images(imgtest, [8,8] ,newPoke_path + '/epoch' + str(i) + '.jpg')\n            samples.append(imgtest)\n            print('train:[%d],d_loss:%f,g_loss:%f' % (i, dLoss, gLoss))\n    coord.request_stop()\n    coord.join(threads)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"if __name__ == \"__main__\":\n    train()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(samples.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(len(samples))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for x in samples:\n    plt.imshow(x[0])\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.1"}},"nbformat":4,"nbformat_minor":1}