From 3ae3e02e590bb094d045f89bbd51fbc3b58d6f4f Mon Sep 17 00:00:00 2001 From: "Harle, Antoine (Contracteur)" Date: Fri, 8 Nov 2019 11:28:06 -0500 Subject: [PATCH] Initial Commit --- .gitignore | 46 ++ FAR-HO/augmentation_transforms.py | 456 +++++++++++ FAR-HO/blue_utils.py | 131 +++ FAR-HO/far_pba_cifar.py | 166 ++++ FAR-HO/test.py | 92 +++ FAR-HO/test_cnn.py | 126 +++ FAR-HO/test_cnn_aug.py | 141 ++++ FAR-HO/test_fc.py | 133 +++ .../.gitignore | 5 + .../20190929-paper.pdf | Bin 0 -> 912289 bytes .../README.md | 33 + .../data_aug.py | 244 ++++++ .../dataset_aug.py | 52 ++ .../dataset_aug_v2.py | 150 ++++ .../graph/graph | 5 + .../graph/graph.svg | 19 + .../hyperopt.py | 345 ++++++++ .../hyperopt_v2.py | 296 +++++++ .../main.py | 182 +++++ .../requirements.txt | 5 + .../tests.py | 344 ++++++++ higher/dataug.py | 583 +++++++++++++ higher/model.py | 51 ++ ...-LeNet)-100 epochs (dataug:0)- 0 in_it.png | Bin 0 -> 48634 bytes ...LeNet)-100 epochs (dataug:0)- 10 in_it.png | Bin 0 -> 120470 bytes ...LeNet)-100 epochs (dataug:-1)- 0 in_it.png | Bin 0 -> 46073 bytes ...eNet)-100 epochs (dataug:-1)- 10 in_it.png | Bin 0 -> 56113 bytes ...LeNet)-200 epochs (dataug:0)- 10 in_it.png | Bin 0 -> 66795 bytes higher/res/LeNet-100 epochs.png | Bin 0 -> 40948 bytes ...ug(Mag-1 TF)-LeNet)-10 epochs- 1 in_it.png | Bin 0 -> 48283 bytes ...g(Mag-1 TF)-LeNet)-10 epochs- 10 in_it.png | Bin 0 -> 40977 bytes ...(Exact-3 TF)-LeNet)-10 epochs- 1 in_it.png | Bin 0 -> 42239 bytes ...Exact-3 TF)-LeNet)-10 epochs- 10 in_it.png | Bin 0 -> 49236 bytes ...ix 0,5-3 TF)-LeNet)-10 epochs- 1 in_it.png | Bin 0 -> 49402 bytes ...x 0,5-3 TF)-LeNet)-10 epochs- 10 in_it.png | Bin 0 -> 49525 bytes ...ix 1,0-3 TF)-LeNet)-10 epochs- 1 in_it.png | Bin 0 -> 48961 bytes ...x 1,0-3 TF)-LeNet)-10 epochs- 10 in_it.png | Bin 0 -> 51727 bytes ...niform-3 TF)-LeNet)-10 epochs- 1 in_it.png | Bin 0 -> 47411 bytes ...iform-3 TF)-LeNet)-10 epochs- 10 in_it.png | Bin 0 -> 54378 bytes higher/res/MNIST/LeNet-10 epochs.png | Bin 0 -> 43318 bytes higher/test_dataug.py | 764 ++++++++++++++++++ higher/test_lr.py | 150 ++++ higher/transformations.py | 205 +++++ higher/utils.py | 184 +++++ 44 files changed, 4908 insertions(+) create mode 100644 .gitignore create mode 100755 FAR-HO/augmentation_transforms.py create mode 100644 FAR-HO/blue_utils.py create mode 100644 FAR-HO/far_pba_cifar.py create mode 100644 FAR-HO/test.py create mode 100644 FAR-HO/test_cnn.py create mode 100644 FAR-HO/test_cnn_aug.py create mode 100644 FAR-HO/test_fc.py create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/.gitignore create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/20190929-paper.pdf create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/README.md create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/data_aug.py create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/dataset_aug.py create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/dataset_aug_v2.py create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/graph/graph create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/graph/graph.svg create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/hyperopt.py create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/hyperopt_v2.py create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/main.py create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/requirements.txt create mode 100644 Gradient-Descent-The-Ultimate-Optimizer/tests.py create mode 100644 higher/dataug.py create mode 100644 higher/model.py create mode 100644 higher/res/Aug_mod(Data_augV4(Uniform-11 TF)-LeNet)-100 epochs (dataug:0)- 0 in_it.png create mode 100644 higher/res/Aug_mod(Data_augV4(Uniform-11 TF)-LeNet)-100 epochs (dataug:0)- 10 in_it.png create mode 100644 higher/res/Aug_mod(Data_augV4(Uniform-3 TF)-LeNet)-100 epochs (dataug:-1)- 0 in_it.png create mode 100644 higher/res/Aug_mod(Data_augV4(Uniform-3 TF)-LeNet)-100 epochs (dataug:-1)- 10 in_it.png create mode 100644 higher/res/Aug_mod(Data_augV4(Uniform-3 TF)-LeNet)-200 epochs (dataug:0)- 10 in_it.png create mode 100644 higher/res/LeNet-100 epochs.png create mode 100644 higher/res/MNIST/Aug_mod(Data_aug(Mag-1 TF)-LeNet)-10 epochs- 1 in_it.png create mode 100644 higher/res/MNIST/Aug_mod(Data_aug(Mag-1 TF)-LeNet)-10 epochs- 10 in_it.png create mode 100644 higher/res/MNIST/Aug_mod(Data_augV2(Exact-3 TF)-LeNet)-10 epochs- 1 in_it.png create mode 100644 higher/res/MNIST/Aug_mod(Data_augV2(Exact-3 TF)-LeNet)-10 epochs- 10 in_it.png create mode 100644 higher/res/MNIST/Aug_mod(Data_augV3(Mix 0,5-3 TF)-LeNet)-10 epochs- 1 in_it.png create mode 100644 higher/res/MNIST/Aug_mod(Data_augV3(Mix 0,5-3 TF)-LeNet)-10 epochs- 10 in_it.png create mode 100644 higher/res/MNIST/Aug_mod(Data_augV3(Mix 1,0-3 TF)-LeNet)-10 epochs- 1 in_it.png create mode 100644 higher/res/MNIST/Aug_mod(Data_augV3(Mix 1,0-3 TF)-LeNet)-10 epochs- 10 in_it.png create mode 100644 higher/res/MNIST/Aug_mod(Data_augV3(Uniform-3 TF)-LeNet)-10 epochs- 1 in_it.png create mode 100644 higher/res/MNIST/Aug_mod(Data_augV3(Uniform-3 TF)-LeNet)-10 epochs- 10 in_it.png create mode 100644 higher/res/MNIST/LeNet-10 epochs.png create mode 100644 higher/test_dataug.py create mode 100644 higher/test_lr.py create mode 100644 higher/transformations.py create mode 100644 higher/utils.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9d38ecc --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +/higher/data +/Gradient-Descent-The-Ultimate-Optimizer/data +/FAR-HO/data +/__pycache__ + +*.pyo +*.pyc +*~ + +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Logs and databases # +###################### +*.log +*.sql +*.sqlite + +# OS generated files # +###################### +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db diff --git a/FAR-HO/augmentation_transforms.py b/FAR-HO/augmentation_transforms.py new file mode 100755 index 0000000..ef17188 --- /dev/null +++ b/FAR-HO/augmentation_transforms.py @@ -0,0 +1,456 @@ +# Copyright 2018 The TensorFlow Authors All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +"""Transforms used in the Augmentation Policies.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import inspect +import random +import numpy as np +# pylint:disable=g-multiple-import +from PIL import ImageOps, ImageEnhance, ImageFilter, Image +# pylint:enable=g-multiple-import + + +IMAGE_SIZE = 28 +# What is the dataset mean and std of the images on the training set +MEANS = [0.49139968, 0.48215841, 0.44653091] +STDS = [0.24703223, 0.24348513, 0.26158784] +PARAMETER_MAX = 10 # What is the max 'level' a transform could be predicted + + +def random_flip(x): + """Flip the input x horizontally with 50% probability.""" + if np.random.rand(1)[0] > 0.5: + return np.fliplr(x) + return x + + +def zero_pad_and_crop(img, amount=4): + """Zero pad by `amount` zero pixels on each side then take a random crop. + + Args: + img: numpy image that will be zero padded and cropped. + amount: amount of zeros to pad `img` with horizontally and verically. + + Returns: + The cropped zero padded img. The returned numpy array will be of the same + shape as `img`. + """ + padded_img = np.zeros((img.shape[0] + amount * 2, img.shape[1] + amount * 2, + img.shape[2])) + padded_img[amount:img.shape[0] + amount, amount: + img.shape[1] + amount, :] = img + top = np.random.randint(low=0, high=2 * amount) + left = np.random.randint(low=0, high=2 * amount) + new_img = padded_img[top:top + img.shape[0], left:left + img.shape[1], :] + return new_img + + +def create_cutout_mask(img_height, img_width, num_channels, size): + """Creates a zero mask used for cutout of shape `img_height` x `img_width`. + + Args: + img_height: Height of image cutout mask will be applied to. + img_width: Width of image cutout mask will be applied to. + num_channels: Number of channels in the image. + size: Size of the zeros mask. + + Returns: + A mask of shape `img_height` x `img_width` with all ones except for a + square of zeros of shape `size` x `size`. This mask is meant to be + elementwise multiplied with the original image. Additionally returns + the `upper_coord` and `lower_coord` which specify where the cutout mask + will be applied. + """ + assert img_height == img_width + + # Sample center where cutout mask will be applied + height_loc = np.random.randint(low=0, high=img_height) + width_loc = np.random.randint(low=0, high=img_width) + + # Determine upper right and lower left corners of patch + upper_coord = (max(0, height_loc - size // 2), max(0, width_loc - size // 2)) + lower_coord = (min(img_height, height_loc + size // 2), + min(img_width, width_loc + size // 2)) + mask_height = lower_coord[0] - upper_coord[0] + mask_width = lower_coord[1] - upper_coord[1] + assert mask_height > 0 + assert mask_width > 0 + + mask = np.ones((img_height, img_width, num_channels)) + zeros = np.zeros((mask_height, mask_width, num_channels)) + mask[upper_coord[0]:lower_coord[0], upper_coord[1]:lower_coord[1], :] = ( + zeros) + return mask, upper_coord, lower_coord + + +def cutout_numpy(img, size=16): + """Apply cutout with mask of shape `size` x `size` to `img`. + + The cutout operation is from the paper https://arxiv.org/abs/1708.04552. + This operation applies a `size`x`size` mask of zeros to a random location + within `img`. + + Args: + img: Numpy image that cutout will be applied to. + size: Height/width of the cutout mask that will be + + Returns: + A numpy tensor that is the result of applying the cutout mask to `img`. + """ + img_height, img_width, num_channels = (img.shape[0], img.shape[1], + img.shape[2]) + assert len(img.shape) == 3 + mask, _, _ = create_cutout_mask(img_height, img_width, num_channels, size) + return img * mask + + +def float_parameter(level, maxval): + """Helper function to scale `val` between 0 and maxval . + + Args: + level: Level of the operation that will be between [0, `PARAMETER_MAX`]. + maxval: Maximum value that the operation can have. This will be scaled + to level/PARAMETER_MAX. + + Returns: + A float that results from scaling `maxval` according to `level`. + """ + return float(level) * maxval / PARAMETER_MAX + + +def int_parameter(level, maxval): + """Helper function to scale `val` between 0 and maxval . + + Args: + level: Level of the operation that will be between [0, `PARAMETER_MAX`]. + maxval: Maximum value that the operation can have. This will be scaled + to level/PARAMETER_MAX. + + Returns: + An int that results from scaling `maxval` according to `level`. + """ + return int(level * maxval / PARAMETER_MAX) + + +def pil_wrap(img): + """Convert the `img` numpy tensor to a PIL Image.""" + return Image.fromarray( + np.uint8((img * STDS + MEANS) * 255.0)).convert('RGBA') + + +def pil_unwrap(pil_img): + """Converts the PIL img to a numpy array.""" + pic_array = (np.array(pil_img.getdata()).reshape((IMAGE_SIZE, IMAGE_SIZE, 4)) / 255.0) + i1, i2 = np.where(pic_array[:, :, 3] == 0) + pic_array = (pic_array[:, :, :3] - MEANS) / STDS + pic_array[i1, i2] = [0, 0, 0] + return pic_array + + +def apply_policy(policy, img): + """Apply the `policy` to the numpy `img`. + + Args: + policy: A list of tuples with the form (name, probability, level) where + `name` is the name of the augmentation operation to apply, `probability` + is the probability of applying the operation and `level` is what strength + the operation to apply. + img: Numpy image that will have `policy` applied to it. + + Returns: + The result of applying `policy` to `img`. + """ + #print('img shape :',img.shape) + #print('Policy len :',len(policy)) + pil_img = pil_wrap(img) + for xform in policy: + #print('xform :', len(xform)) + assert len(xform) == 3 + name, probability, level = xform + #xform_fn = NAME_TO_TRANSFORM[name].pil_transformer(probability, level) + xform_fn = NAME_TO_TRANSFORM[name].pil_transformer(probability.eval(), level) + pil_img = xform_fn(pil_img) + return pil_unwrap(pil_img) + + +class TransformFunction(object): + """Wraps the Transform function for pretty printing options.""" + + def __init__(self, func, name): + self.f = func + self.name = name + + def __repr__(self): + return '<' + self.name + '>' + + def __call__(self, pil_img): + return self.f(pil_img) + + +class TransformT(object): + """Each instance of this class represents a specific transform.""" + + def __init__(self, name, xform_fn): + self.name = name + self.xform = xform_fn + + def pil_transformer(self, probability, level): + + def return_function(im): + if random.random() < probability: + im = self.xform(im, level) + return im + + name = self.name + '({:.1f},{})'.format(probability, level) + return TransformFunction(return_function, name) + + def do_transform(self, image, level): + f = self.pil_transformer(PARAMETER_MAX, level) + return pil_unwrap(f(pil_wrap(image))) + + +################## Transform Functions ################## +identity = TransformT('identity', lambda pil_img, level: pil_img) +flip_lr = TransformT( + 'FlipLR', + lambda pil_img, level: pil_img.transpose(Image.FLIP_LEFT_RIGHT)) +flip_ud = TransformT( + 'FlipUD', + lambda pil_img, level: pil_img.transpose(Image.FLIP_TOP_BOTTOM)) +# pylint:disable=g-long-lambda +auto_contrast = TransformT( + 'AutoContrast', + lambda pil_img, level: ImageOps.autocontrast( + pil_img.convert('RGB')).convert('RGBA')) +equalize = TransformT( + 'Equalize', + lambda pil_img, level: ImageOps.equalize( + pil_img.convert('RGB')).convert('RGBA')) +invert = TransformT( + 'Invert', + lambda pil_img, level: ImageOps.invert( + pil_img.convert('RGB')).convert('RGBA')) +# pylint:enable=g-long-lambda +blur = TransformT( + 'Blur', lambda pil_img, level: pil_img.filter(ImageFilter.BLUR)) +smooth = TransformT( + 'Smooth', + lambda pil_img, level: pil_img.filter(ImageFilter.SMOOTH)) + + +def _rotate_impl(pil_img, level): + """Rotates `pil_img` from -30 to 30 degrees depending on `level`.""" + degrees = int_parameter(level, 30) + if random.random() > 0.5: + degrees = -degrees + return pil_img.rotate(degrees) + + +rotate = TransformT('Rotate', _rotate_impl) + + +def _posterize_impl(pil_img, level): + """Applies PIL Posterize to `pil_img`.""" + level = int_parameter(level, 4) + return ImageOps.posterize(pil_img.convert('RGB'), 4 - level).convert('RGBA') + + +posterize = TransformT('Posterize', _posterize_impl) + + +def _shear_x_impl(pil_img, level): + """Applies PIL ShearX to `pil_img`. + + The ShearX operation shears the image along the horizontal axis with `level` + magnitude. + + Args: + pil_img: Image in PIL object. + level: Strength of the operation specified as an Integer from + [0, `PARAMETER_MAX`]. + + Returns: + A PIL Image that has had ShearX applied to it. + """ + level = float_parameter(level, 0.3) + if random.random() > 0.5: + level = -level + return pil_img.transform((IMAGE_SIZE, IMAGE_SIZE), Image.AFFINE, (1, level, 0, 0, 1, 0)) + + +shear_x = TransformT('ShearX', _shear_x_impl) + + +def _shear_y_impl(pil_img, level): + """Applies PIL ShearY to `pil_img`. + + The ShearY operation shears the image along the vertical axis with `level` + magnitude. + + Args: + pil_img: Image in PIL object. + level: Strength of the operation specified as an Integer from + [0, `PARAMETER_MAX`]. + + Returns: + A PIL Image that has had ShearX applied to it. + """ + level = float_parameter(level, 0.3) + if random.random() > 0.5: + level = -level + return pil_img.transform((IMAGE_SIZE, IMAGE_SIZE), Image.AFFINE, (1, 0, 0, level, 1, 0)) + + +shear_y = TransformT('ShearY', _shear_y_impl) + + +def _translate_x_impl(pil_img, level): + """Applies PIL TranslateX to `pil_img`. + + Translate the image in the horizontal direction by `level` + number of pixels. + + Args: + pil_img: Image in PIL object. + level: Strength of the operation specified as an Integer from + [0, `PARAMETER_MAX`]. + + Returns: + A PIL Image that has had TranslateX applied to it. + """ + level = int_parameter(level, 10) + if random.random() > 0.5: + level = -level + return pil_img.transform((IMAGE_SIZE, IMAGE_SIZE), Image.AFFINE, (1, 0, level, 0, 1, 0)) + + +translate_x = TransformT('TranslateX', _translate_x_impl) + + +def _translate_y_impl(pil_img, level): + """Applies PIL TranslateY to `pil_img`. + + Translate the image in the vertical direction by `level` + number of pixels. + + Args: + pil_img: Image in PIL object. + level: Strength of the operation specified as an Integer from + [0, `PARAMETER_MAX`]. + + Returns: + A PIL Image that has had TranslateY applied to it. + """ + level = int_parameter(level, 10) + if random.random() > 0.5: + level = -level + return pil_img.transform((IMAGE_SIZE, IMAGE_SIZE), Image.AFFINE, (1, 0, 0, 0, 1, level)) + + +translate_y = TransformT('TranslateY', _translate_y_impl) + + +def _crop_impl(pil_img, level, interpolation=Image.BILINEAR): + """Applies a crop to `pil_img` with the size depending on the `level`.""" + cropped = pil_img.crop((level, level, IMAGE_SIZE - level, IMAGE_SIZE - level)) + resized = cropped.resize((IMAGE_SIZE, IMAGE_SIZE), interpolation) + return resized + + +crop_bilinear = TransformT('CropBilinear', _crop_impl) + + +def _solarize_impl(pil_img, level): + """Applies PIL Solarize to `pil_img`. + + Translate the image in the vertical direction by `level` + number of pixels. + + Args: + pil_img: Image in PIL object. + level: Strength of the operation specified as an Integer from + [0, `PARAMETER_MAX`]. + + Returns: + A PIL Image that has had Solarize applied to it. + """ + level = int_parameter(level, 256) + return ImageOps.solarize(pil_img.convert('RGB'), 256 - level).convert('RGBA') + + +solarize = TransformT('Solarize', _solarize_impl) + + +def _cutout_pil_impl(pil_img, level): + """Apply cutout to pil_img at the specified level.""" + size = int_parameter(level, 20) + if size <= 0: + return pil_img + img_height, img_width, num_channels = (IMAGE_SIZE, IMAGE_SIZE, 3) + _, upper_coord, lower_coord = ( + create_cutout_mask(img_height, img_width, num_channels, size)) + pixels = pil_img.load() # create the pixel map + for i in range(upper_coord[0], lower_coord[0]): # for every col: + for j in range(upper_coord[1], lower_coord[1]): # For every row + pixels[i, j] = (125, 122, 113, 0) # set the colour accordingly + return pil_img + +cutout = TransformT('Cutout', _cutout_pil_impl) + + +def _enhancer_impl(enhancer): + """Sets level to be between 0.1 and 1.8 for ImageEnhance transforms of PIL.""" + def impl(pil_img, level): + v = float_parameter(level, 1.8) + .1 # going to 0 just destroys it + return enhancer(pil_img).enhance(v) + return impl + + +color = TransformT('Color', _enhancer_impl(ImageEnhance.Color)) +contrast = TransformT('Contrast', _enhancer_impl(ImageEnhance.Contrast)) +brightness = TransformT('Brightness', _enhancer_impl( + ImageEnhance.Brightness)) +sharpness = TransformT('Sharpness', _enhancer_impl(ImageEnhance.Sharpness)) + +ALL_TRANSFORMS = [ + flip_lr, + flip_ud, + auto_contrast, + equalize, + invert, + rotate, + posterize, + crop_bilinear, + solarize, + color, + contrast, + brightness, + sharpness, + shear_x, + shear_y, + translate_x, + translate_y, + cutout, + blur, + smooth +] + +NAME_TO_TRANSFORM = {t.name: t for t in ALL_TRANSFORMS} +TRANSFORM_NAMES = NAME_TO_TRANSFORM.keys() diff --git a/FAR-HO/blue_utils.py b/FAR-HO/blue_utils.py new file mode 100644 index 0000000..59ee62e --- /dev/null +++ b/FAR-HO/blue_utils.py @@ -0,0 +1,131 @@ +import matplotlib.pyplot as plt +from far_ho.examples.datasets import Datasets, Dataset + +import os +import numpy as np +import tensorflow as tf + +import augmentation_transforms as augmentation_transforms ##### ATTENTION FICHIER EN DOUBLE => A REGLER MIEUX #### + +def viz_data(dataset, fig_name='data_sample',aug_policy=None): + + plt.figure(figsize=(10,10)) + for i in range(25): + plt.subplot(5,5,i+1) + plt.xticks([]) + plt.yticks([]) + plt.grid(False) + + img = dataset.data[i][:,:,0] + if aug_policy : + img = augment_img(img,aug_policy) + #print('im shape',img.shape) + plt.imshow(img, cmap=plt.cm.binary) + plt.xlabel(np.nonzero(dataset.target[i])[0].item()) + + plt.savefig(fig_name) + +def augment_img(data, policy): + + #print('Im shape',data.shape) + data = np.stack((data,)*3, axis=-1) #BOF BOF juste pour forcer 3 channels + #print('Im shape',data.shape) + final_img = augmentation_transforms.apply_policy(policy, data) + #final_img = augmentation_transforms.random_flip(augmentation_transforms.zero_pad_and_crop(final_img, 4)) + # Apply cutout + #final_img = augmentation_transforms.cutout_numpy(final_img) + + im_rgb = np.array(final_img, np.float32) + im_gray = np.dot(im_rgb[...,:3], [0.2989, 0.5870, 0.1140]) #Just pour retourner a 1 channel + + return im_gray + + +### https://www.kaggle.com/raoulma/mnist-image-class-tensorflow-cnn-99-51-test-acc#5.-Build-the-neural-network-with-tensorflow- +## build the neural network class +# weight initialization +def weight_variable(shape, name = None): + initial = tf.truncated_normal(shape, stddev=0.1) + return tf.Variable(initial, name = name) + +# bias initialization +def bias_variable(shape, name = None): + initial = tf.constant(0.1, shape=shape) # positive bias + return tf.Variable(initial, name = name) + +# 2D convolution +def conv2d(x, W, name = None): + return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME', name = name) + +# max pooling +def max_pool_2x2(x, name = None): + return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], + padding='SAME', name = name) + +def cnn(x_data_tf,y_data_tf, name='model'): + # tunable hyperparameters for nn architecture + s_f_conv1 = 3; # filter size of first convolution layer (default = 3) + n_f_conv1 = 36; # number of features of first convolution layer (default = 36) + s_f_conv2 = 3; # filter size of second convolution layer (default = 3) + n_f_conv2 = 36; # number of features of second convolution layer (default = 36) + s_f_conv3 = 3; # filter size of third convolution layer (default = 3) + n_f_conv3 = 36; # number of features of third convolution layer (default = 36) + n_n_fc1 = 576; # number of neurons of first fully connected layer (default = 576) + + # 1.layer: convolution + max pooling + W_conv1_tf = weight_variable([s_f_conv1, s_f_conv1, 1, n_f_conv1], name = 'W_conv1_tf') # (5,5,1,32) + b_conv1_tf = bias_variable([n_f_conv1], name = 'b_conv1_tf') # (32) + h_conv1_tf = tf.nn.relu(conv2d(x_data_tf, + W_conv1_tf) + b_conv1_tf, + name = 'h_conv1_tf') # (.,28,28,32) + h_pool1_tf = max_pool_2x2(h_conv1_tf, + name = 'h_pool1_tf') # (.,14,14,32) + + # 2.layer: convolution + max pooling + W_conv2_tf = weight_variable([s_f_conv2, s_f_conv2, + n_f_conv1, n_f_conv2], + name = 'W_conv2_tf') + b_conv2_tf = bias_variable([n_f_conv2], name = 'b_conv2_tf') + h_conv2_tf = tf.nn.relu(conv2d(h_pool1_tf, + W_conv2_tf) + b_conv2_tf, + name ='h_conv2_tf') #(.,14,14,32) + h_pool2_tf = max_pool_2x2(h_conv2_tf, name = 'h_pool2_tf') #(.,7,7,32) + + # 3.layer: convolution + max pooling + W_conv3_tf = weight_variable([s_f_conv3, s_f_conv3, + n_f_conv2, n_f_conv3], + name = 'W_conv3_tf') + b_conv3_tf = bias_variable([n_f_conv3], name = 'b_conv3_tf') + h_conv3_tf = tf.nn.relu(conv2d(h_pool2_tf, + W_conv3_tf) + b_conv3_tf, + name = 'h_conv3_tf') #(.,7,7,32) + h_pool3_tf = max_pool_2x2(h_conv3_tf, + name = 'h_pool3_tf') # (.,4,4,32) + + # 4.layer: fully connected + W_fc1_tf = weight_variable([4*4*n_f_conv3,n_n_fc1], + name = 'W_fc1_tf') # (4*4*32, 1024) + b_fc1_tf = bias_variable([n_n_fc1], name = 'b_fc1_tf') # (1024) + h_pool3_flat_tf = tf.reshape(h_pool3_tf, [-1,4*4*n_f_conv3], + name = 'h_pool3_flat_tf') # (.,1024) + h_fc1_tf = tf.nn.relu(tf.matmul(h_pool3_flat_tf, + W_fc1_tf) + b_fc1_tf, + name = 'h_fc1_tf') # (.,1024) + + # add dropout + #keep_prob_tf = tf.placeholder(dtype=tf.float32, name = 'keep_prob_tf') + #h_fc1_drop_tf = tf.nn.dropout(h_fc1_tf, keep_prob_tf, name = 'h_fc1_drop_tf') + + # 5.layer: fully connected + W_fc2_tf = weight_variable([n_n_fc1, 10], name = 'W_fc2_tf') + b_fc2_tf = bias_variable([10], name = 'b_fc2_tf') + z_pred_tf = tf.add(tf.matmul(h_fc1_tf, W_fc2_tf), + b_fc2_tf, name = 'z_pred_tf')# => (.,10) + # predicted probabilities in one-hot encoding + y_pred_proba_tf = tf.nn.softmax(z_pred_tf, name='y_pred_proba_tf') + + # tensor of correct predictions + y_pred_correct_tf = tf.equal(tf.argmax(y_pred_proba_tf, 1), + tf.argmax(y_data_tf, 1), + name = 'y_pred_correct_tf') + return y_pred_proba_tf \ No newline at end of file diff --git a/FAR-HO/far_pba_cifar.py b/FAR-HO/far_pba_cifar.py new file mode 100644 index 0000000..60dc509 --- /dev/null +++ b/FAR-HO/far_pba_cifar.py @@ -0,0 +1,166 @@ +#https://github.com/arcelien/pba/blob/master/autoaugment/train_cifar.py +from __future__ import absolute_import, print_function, division + +import os +import numpy as np +import tensorflow as tf +#import tensorflow.contrib.layers as layers +import far_ho as far +import far_ho.examples as far_ex +#import pprint + +import autoaugment.augmentation_transforms as augmentation_transforms +#import autoaugment.policies as found_policies +from autoaugment.wrn import build_wrn_model + + +def build_model(inputs, num_classes, is_training, hparams): + """Constructs the vision model being trained/evaled. + Args: + inputs: input features/images being fed to the image model build built. + num_classes: number of output classes being predicted. + is_training: is the model training or not. + hparams: additional hyperparameters associated with the image model. + Returns: + The logits of the image model. + """ + scopes = setup_arg_scopes(is_training) + with contextlib.nested(*scopes): + if hparams.model_name == 'pyramid_net': + logits = build_shake_drop_model( + inputs, num_classes, is_training) + elif hparams.model_name == 'wrn': + logits = build_wrn_model( + inputs, num_classes, hparams.wrn_size) + elif hparams.model_name == 'shake_shake': + logits = build_shake_shake_model( + inputs, num_classes, hparams, is_training) + return logits + + +class CifarModel(object): + """Builds an image model for Cifar10/Cifar100.""" + + def __init__(self, hparams): + self.hparams = hparams + + def build(self, mode): + """Construct the cifar model.""" + assert mode in ['train', 'eval'] + self.mode = mode + self._setup_misc(mode) + self._setup_images_and_labels() + self._build_graph(self.images, self.labels, mode) + + self.init = tf.group(tf.global_variables_initializer(), + tf.local_variables_initializer()) + + def _setup_misc(self, mode): + """Sets up miscellaneous in the cifar model constructor.""" + self.lr_rate_ph = tf.Variable(0.0, name='lrn_rate', trainable=False) + self.reuse = None if (mode == 'train') else True + self.batch_size = self.hparams.batch_size + if mode == 'eval': + self.batch_size = 25 + + def _setup_images_and_labels(self): + """Sets up image and label placeholders for the cifar model.""" + if FLAGS.dataset == 'cifar10': + self.num_classes = 10 + else: + self.num_classes = 100 + self.images = tf.placeholder(tf.float32, [self.batch_size, 32, 32, 3]) + self.labels = tf.placeholder(tf.float32, + [self.batch_size, self.num_classes]) + + def assign_epoch(self, session, epoch_value): + session.run(self._epoch_update, feed_dict={self._new_epoch: epoch_value}) + + def _build_graph(self, images, labels, mode): + """Constructs the TF graph for the cifar model. + Args: + images: A 4-D image Tensor + labels: A 2-D labels Tensor. + mode: string indicating training mode ( e.g., 'train', 'valid', 'test'). + """ + is_training = 'train' in mode + if is_training: + self.global_step = tf.train.get_or_create_global_step() + + logits = build_model( + images, + self.num_classes, + is_training, + self.hparams) + self.predictions, self.cost = helper_utils.setup_loss( + logits, labels) + self.accuracy, self.eval_op = tf.metrics.accuracy( + tf.argmax(labels, 1), tf.argmax(self.predictions, 1)) + self._calc_num_trainable_params() + + # Adds L2 weight decay to the cost + self.cost = helper_utils.decay_weights(self.cost, + self.hparams.weight_decay_rate) + #### Attention: differe implem originale + + self.init = tf.group(tf.global_variables_initializer(), + tf.local_variables_initializer()) + + +######################################################## + +######## PBA ############ + +#Parallele Cifar model trainer +tf.flags.DEFINE_string('model_name', 'wrn', + 'wrn, shake_shake_32, shake_shake_96, shake_shake_112, ' + 'pyramid_net') +tf.flags.DEFINE_string('checkpoint_dir', '/tmp/training', 'Training Directory.') +tf.flags.DEFINE_string('data_path', '/tmp/data', + 'Directory where dataset is located.') +tf.flags.DEFINE_string('dataset', 'cifar10', + 'Dataset to train with. Either cifar10 or cifar100') +tf.flags.DEFINE_integer('use_cpu', 1, '1 if use CPU, else GPU.') +## ??? + +FLAGS = tf.flags.FLAGS +FLAGS.dataset +FLAGS.data_path +FLAGS.model_name = 'wrn' + +hparams = tf.contrib.training.HParams( + train_size=50000, + validation_size=0, + eval_test=1, + dataset=FLAGS.dataset, + data_path=FLAGS.data_path, + batch_size=128, + gradient_clipping_by_global_norm=5.0) + if FLAGS.model_name == 'wrn': + hparams.add_hparam('model_name', 'wrn') + hparams.add_hparam('num_epochs', 200) + hparams.add_hparam('wrn_size', 160) + hparams.add_hparam('lr', 0.1) + hparams.add_hparam('weight_decay_rate', 5e-4) + +data_loader = data_utils.DataSet(hparams) +data_loader.reset() + +with tf.Graph().as_default(): #, tf.device('/cpu:0' if FLAGS.use_cpu else '/gpu:0'): +"""Builds the image models for train and eval.""" + # Determine if we should build the train and eval model. When using + # distributed training we only want to build one or the other and not both. + with tf.variable_scope('model', use_resource=False): + m = CifarModel(self.hparams) + m.build('train') + #self._num_trainable_params = m.num_trainable_params + #self._saver = m.saver + #with tf.variable_scope('model', reuse=True, use_resource=False): + # meval = CifarModel(self.hparams) + # meval.build('eval') + + +##### FAR-HO #### +for _ in range(n_hyper_iterations): + + diff --git a/FAR-HO/test.py b/FAR-HO/test.py new file mode 100644 index 0000000..3364c00 --- /dev/null +++ b/FAR-HO/test.py @@ -0,0 +1,92 @@ +import os +import numpy as np +import tensorflow as tf +import tensorflow.contrib.layers as layers +import far_ho as far +import far_ho.examples as far_ex +import matplotlib.pyplot as plt + +sess = tf.InteractiveSession() + + +def get_data(): + # load a small portion of mnist data + datasets = far_ex.mnist(data_root_folder=os.path.join(os.getcwd(), 'MNIST_DATA'), partitions=(.1, .1,)) + return datasets.train, datasets.validation + + +def g_logits(x,y): + with tf.variable_scope('model'): + h1 = layers.fully_connected(x, 300) + logits = layers.fully_connected(h1, int(y.shape[1])) + return logits + + +x = tf.placeholder(tf.float32, shape=(None, 28**2), name='x') +y = tf.placeholder(tf.float32, shape=(None, 10), name='y') +logits = g_logits(x,y) +train_set, validation_set = get_data() + +lambdas = far.get_hyperparameter('lambdas', tf.zeros(train_set.num_examples)) +lr = far.get_hyperparameter('lr', initializer=0.01) + +ce = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits) +L = tf.reduce_mean(tf.sigmoid(lambdas)*ce) +E = tf.reduce_mean(ce) + +accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1)), tf.float32)) + +inner_optimizer = far.GradientDescentOptimizer(lr) +outer_optimizer = tf.train.AdamOptimizer() +rev_it =10 +hyper_method = far.ReverseHG().truncated(reverse_iterations=rev_it) +hyper_step = far.HyperOptimizer(hyper_method).minimize(E, outer_optimizer, L, inner_optimizer) + +T = 20 # Number of inner iterations +train_set_supplier = train_set.create_supplier(x, y) +validation_set_supplier = validation_set.create_supplier(x, y) +tf.global_variables_initializer().run() + +print('inner:', L.eval(train_set_supplier())) +print('outer:', E.eval(validation_set_supplier())) +# print('-'*50) +n_hyper_iterations = 200 +inner_losses = [] +outer_losses = [] +train_accs = [] +val_accs = [] + +for _ in range(n_hyper_iterations): + hyper_step(T, + inner_objective_feed_dicts=train_set_supplier, + outer_objective_feed_dicts=validation_set_supplier) + + inner_obj = L.eval(train_set_supplier()) + outer_obj = E.eval(validation_set_supplier()) + inner_losses.append(inner_obj) + outer_losses.append(outer_obj) + print('inner:', inner_obj) + print('outer:', outer_obj) + + train_acc = accuracy.eval(train_set_supplier()) + val_acc = accuracy.eval(validation_set_supplier()) + train_accs.append(train_acc) + val_accs.append(val_acc) + print('training accuracy', train_acc) + print('validation accuracy', val_acc) + + print('learning rate', lr.eval()) + print('norm of examples weight', tf.norm(lambdas).eval()) + print('-'*50) + +plt.subplot(211) +plt.plot(inner_losses, label='training loss') +plt.plot(outer_losses, label='validation loss') +plt.legend(loc=0, frameon=True) +#plt.xlim(0, 19) +plt.subplot(212) +plt.plot(train_accs, label='training accuracy') +plt.plot(val_accs, label='validation accuracy') +plt.legend(loc=0, frameon=True) + +plt.savefig('H%d - I%d - R%d'%(n_hyper_iterations,T,rev_it)) diff --git a/FAR-HO/test_cnn.py b/FAR-HO/test_cnn.py new file mode 100644 index 0000000..ffbcb8d --- /dev/null +++ b/FAR-HO/test_cnn.py @@ -0,0 +1,126 @@ +import warnings +warnings.filterwarnings("ignore") + +import os +import numpy as np +import tensorflow as tf +import tensorflow.contrib.layers as layers +import far_ho as far +import far_ho.examples as far_ex + +tf.logging.set_verbosity(tf.logging.ERROR) + +import matplotlib.pyplot as plt +import blue_utils as butil + +#Reset +try: + sess.close() +except: pass +rnd = np.random.RandomState(1) +tf.reset_default_graph() +sess = tf.InteractiveSession() + +def get_data(data_split): + # load a small portion of mnist data + datasets = far_ex.mnist(data_root_folder=os.path.join(os.getcwd(), 'MNIST_DATA'), partitions=data_split, reshape=False) + print("Data shape : ", datasets.train.dim_data, "/ Label shape : ", datasets.train.dim_target) + [print("Nb samples : ", d.num_examples) for d in datasets] + return datasets.train, datasets.validation, datasets.test + +#Model +# FC : reshape = True +def g_logits(x,y, name='model'): + with tf.variable_scope(name): + h1 = layers.fully_connected(x, 300) + logits = layers.fully_connected(h1, int(y.shape[1])) + return logits + +#### Hyper-parametres #### +n_hyper_iterations = 500 +T = 20 # Number of inner iterations +rev_it =10 +hp_lr = 1.e-3 +########################## + +#MNIST +#x = tf.placeholder(tf.float32, shape=(None, 28**2), name='x') +#y = tf.placeholder(tf.float32, shape=(None, 10), name='y') +#logits = g_logits(x, y) + +#CNN : reshape = False +x = tf.placeholder(dtype=tf.float32, shape=[None,28,28,1], name='x') +y = tf.placeholder(dtype=tf.float32, shape=[None,10], name='y') + +logits = butil.cnn(x,y) + +train_set, validation_set, test_set = get_data(data_split=(.05, .05,)) + +butil.viz_data(train_set) +print('Data sampled !') + +# lambdas = far.get_hyperparameter('lambdas', tf.zeros(train_set.num_examples)) +#lr = far.get_hyperparameter('lr', initializer=1e-4, constraint=lambda t: tf.maximum(tf.minimum(t, .1), 1.e-7)) +#mu = far.get_hyperparameter('mu', initializer=0.9, constraint=lambda t: tf.maximum(tf.minimum(t, .99), 1.e-5)) +#rho = far.get_hyperparameter('rho', initializer=0.00001, constraint=lambda t: tf.maximum(tf.minimum(t, 0.01), 0.)) +lr = far.get_hyperparameter('lr', initializer=1e-4, constraint=lambda t: tf.maximum(tf.minimum(t, 1e-4), 1e-4)) +mu = far.get_hyperparameter('mu', initializer=0.9, constraint=lambda t: tf.maximum(tf.minimum(t, 0.9), 0.9)) +rho = far.get_hyperparameter('rho', initializer=0.00001, constraint=lambda t: tf.maximum(tf.minimum(t, 0.00001), 0.00001)) + +ce = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits) +L = tf.reduce_mean(ce) + rho*tf.add_n([tf.reduce_sum(w**2) for w in tf.trainable_variables()]) #Retirer la seconde partie de la loss quand HP inutiles +E = tf.reduce_mean(ce) + +accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1)), tf.float32)) + +inner_optimizer = far.MomentumOptimizer(lr, mu) +outer_optimizer = tf.train.AdamOptimizer(hp_lr) +hyper_method = far.ReverseHG().truncated(reverse_iterations=rev_it) +hyper_step = far.HyperOptimizer(hyper_method).minimize(E, outer_optimizer, L, inner_optimizer) + +train_set_supplier = train_set.create_supplier(x, y, batch_size=256) # stochastic GD +validation_set_supplier = validation_set.create_supplier(x, y) + +his_params = [] + +tf.global_variables_initializer().run() + +for hyt in range(n_hyper_iterations): + hyper_step(T, + inner_objective_feed_dicts=train_set_supplier, + outer_objective_feed_dicts=validation_set_supplier) + res = sess.run(far.hyperparameters()) + [L.eval(train_set_supplier()), + E.eval(validation_set_supplier()), + accuracy.eval(train_set_supplier()), + accuracy.eval(validation_set_supplier())] + his_params.append(res) + + print('Hyper-it :',hyt,'/',n_hyper_iterations) + print('inner:', L.eval(train_set_supplier())) + print('outer:', E.eval(validation_set_supplier())) + print('training accuracy:', res[5]) + print('validation accuracy:', res[6]) + #print('learning rate', lr.eval(), 'momentum', mu.eval(), 'l2 coefficient', rho.eval()) + print('-'*50) + +test_set_supplier = test_set.create_supplier(x, y) +print('Test accuracy:',accuracy.eval(test_set_supplier())) + +fig, ax = plt.subplots(ncols=4, figsize=(15, 3)) +ax[0].set_title('Learning rate') +ax[0].plot([e[0] for e in his_params]) + +ax[1].set_title('Momentum factor') +ax[1].plot([e[1] for e in his_params]) + +#ax[2].set_title('L2 regulariz.') +#ax[2].plot([e[2] for e in his_params]) +ax[2].set_title('Tr. and val. acc') +ax[2].plot([e[5] for e in his_params]) +ax[2].plot([e[6] for e in his_params]) + +ax[3].set_title('Tr. and val. errors') +ax[3].plot([e[3] for e in his_params]) +ax[3].plot([e[4] for e in his_params]) + +plt.savefig('res_cnn_H{}_I{}'.format(n_hyper_iterations,T)) diff --git a/FAR-HO/test_cnn_aug.py b/FAR-HO/test_cnn_aug.py new file mode 100644 index 0000000..db48936 --- /dev/null +++ b/FAR-HO/test_cnn_aug.py @@ -0,0 +1,141 @@ +import warnings +warnings.filterwarnings("ignore") + +import os +import numpy as np +import tensorflow as tf +import tensorflow.contrib.layers as layers +import far_ho as far +import far_ho.examples as far_ex + +tf.logging.set_verbosity(tf.logging.ERROR) + +import matplotlib.pyplot as plt +import blue_utils as butil + +#Reset +try: + sess.close() +except: pass +rnd = np.random.RandomState(1) +tf.reset_default_graph() +sess = tf.InteractiveSession() + +def get_data(data_split): + # load a small portion of mnist data + datasets = far_ex.mnist(data_root_folder=os.path.join(os.getcwd(), 'MNIST_DATA'), partitions=data_split, reshape=False) + print("Data shape : ", datasets.train.dim_data, "/ Label shape : ", datasets.train.dim_target) + [print("Nb samples : ", d.num_examples) for d in datasets] + return datasets.train, datasets.validation, datasets.test + +#Model +# FC : reshape = True +def g_logits(x,y, name='model'): + with tf.variable_scope(name): + h1 = layers.fully_connected(x, 300) + logits = layers.fully_connected(h1, int(y.shape[1])) + return logits + +#### Hyper-parametres #### +n_hyper_iterations = 10 +T = 10 # Number of inner iterations +rev_it =10 +hp_lr = 0.02 +########################## + +#MNIST +#x = tf.placeholder(tf.float32, shape=(None, 28**2), name='x') +#y = tf.placeholder(tf.float32, shape=(None, 10), name='y') +#logits = g_logits(x, y) + +#CNN : reshape = False +x = tf.placeholder(dtype=tf.float32, shape=[None,28,28,1], name='x') +y = tf.placeholder(dtype=tf.float32, shape=[None,10], name='y') + +logits = butil.cnn(x,y) + +train_set, validation_set, test_set = get_data(data_split=(.1, .1,)) + +probX = far.get_hyperparameter('probX', initializer=0.1, constraint=lambda t: tf.maximum(tf.minimum(t, 0.1), 0.9)) +probY = far.get_hyperparameter('probY', initializer=0.1, constraint=lambda t: tf.maximum(tf.minimum(t, 0.1), 0.9)) + +#lr = far.get_hyperparameter('lr', initializer=1e-4, constraint=lambda t: tf.maximum(tf.minimum(t, 1e-4), 1e-4)) +#mu = far.get_hyperparameter('mu', initializer=0.9, constraint=lambda t: tf.maximum(tf.minimum(t, 0.9), 0.9)) + +#probX, probY = 0.5, 0.5 +#policy = [('TranslateX', probX, 8), ('TranslateY', probY, 8)] +policy = [('TranslateX', probX, 8), ('FlipUD', probY, 8)] +print('Hyp :',far.utils.hyperparameters(scope=None)) + +#butil.viz_data(train_set, aug_policy= policy) +#print('Data sampled !') + +#Ajout artificiel des transfo a la loss juste pour qu il soit compter dans la dynamique du graph +probX_loss = tf.sigmoid(probX) +probY_loss = tf.sigmoid(probY) + +ce = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits) +L = tf.reduce_mean(probX_loss*probY_loss*ce) +E = tf.reduce_mean(ce) + +accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1)), tf.float32)) + +inner_optimizer = far.AdamOptimizer() +outer_optimizer = tf.train.AdamOptimizer(hp_lr) +hyper_method = far.ReverseHG().truncated(reverse_iterations=rev_it) +hyper_step = far.HyperOptimizer(hyper_method).minimize(E, outer_optimizer, L, inner_optimizer) + +train_set_supplier = train_set.create_supplier(x, y, batch_size=256, aug_policy=policy) # stochastic GD +validation_set_supplier = validation_set.create_supplier(x, y) + +#print(train_set.dim_data,validation_set.dim_data) + +his_params = [] + +tf.global_variables_initializer().run() + +butil.viz_data(train_set, fig_name= 'Start_sample',aug_policy= policy) +print('Data sampled !') + +for hyt in range(n_hyper_iterations): + hyper_step(T, + inner_objective_feed_dicts=train_set_supplier, + outer_objective_feed_dicts=validation_set_supplier, + _skip_hyper_ts=True) + res = sess.run(far.hyperparameters()) + [L.eval(train_set_supplier()), + E.eval(validation_set_supplier()), + accuracy.eval(train_set_supplier()), + accuracy.eval(validation_set_supplier())] + his_params.append(res) + + butil.viz_data(train_set, fig_name= 'Train_sample_{}'.format(hyt),aug_policy= policy) + print('Data sampled !') + + print('Hyper-it :',hyt,'/',n_hyper_iterations) + print('inner:', L.eval(train_set_supplier())) + print('outer:', E.eval(validation_set_supplier())) + print('training accuracy:', res[4]) + print('validation accuracy:', res[5]) + print('Transformation : ProbX -',res[0],'/ProbY -',res[1]) + #print('learning rate', lr.eval(), 'momentum', mu.eval(), 'l2 coefficient', rho.eval()) + print('-'*50) + +test_set_supplier = test_set.create_supplier(x, y) +print('Test accuracy:',accuracy.eval(test_set_supplier())) + +fig, ax = plt.subplots(ncols=4, figsize=(15, 3)) +ax[0].set_title('ProbX') +ax[0].plot([e[0] for e in his_params]) + +ax[1].set_title('ProbY') +ax[1].plot([e[1] for e in his_params]) + +ax[2].set_title('Tr. and val. errors') +ax[2].plot([e[2] for e in his_params]) +ax[2].plot([e[3] for e in his_params]) + +ax[3].set_title('Tr. and val. acc') +ax[3].plot([e[4] for e in his_params]) +ax[3].plot([e[5] for e in his_params]) + +plt.savefig('res_cnn_aug_H{}_I{}'.format(n_hyper_iterations,T)) diff --git a/FAR-HO/test_fc.py b/FAR-HO/test_fc.py new file mode 100644 index 0000000..24eb596 --- /dev/null +++ b/FAR-HO/test_fc.py @@ -0,0 +1,133 @@ +#https://github.com/lucfra/FAR-HO/blob/master/far_ho/examples/autoMLDemos/Far-HO%20Demo%2C%20AutoML%202018%2C%20ICML%20workshop.ipynb +import warnings +warnings.filterwarnings("ignore") + +import os +import numpy as np +import tensorflow as tf +import tensorflow.contrib.layers as layers +import far_ho as far +import far_ho.examples as far_ex + +tf.logging.set_verbosity(tf.logging.ERROR) + +import matplotlib.pyplot as plt +#import blue_utils as butil + +#Reset +try: + sess.close() +except: pass +rnd = np.random.RandomState(1) +tf.reset_default_graph() +sess = tf.InteractiveSession() + +def get_data(data_split): + # load a small portion of mnist data + datasets = far_ex.mnist(data_root_folder=os.path.join(os.getcwd(), 'MNIST_DATA'), partitions=data_split, reshape=True) + print("Data shape : ", datasets.train.dim_data, " / Label shape : ", datasets.train.dim_target) + [print("Nb samples : ", d.num_examples) for d in datasets] + return datasets.train, datasets.validation, datasets.test + +#Model +# FC : reshape = True +def g_logits(x,y, name='model'): + with tf.variable_scope(name): + h1 = layers.fully_connected(x, 300) + logits = layers.fully_connected(h1, int(y.shape[1])) + return logits + +#### Hyper-parametres #### +n_hyper_iterations = 90 +T = 20 # Number of inner iterations +rev_it =10 +hp_lr = 0.1 +epochs =10 +batch_size = 256 +########################## + +#MNIST +x = tf.placeholder(tf.float32, shape=(None, 28**2), name='x') +y = tf.placeholder(tf.float32, shape=(None, 10), name='y') +logits = g_logits(x, y) + +#CNN : reshape = False +#x = tf.placeholder(dtype=tf.float32, shape=[None,28,28,1], name='x') +#y = tf.placeholder(dtype=tf.float32, shape=[None,10], name='y') + +#logits = butil.cnn(x,y) + +train_set, validation_set, test_set = get_data(data_split=(.6, .3,)) + +#butil.viz_data(train_set) + +# lambdas = far.get_hyperparameter('lambdas', tf.zeros(train_set.num_examples)) +lr = far.get_hyperparameter('lr', initializer=1e-2, constraint=lambda t: tf.maximum(tf.minimum(t, 0.1), 1.e-7)) +mu = far.get_hyperparameter('mu', initializer=0.95, constraint=lambda t: tf.maximum(tf.minimum(t, .99), 1.e-5)) +#rho = far.get_hyperparameter('rho', initializer=0.00001, constraint=lambda t: tf.maximum(tf.minimum(t, 0.01), 0.)) + + +ce = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits) +L = tf.reduce_mean(ce) #+ rho*tf.add_n([tf.reduce_sum(w**2) for w in tf.trainable_variables()]) #Retirer la seconde partie de la loss quand HP inutiles +E = tf.reduce_mean(ce) + +accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1)), tf.float32)) + +inner_optimizer = far.MomentumOptimizer(lr, mu) +#inner_optimizer = far.GradientDescentOptimizer(lr) +outer_optimizer = tf.train.AdamOptimizer(hp_lr) +hyper_method = far.ReverseHG().truncated(reverse_iterations=rev_it) +hyper_step = far.HyperOptimizer(hyper_method).minimize(E, outer_optimizer, L, inner_optimizer)#, global_step=tf.train.get_or_create_step()) + +train_set_supplier = train_set.create_supplier(x, y, batch_size=batch_size)#, epochs=1) # stochastic GD +validation_set_supplier = validation_set.create_supplier(x, y) + + +print('Hyper iterations par epochs',int(train_set.num_examples/batch_size*epochs/T)) + +his_params = [] + +tf.global_variables_initializer().run() + +for hyt in range(n_hyper_iterations): + hyper_step(T, + inner_objective_feed_dicts=train_set_supplier, + outer_objective_feed_dicts=validation_set_supplier, + _skip_hyper_ts=False) + res = sess.run(far.hyperparameters()) + [0, L.eval(train_set_supplier()), + E.eval(validation_set_supplier()), + accuracy.eval(train_set_supplier()), + accuracy.eval(validation_set_supplier())] + + his_params.append(res) + + print('Hyper-it :',hyt,'/',n_hyper_iterations) + print('inner:', res[3]) + print('outer:', res[4]) + print('training accuracy:', res[5]) + print('validation accuracy:', res[6]) + #print('learning rate', lr.eval(), 'momentum', mu.eval(), 'l2 coefficient', rho.eval()) + print('-'*50) + +test_set_supplier = test_set.create_supplier(x, y) +print('Test accuracy:',accuracy.eval(test_set_supplier())) + +fig, ax = plt.subplots(ncols=4, figsize=(15, 3)) +ax[0].set_title('Learning rate') +ax[0].plot([e[0] for e in his_params]) + +ax[1].set_title('Momentum factor') +ax[1].plot([e[1] for e in his_params]) + +#ax[2].set_title('L2 regulariz.') +#ax[2].plot([e[2] for e in his_params]) +ax[2].set_title('Tr. and val. acc') +ax[2].plot([e[5] for e in his_params]) +ax[2].plot([e[6] for e in his_params]) + +ax[3].set_title('Tr. and val. errors') +ax[3].plot([e[3] for e in his_params]) +ax[3].plot([e[4] for e in his_params]) + +plt.savefig('resultats/res_fc_H{}_I{}'.format(n_hyper_iterations,T)) +#plt.savefig('resultats/res_fc_H{}_I{}_noHyp'.format(n_hyper_iterations,T)) diff --git a/Gradient-Descent-The-Ultimate-Optimizer/.gitignore b/Gradient-Descent-The-Ultimate-Optimizer/.gitignore new file mode 100644 index 0000000..8c17325 --- /dev/null +++ b/Gradient-Descent-The-Ultimate-Optimizer/.gitignore @@ -0,0 +1,5 @@ +venv/ +__pycache__ +data/ +log/ +.vscode/ diff --git a/Gradient-Descent-The-Ultimate-Optimizer/20190929-paper.pdf b/Gradient-Descent-The-Ultimate-Optimizer/20190929-paper.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4f0b65a87042eb5868f079949e5ef0e8683a663b GIT binary patch literal 912289 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