{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\nfrom keras.models import Sequential,Model,model_from_json\nfrom keras.layers import Dense,Input,concatenate\nfrom keras.layers import Reshape\nfrom keras.layers.core import Activation\nfrom keras.layers.normalization import BatchNormalization\nfrom keras.layers import UpSampling2D\nfrom keras.layers import Conv2D, MaxPooling2D, AveragePooling2D\nfrom keras.layers.core import Flatten\nfrom skimage.io import imread, imshow, imread_collection, concatenate_images\nfrom skimage.transform import resize\nimport numpy as np\nfrom keras.layers import Conv2DTranspose, LeakyReLU, Dropout\nimport keras.backend as k\nimport tensorflow as tf\nimport random\nimport keras\nfrom keras import optimizers\nimport skimage\nfrom matplotlib import pyplot as plt\nfrom tqdm import tqdm\nimport os\nimport xml.etree.ElementTree as ET \nfrom PIL import Image \nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ROOT_PATH = \"../input/\"\nIMG_PATH = \"../input/all-dogs/all-dogs\"\n\nseed = 42\nrandom.seed = seed\nnp.random.seed = seed\nbatch_size = 32\nimage_width = 64\nimage_height = 64\ninitial_image_width = 4\ninitial_image_height = 4\nimage_channels= 3\nepochs = 10000\ndis_train_epoch = 1\nrandom_noise_dim = 512","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_imgs = os.listdir(IMG_PATH)\nbreeds_list = os.listdir(ROOT_PATH + 'annotation/Annotation/') \nlen(list_imgs)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img = imread(IMG_PATH+\"/\"+list_imgs[0])\nplt.imshow(img)\nplt.show()\nimg_resized = resize(img, (image_width, image_height))\nplt.imshow(img_resized)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = np.zeros((25000, image_width, image_height, image_channels))\nprint(\"Loading images...\")\ni=0\nfor breed in breeds_list:\n    for dog in os.listdir(ROOT_PATH + 'annotation/Annotation/'+breed):\n        try:\n#             img = Image.open(IMG_PATH+\"/\"+dog+\".jpg\")\n            img = imread(IMG_PATH+\"/\"+dog+\".jpg\")\n        except:\n            continue\n        tree = ET.parse(ROOT_PATH+'annotation/Annotation/'+breed+'/'+dog)\n        root = tree.getroot()\n        objects = root.findall('object')\n        for o in objects:\n            bndbox = o.find('bndbox') \n            xmin = int(bndbox.find('xmin').text)\n            ymin = int(bndbox.find('ymin').text)\n            xmax = int(bndbox.find('xmax').text)\n            ymax = int(bndbox.find('ymax').text)\n            w = np.min((xmax - xmin, ymax - ymin))\n#             img2 = img.crop((xmin, ymin, xmin+w, ymin+w))\n#             img2 = img2.resize((64,64), Image.ANTIALIAS)\n            img2 = img[ymin:ymin+w, xmin:xmin+w, :image_channels]\n            img2 = resize(img2, (64,64), anti_aliasing=True)\n            X[i] = img2\n            i+=1\nprint(\"Done\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.imshow(X[5])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train = np.zeros((25000, image_width, image_height, image_channels))\nfor i in range(len(X)):\n    X_train[i] = X[i]/255","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train[3]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def generator():\n    noise_input=Input(shape=(random_noise_dim,))\n\n    generator_layer=Dense(64 * initial_image_height * initial_image_width)(noise_input)\n    generator_layer=BatchNormalization()(generator_layer)\n    generator_layer=Activation(\"relu\")(generator_layer)\n\n    if k.image_data_format() == \"channels_first\":\n        generator_layer=Reshape((64,initial_image_width,initial_image_height),input_shape=(64*initial_image_height*initial_image_width,))(generator_layer)\n        bn_axis = 1\n    else:\n        generator_layer=Reshape((initial_image_width,initial_image_height,64),input_shape=(64*initial_image_height*initial_image_width,))(generator_layer)\n        bn_axis = -1\n\n    generator_layer=Conv2DTranspose(32,kernel_size=5,strides=(1,1),padding='valid',use_bias='False')(generator_layer)\n    generator_layer=BatchNormalization(axis = bn_axis)(generator_layer)\n    generator_layer=LeakyReLU()(generator_layer)\n    \n    generator_layer=Conv2DTranspose(64,kernel_size=5,strides=(1,1),padding='valid',use_bias='False')(generator_layer)\n    generator_layer=BatchNormalization(axis = bn_axis)(generator_layer)\n    generator_layer=LeakyReLU()(generator_layer)\n\n    generator_layer=Conv2DTranspose(128,kernel_size=4,strides=(1,1),padding='valid',use_bias='False')(generator_layer)\n    generator_layer=BatchNormalization(axis = bn_axis)(generator_layer)\n    generator_layer=LeakyReLU()(generator_layer)\n\n    generator_layer=Conv2DTranspose(256,kernel_size=4,strides=(2,2),padding='valid',use_bias='False')(generator_layer)\n    generator_layer=BatchNormalization(axis = bn_axis)(generator_layer)\n    generator_layer=LeakyReLU()(generator_layer)\n    \n    generator_layer=Conv2DTranspose(3,kernel_size=2,strides=(2,2),padding='valid',use_bias='False')(generator_layer)\n    generator_layer=Activation(\"sigmoid\")(generator_layer)\n\n    model = Model([noise_input], [generator_layer])\n    \n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"gen = generator()\ngen.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def discriminator():\n    image_input=Input(shape=(image_height,image_width,3))\n\n    discriminator_layer=Conv2D(32,kernel_size=2,padding='same',use_bias='False')(image_input)\n    discriminator_layer=BatchNormalization()(discriminator_layer)\n    discriminator_layer=LeakyReLU()(discriminator_layer)\n    discriminator_layer = MaxPooling2D(pool_size=(2,2), strides = (2,2))(discriminator_layer)\n    discriminator_layer = Dropout(0.4)(discriminator_layer)\n\n\n    discriminator_layer=Conv2D(64,kernel_size=2,padding='same',use_bias='False')(discriminator_layer)\n    discriminator_layer=BatchNormalization()(discriminator_layer)\n    discriminator_layer=LeakyReLU()(discriminator_layer)\n    discriminator_layer = MaxPooling2D(pool_size=(2,2), strides = (2,2))(discriminator_layer)\n    discriminator_layer = Dropout(0.4)(discriminator_layer)\n\n\n    discriminator_layer=Conv2D(128,kernel_size=2,padding='same',use_bias='False')(discriminator_layer)\n    discriminator_layer=BatchNormalization()(discriminator_layer)\n    discriminator_layer=LeakyReLU()(discriminator_layer)\n    discriminator_layer = MaxPooling2D(pool_size=(2,2), strides = (2,2))(discriminator_layer)\n    discriminator_layer = Dropout(0.4)(discriminator_layer)\n    \n    discriminator_layer=Conv2D(128,kernel_size=2,padding='same',use_bias='False')(discriminator_layer)\n    discriminator_layer=BatchNormalization()(discriminator_layer)\n    discriminator_layer=LeakyReLU()(discriminator_layer)\n    discriminator_layer = MaxPooling2D(pool_size=(2,2), strides = (2,2))(discriminator_layer)\n    discriminator_layer = Dropout(0.4)(discriminator_layer)\n    \n    discriminator_layer=Flatten()(discriminator_layer)\n\n    discriminator_layer=Dense(512)(discriminator_layer)\n    discriminator_layer=LeakyReLU()(discriminator_layer)\n\n    discriminator_layer=Dense(1)(discriminator_layer)\n    discriminator_layer=Activation(\"sigmoid\")(discriminator_layer)\n\n    model=Model([image_input],[discriminator_layer])\n\n    return model\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dis = discriminator()\ndis.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def adversarial_model(generator,discriminator):\n    discriminator.trainable = False\n    inputs = Input(shape=(random_noise_dim,))\n    generated_images = generator(inputs)\n    outputs = discriminator(generated_images)\n    model = Model(inputs = inputs,outputs = [outputs])\n    return model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"ad_model = adversarial_model(gen, dis)\nad_model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"gen_opt = optimizers.SGD(lr = 0.001)\ndis_opt = optimizers.SGD(lr = 0.0001)\n\ndis.trainable = True\ndis.compile(optimizer=dis_opt, loss=\"binary_crossentropy\")\ndis.trainable = False\n\n# losses = {\"model_1\":keras.losses.mean_absolute_error,\"model_2\":keras.losses.binary_crossentropy}\n# loss_weights = {\"model_1\":1.0, \"model_2\":1.0}\nad_model.compile(optimizer=gen_opt, loss=\"binary_crossentropy\")\ndis.trainable = True\n\noutput_true_batch, output_false_batch = np.ones((batch_size, 1)), np.zeros((batch_size, 1))\ne = 0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"while e < epochs:\n    print('epoch: {}/{}'.format(e, epochs))\n    print('batches: {}'.format(X_train.shape[0] // batch_size))\n\n    dis_losses = []\n    ad_losses = []\n    dis_loss_fake = 0.0\n    dis_loss_real = 0.0\n\n    for index in range(X_train.shape[0] // batch_size):\n        if (index+1) * batch_size <= X_train.shape[0]:\n            train_images = X_train[index*batch_size:(index+1)*batch_size]\n            noise = np.random.random_sample(size=(batch_size,random_noise_dim))\n            \n            noise_prop = 0.05 # Randomly flip 5% of labels\n    \n            false_labels = np.zeros((batch_size, 1)) + np.random.uniform(low=0.0, high=0.1, size=(batch_size, 1))\n            flipped_idx = np.random.choice(np.arange(len(false_labels)), size=int(noise_prop*len(false_labels)))\n            false_labels[flipped_idx] = 1 - false_labels[flipped_idx]\n            \n            true_labels = np.ones((batch_size, 1)) - np.random.uniform(low=0.0, high=0.1, size=(batch_size, 1))\n            flipped_idx = np.random.choice(np.arange(len(true_labels)), size=int(noise_prop*len(true_labels)))\n            true_labels[flipped_idx] = 1 - true_labels[flipped_idx]\n\n            generated_images = gen.predict(noise, batch_size=batch_size)\n            \n            if e < 50:\n                dis_train_epoch = 1\n            else:\n                dis_train_epoch = 1\n\n            for _ in range(dis_train_epoch):\n                dis_loss_fake = dis.train_on_batch(generated_images,output_false_batch)\n                dis_loss_real = dis.train_on_batch(train_images, output_true_batch)\n                \n                dis_losses.append(0.5 * np.add(dis_loss_fake, dis_loss_real))\n\n#             print(\"dis_fake_out\", np.transpose(np.array(dis_model.predict([train_text,generated_images]))))\n#             print(\"dis_real_out\", np.transpose(np.array(dis_model.predict([train_text,train_images]))))\n\n#             print('batch {} dis_loss_mean : {}, dis_loss_fake: {}, dis_loss_real: {}'.format(index+1, np.mean(dis_losses), dis_loss_fake, dis_loss_real))\n\n            dis.trainable = False\n            ad_loss = ad_model.train_on_batch(noise,output_true_batch)\n#             _,ad_out = ad_model.predict(noise)\n            ad_losses.append(ad_loss)\n\n#             print('batch {} ad_loss : {}'.format(index+1, ad_loss))\n#             print(\"ad_out: \",np.transpose(np.array(ad_out)))\n\n            dis.trainable = True\n#             dis_losses = []\n#             ad_losses = []\n        else:\n            break\n    print('dis_loss_fake: {}, dis_loss_real: {}'.format(dis_loss_fake, dis_loss_real))\n    print('loss: epoch: {} - dis_loss_mean: {} - ad_loss: {}\\n'.format(e, np.mean(dis_losses), np.mean(ad_losses)))\n    dis_losses = []\n    ad_losses = []\n\n#     if e%20==0: \n#         gen_model_json = gen.to_json()\n#         dis_model_json = dis.to_json()\n#         with open(\"gen_model.json\", \"w\") as json_file:\n#             json_file.write(gen_model_json)\n#             gen.save_weights(\"gen_model_weights.h5\")\n#             print(\"gen_model saved model to disk\")\n#         with open(\"dis_model.json\", \"w\") as json_file:\n#             json_file.write(dis_model_json)\n#             dis.save_weights(\"dis_model_weights.h5\")\n#             print(\"dis_model saved model to disk\")\n\n        # noise = np.random.random_sample(size=(batch_size,noise_dim))\n    if e%5 == 0:\n        noise = np.random.random_sample(size=(batch_size,random_noise_dim))\n        img = gen.predict(noise)\n        #np.reshape(img,(128,128,3,-1))\n        img = img[0] * 255\n#         img = Image.fromarray( img.astype('uint8') )\n        plt.imshow(img)\n        plt.title('my picture')\n        plt.show()\n        \n    e+=1\n\n\n# gen_model_json = gen.to_json()\n# dis_model_json = dis.to_json()\n# with open(\"gen_model.json\", \"w\") as json_file:\n#     json_file.write(gen_model_json)\n#     gen.save_weights(\"gen_model_weights.h5\")\n#     print(\"gen_model saved model to disk\")\n# with open(\"dis_model.json\", \"w\") as json_file:\n#     json_file.write(dis_model_json)\n#     dis.save_weights(\"dis_model_weights.h5\")\n#     print(\"dis_model saved model to disk\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"noise = np.random.random_sample(size=(1,random_noise_dim))\nimg = gen.predict(noise)\nplt.imshow(img[0]*255)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}