{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"from keras.layers import Input, Reshape ,Dropout, Dense, BatchNormalization,ZeroPadding2D,Flatten,Activation\nfrom keras.layers.advanced_activations import LeakyReLU\nfrom keras.layers.convolutional import UpSampling2D,Conv2D\nfrom keras.models import Sequential,Model,load_model\nfrom keras.optimizers import Adam\nimport numpy as np\nfrom PIL import Image\nfrom tqdm import tqdm\nimport os\n","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"# Generation resolution - Must be square \n# Training data is also scaled to this.\nGENERATE_RES=2 #(1=32,2=64,....)\nGENERATE_SQUARE=32*GENERATE_RES #will make up rows and columns of generated image...\nIMAGE_CHANNELS=3\n\n#PREVIEW IMAGE .....to see how our generator works...\nPREVIEW_ROWS=4\nPREVIEW_COLS=7\nPREVIEW_MARGIN=16\nSAVE_FREQ=100# for every 100 epochs....\n\n# Size vector to generate images from\nSEED_SIZE = 100\n\n#configuration\nDATA_PATH='../input/all-dogs'\nEPOCHS = 10000\nBATCH_SIZE = 32\n\nprint(f\"Will generate {GENERATE_SQUARE}px square images.\")\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Image set has 11,682 images.  Can take over an hour for initial preprocessing.\n# Because of this time needed, save a Numpy preprocessed file.\n# Note, that file is large enough to cause problems for sume verisons of Pickle,\n# so Numpy binary files are used.\n\ntraining_binary_path=os.path.join(DATA_PATH,f'training_data_{GENERATE_SQUARE}_{GENERATE_SQUARE}.npy')\n\nprint(f\"Looking for file: {training_binary_path}\")\n\nif not os.path.isfile(training_binary_path):  #returns True if the file shown by path exists...\n    print(\"loading training images\")\n    \n    training_data=[]\n    dogs_path=os.path.join(DATA_PATH,'all-dogs')\n    for filename in tqdm(os.listdir(dogs_path)):\n        path = os.path.join(dogs_path,filename)\n        image=Image.open(path).resize((GENERATE_SQUARE,GENERATE_SQUARE),Image.ANTIALIAS)\n        training_data.append(np.asarray(image))\n    training_data = np.reshape(training_data,(-1,GENERATE_SQUARE,GENERATE_SQUARE,IMAGE_CHANNELS))\n    training_data = training_data / 127.5 - 1.\n    \n#    print(\"Saving training image binary...\")      #good to save numpy file but here it dosent work because of read only system\n  #  np.save(training_binary_path,training_data)\n\nelse:\n    print(f\"loading previous binary file\")\n    training_data=np.load(training_binary_path)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def build_generator(SEED_SIZE,channels):\n    model=Sequential()\n    \n    model.add(Dense(4*4*256,activation='relu',input_dim=SEED_SIZE))\n    model.add(Reshape((4,4,256)))\n    \n    model.add(UpSampling2D())\n    model.add(Conv2D(256,kernel_size=3,padding=\"same\"))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(Activation('relu'))\n    \n    model.add(UpSampling2D())\n    model.add(Conv2D(256,kernel_size=3,padding=\"same\"))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(Activation('relu'))\n    \n    # Output resolution, additional upsampling\n    for i in range(GENERATE_RES):\n        model.add(UpSampling2D())\n        model.add(Conv2D(128,kernel_size=3,padding=\"same\"))\n        model.add(BatchNormalization(momentum=0.8))\n        model.add(Activation('relu'))\n        \n    # Final CNN layer\n    model.add(Conv2D(channels,kernel_size=3,padding=\"same\"))\n    model.add(Activation(\"tanh\"))\n    \n    input = Input(shape=(SEED_SIZE,))\n    generated_image = model(input)\n    \n    return Model(input,generated_image)\n\n\ndef build_discriminator(image_shape):\n    model=Sequential()\n    \n    model.add(Conv2D(32,kernel_size=3,strides=2,input_shape=image_shape,padding='same'))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    \n    model.add(Conv2D(64,kernel_size=3,strides=2,padding='same'))\n    model.add(ZeroPadding2D(padding=((0,1),(0,1))))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    \n    model.add(Conv2D(128, kernel_size=3, strides=2, padding=\"same\"))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    \n    model.add(Conv2D(256, kernel_size=3, strides=1, padding=\"same\"))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    \n    model.add(Conv2D(512, kernel_size=3, strides=1, padding=\"same\"))\n    model.add(BatchNormalization(momentum=0.8))\n    model.add(LeakyReLU(alpha=0.2))\n    model.add(Dropout(0.25))\n    \n    model.add(Flatten())\n    model.add(Dense(1, activation='sigmoid'))\n    \n    \n    input_image = Input(shape=image_shape)\n\n    validity = model(input_image)\n    return Model(input_image, validity)\n    \n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"image_shape = (GENERATE_SQUARE,GENERATE_SQUARE,IMAGE_CHANNELS)\noptimizer = Adam(1.5e-4,0.5) # learning rate and momentum adjusted from paper\n\ndiscriminator = build_discriminator(image_shape)\ndiscriminator.compile(loss=\"binary_crossentropy\",optimizer=optimizer,metrics=[\"accuracy\"])\n\ngenerator = build_generator(SEED_SIZE,IMAGE_CHANNELS)\n\nrandom_input = Input(shape=(SEED_SIZE,))\n\ngenerated_image = generator(random_input)\n\ndiscriminator.trainable = False\n\nvalidity = discriminator(generated_image)\n\ncombined = Model(random_input,validity)\ncombined.compile(loss=\"binary_crossentropy\",optimizer=optimizer,metrics=[\"accuracy\"])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\ny_real = np.ones((BATCH_SIZE,1))\ny_fake = np.zeros((BATCH_SIZE,1))\n\nfixed_seed = np.random.normal(0, 1, (PREVIEW_ROWS * PREVIEW_COLS, SEED_SIZE))\n\ncnt = 1\nfor epoch in range(EPOCHS):\n    idx = np.random.randint(0,training_data.shape[0],BATCH_SIZE)\n    x_real = training_data[idx]\n\n    # Generate some images\n    seed = np.random.normal(0,1,(BATCH_SIZE,SEED_SIZE))\n    x_fake = generator.predict(seed)\n\n    # Train discriminator on real and fake\n    discriminator_metric_real = discriminator.train_on_batch(x_real,y_real)\n    discriminator_metric_generated = discriminator.train_on_batch(x_fake,y_fake)\n    discriminator_metric = 0.5 * np.add(discriminator_metric_real,discriminator_metric_generated)\n    \n    # Train generator on Calculate losses\n    generator_metric = combined.train_on_batch(seed,y_real)\n    \n    print(f\"Epoch {epoch}, Discriminator accuarcy: {discriminator_metric[1]}, Generator accuracy: {generator_metric[1]}\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"seed = np.random.normal(0,1,(16,SEED_SIZE))\nx_predict= generator.predict(seed)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cnt=0\nf,ax = plt.subplots(4,4) \nf.subplots_adjust(0,0,3,3)#(left,bottom,vertical_distance b/w columns,)\nfor i in range(0,4,1):\n    for j in range(0,4,1):\n        ax[i,j].imshow(x_predict[cnt])\n        ax[i,j].axis('off')\n        cnt=cnt+1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DATA_PATH_OUTPUT='../output_images/'\nos.mkdir(DATA_PATH_OUTPUT)\nimport cv2\n\nfor i in range(10000):\n    x_predict=generator.predict(np.random.normal(0,1,(1,SEED_SIZE)))\n    path=os.path.join(DATA_PATH_OUTPUT,f'{i}.png')\n    cv2.imwrite(path,x_predict)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import shutil\nshutil.make_archive('images', 'zip', '../output_images')","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":{"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}