{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import et def","metadata":{}},{"cell_type":"code","source":"# Directive pour afficher les graphiques dans Jupyter\n%matplotlib inline\n\n# Pandas : librairie de manipulation de données\n# NumPy : librairie de calcul scientifique\n# MatPlotLib : librairie de visualisation et graphiques\nimport pandas as pd\nimport numpy as np\nfrom matplotlib import pyplot as plt\nimport seaborn as sns\n\nfrom sklearn import model_selection\n\nfrom sklearn.metrics import classification_report, confusion_matrix, roc_curve, roc_auc_score,auc, accuracy_score\n\nfrom sklearn.preprocessing import StandardScaler, MinMaxScaler\n\nfrom sklearn.linear_model import LogisticRegression\n\nfrom sklearn.model_selection import train_test_split\n\nfrom sklearn import datasets\n\nimport json, codecs","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:27:03.004476Z","iopub.execute_input":"2023-05-15T19:27:03.004849Z","iopub.status.idle":"2023-05-15T19:27:03.014226Z","shell.execute_reply.started":"2023-05-15T19:27:03.004816Z","shell.execute_reply":"2023-05-15T19:27:03.013149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\n\nfrom tensorflow.keras.models import Sequential, load_model\n\nfrom tensorflow.keras.layers import InputLayer, Dense, Dropout, Flatten\n\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, MaxPool2D\n\nfrom tensorflow.keras.utils import to_categorical\n\nfrom tensorflow.keras.preprocessing.image import load_img, ImageDataGenerator","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:25:15.106165Z","iopub.execute_input":"2023-05-15T19:25:15.106516Z","iopub.status.idle":"2023-05-15T19:25:21.408407Z","shell.execute_reply.started":"2023-05-15T19:25:15.106486Z","shell.execute_reply":"2023-05-15T19:25:21.407457Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.preprocessing import image_dataset_from_directory\nfrom tensorflow.keras.layers.experimental.preprocessing import Rescaling, RandomFlip, RandomRotation, RandomZoom, RandomContrast, RandomTranslation","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:25:27.001571Z","iopub.execute_input":"2023-05-15T19:25:27.00309Z","iopub.status.idle":"2023-05-15T19:25:27.009567Z","shell.execute_reply.started":"2023-05-15T19:25:27.003029Z","shell.execute_reply":"2023-05-15T19:25:27.008515Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_scores(train) :\n    accuracy = train.history['accuracy']\n    val_accuracy = train.history['val_accuracy']\n    epochs = range(len(accuracy))\n    plt.plot(epochs, accuracy, 'b', label='Score apprentissage')\n    plt.plot(epochs, val_accuracy, 'r', label='Score validation')\n    plt.title('Scores')\n    plt.legend()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:25:30.19199Z","iopub.execute_input":"2023-05-15T19:25:30.192694Z","iopub.status.idle":"2023-05-15T19:25:30.200306Z","shell.execute_reply.started":"2023-05-15T19:25:30.192661Z","shell.execute_reply":"2023-05-15T19:25:30.198219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Utilisation du JSON pour associer l'id à un nom de plante","metadata":{}},{"cell_type":"code","source":"with codecs.open(\"/kaggle/input/herbarium-2022-fgvc9/train_metadata.json\", \n                 'r', encoding='utf-8', errors='ignore') as file:\n    meta_train = json.load(file)","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:27:05.980859Z","iopub.execute_input":"2023-05-15T19:27:05.981235Z","iopub.status.idle":"2023-05-15T19:27:18.723124Z","shell.execute_reply.started":"2023-05-15T19:27:05.981204Z","shell.execute_reply":"2023-05-15T19:27:18.722098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"categories_train = pd.DataFrame(meta_train['categories'])\nprint(categories_train.shape)\ncategories_train.head()","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:35:27.535463Z","iopub.execute_input":"2023-05-15T19:35:27.535818Z","iopub.status.idle":"2023-05-15T19:35:27.575723Z","shell.execute_reply.started":"2023-05-15T19:35:27.535789Z","shell.execute_reply":"2023-05-15T19:35:27.574807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Analyse association du nom des images avec les données du JSON","metadata":{}},{"cell_type":"code","source":"annotation_train = pd.DataFrame(meta_train['annotations'])\nimage_train = pd.DataFrame(meta_train['images'])","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:39:25.697168Z","iopub.execute_input":"2023-05-15T19:39:25.697745Z","iopub.status.idle":"2023-05-15T19:39:28.355886Z","shell.execute_reply.started":"2023-05-15T19:39:25.69771Z","shell.execute_reply":"2023-05-15T19:39:28.35475Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = annotation_train.merge(image_train, on='image_id', how='outer')\ndf_train = df_train.merge(categories_train, on='category_id', how='outer')\ndf_train","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:41:17.628845Z","iopub.execute_input":"2023-05-15T19:41:17.629219Z","iopub.status.idle":"2023-05-15T19:41:18.934615Z","shell.execute_reply.started":"2023-05-15T19:41:17.629189Z","shell.execute_reply":"2023-05-15T19:41:18.933766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# fin de l'analyse du JSON\n# Association images + JSON","metadata":{}},{"cell_type":"code","source":"with open('/kaggle/input/herbarium-2022-fgvc9/train_metadata.json') as json_file:\n    meta_train = json.load(json_file)\n\ntrain_dir = \"/kaggle/input/herbarium-2022-fgvc9/train_images/000\"\nimage_ids = [image[\"image_id\"] for image in meta_train[\"images\"]]\nimage_dirs = [train_dir + image['file_name'] for image in meta_train[\"images\"]]\ncategory_ids = [annotation['category_id'] for annotation in meta_train['annotations']]\ngenus_ids = [annotation['genus_id'] for annotation in meta_train['annotations']]\n\ndf = pd.DataFrame({\n    \"image_id\": image_ids,\n    \"image_path\": image_dirs,\n    \"label\": category_ids,\n    \"genus\": genus_ids\n})","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:48:46.615109Z","iopub.execute_input":"2023-05-15T19:48:46.615687Z","iopub.status.idle":"2023-05-15T19:48:58.077986Z","shell.execute_reply.started":"2023-05-15T19:48:46.615654Z","shell.execute_reply":"2023-05-15T19:48:58.077047Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"genus_map = {genus['genus_id']: genus['genus'] for genus in meta_train['genera']}\ndf['name'] = df['genus'].map(genus_map)","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:49:22.452811Z","iopub.execute_input":"2023-05-15T19:49:22.453185Z","iopub.status.idle":"2023-05-15T19:49:22.479131Z","shell.execute_reply.started":"2023-05-15T19:49:22.453156Z","shell.execute_reply":"2023-05-15T19:49:22.478264Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_x(row):\n    return row['image_path']","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:49:47.137892Z","iopub.execute_input":"2023-05-15T19:49:47.138259Z","iopub.status.idle":"2023-05-15T19:49:47.142483Z","shell.execute_reply.started":"2023-05-15T19:49:47.138228Z","shell.execute_reply":"2023-05-15T19:49:47.141527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_y(row):\n    return row['name']","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:49:59.292935Z","iopub.execute_input":"2023-05-15T19:49:59.293907Z","iopub.status.idle":"2023-05-15T19:49:59.299455Z","shell.execute_reply.started":"2023-05-15T19:49:59.293864Z","shell.execute_reply":"2023-05-15T19:49:59.298465Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def file_exists(path):\n    return os.path.isfile(path)","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:50:09.23434Z","iopub.execute_input":"2023-05-15T19:50:09.234704Z","iopub.status.idle":"2023-05-15T19:50:09.240869Z","shell.execute_reply.started":"2023-05-15T19:50:09.234673Z","shell.execute_reply":"2023-05-15T19:50:09.239273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\ndf = df[df['image_path'].apply(file_exists)]","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:51:07.980797Z","iopub.execute_input":"2023-05-15T19:51:07.981194Z","iopub.status.idle":"2023-05-15T19:51:12.194675Z","shell.execute_reply.started":"2023-05-15T19:51:07.981161Z","shell.execute_reply":"2023-05-15T19:51:12.19373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from module_name import DataBlock\n\ndblock = DataBlock(\n    blocks=(ImageBlock, CategoryBlock(vocab=class_counts)),\n    get_x=get_x,\n    get_y=get_y,\n    splitter=RandomSplitter(valid_pct=0.2, seed=42),\n    item_tfms=Resize(128),\n    batch_tfms=[*aug_transforms(), Normalize.from_stats(*imagenet_stats)]\n)\n\ndls = dblock.dataloaders(df, bs=64)","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:52:51.278519Z","iopub.execute_input":"2023-05-15T19:52:51.278875Z","iopub.status.idle":"2023-05-15T19:52:51.310249Z","shell.execute_reply.started":"2023-05-15T19:52:51.278845Z","shell.execute_reply":"2023-05-15T19:52:51.308988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('/kaggle/input/herbarium-2022-fgvc9/train_metadata.json') as json_file:\n    train_metadata = json.load(json_file)\n\ntrain_dir = \"/kaggle/input/herbarium-2022-fgvc9/train_images/000\"\nimage_ids = [image[\"image_id\"] for image in train_metadata[\"images\"]]\nimage_dirs = [train_dir + image['file_name'] for image in train_metadata[\"images\"]]\ncategory_ids = [annotation['category_id'] for annotation in train_metadata['annotations']]\ngenus_ids = [annotation['genus_id'] for annotation in train_metadata['annotations']]\n\ndf = pd.DataFrame({\n    \"image_id\": image_ids,\n    \"image_path\": image_dirs,\n    \"label\": category_ids,\n    \"genus\": genus_ids\n})","metadata":{"execution":{"iopub.status.busy":"2023-05-15T06:36:53.635265Z","iopub.execute_input":"2023-05-15T06:36:53.635642Z","iopub.status.idle":"2023-05-15T06:37:12.007021Z","shell.execute_reply.started":"2023-05-15T06:36:53.635613Z","shell.execute_reply":"2023-05-15T06:37:12.006051Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"genus_map = {genus['genus_id']: genus['genus'] for genus in train_metadata['genera']}\ndf['name'] = df['genus'].map(genus_map)","metadata":{"execution":{"iopub.status.busy":"2023-05-15T06:37:39.660727Z","iopub.execute_input":"2023-05-15T06:37:39.661108Z","iopub.status.idle":"2023-05-15T06:37:39.696341Z","shell.execute_reply.started":"2023-05-15T06:37:39.661076Z","shell.execute_reply":"2023-05-15T06:37:39.695386Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_y(row):\n    return row['name']","metadata":{"execution":{"iopub.status.busy":"2023-05-15T06:38:45.328898Z","iopub.execute_input":"2023-05-15T06:38:45.3299Z","iopub.status.idle":"2023-05-15T06:38:45.335686Z","shell.execute_reply.started":"2023-05-15T06:38:45.329856Z","shell.execute_reply":"2023-05-15T06:38:45.334754Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Lecture des images","metadata":{}},{"cell_type":"code","source":"TRAIN_DIR = \"/kaggle/input/herbarium-2022-fgvc9/train_images/000\"\nTEST_DIR = \"/kaggle/input/herbarium-2022-fgvc9/test_images/000\"\n\nwith open(\"/kaggle/input/herbarium-2022-fgvc9/train_metadata.json\") as json_file:\n    train_meta = json.load(json_file)\nwith open(\"/kaggle/input/herbarium-2022-fgvc9/test_metadata.json\") as json_file:\n    test_meta = json.load(json_file)\n#Create a meta-data df that can be used to call in images\nids = []\ncategories = []\npaths = []\n\nfor annotation, image in zip(train_meta['annotations'], train_meta['images']):\n    ids.append(image[\"image_id\"])\n    categories.append(annotation['category_id'])\n    paths.append(image[\"file_name\"])\n\ndf_meta = pd.DataFrame({\"id\":ids, \"category\":categories, \"path\":paths})\ndf_meta.head()","metadata":{"execution":{"iopub.status.busy":"2023-05-15T19:59:32.149955Z","iopub.execute_input":"2023-05-15T19:59:32.150654Z","iopub.status.idle":"2023-05-15T19:59:42.894896Z","shell.execute_reply.started":"2023-05-15T19:59:32.150615Z","shell.execute_reply":"2023-05-15T19:59:42.893967Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sci_name = {cat[\"category_id\"]:cat[\"scientificName\"] for cat in train_meta['categories']}\nfamily = {cat[\"category_id\"]:cat[\"family\"] for cat in train_meta['categories']}\ngenus = {cat[\"category_id\"]:cat[\"genus\"] for cat in train_meta['categories']}\nspecies = {cat[\"category_id\"]:cat[\"species\"] for cat in train_meta['categories']}\n\ndf_meta[\"scientific_name\"] = df_meta[\"category\"].map(sci_name)\ndf_meta[\"family\"] = df_meta[\"category\"].map(family)\ndf_meta[\"genus\"] = df_meta[\"category\"].map(genus)\ndf_meta[\"species\"] = df_meta[\"category\"].map(species)\ndf_meta.head()","metadata":{"execution":{"iopub.status.busy":"2023-05-15T20:00:13.34554Z","iopub.execute_input":"2023-05-15T20:00:13.345899Z","iopub.status.idle":"2023-05-15T20:00:13.473208Z","shell.execute_reply.started":"2023-05-15T20:00:13.345869Z","shell.execute_reply":"2023-05-15T20:00:13.472253Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_image(index):\n    path=os.path.join(\"../input/herbarium-2022-fgvc9/train_images\",df_meta[\"path\"][index])\n    print(df_meta[\"species\"][index])\n    plt.imshow(plt.imread(path)/255)","metadata":{"execution":{"iopub.status.busy":"2023-05-15T20:03:03.460058Z","iopub.execute_input":"2023-05-15T20:03:03.460427Z","iopub.status.idle":"2023-05-15T20:03:03.467289Z","shell.execute_reply.started":"2023-05-15T20:03:03.460396Z","shell.execute_reply":"2023-05-15T20:03:03.46448Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"show_image(20)","metadata":{"execution":{"iopub.status.busy":"2023-05-15T20:03:06.005387Z","iopub.execute_input":"2023-05-15T20:03:06.005739Z","iopub.status.idle":"2023-05-15T20:03:06.478456Z","shell.execute_reply.started":"2023-05-15T20:03:06.005708Z","shell.execute_reply":"2023-05-15T20:03:06.477569Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data_dir = \"/kaggle/input/herbarium-2022-fgvc9/train_images/000\"\nimage_size = (150, 150)\n\ndataset = image_dataset_from_directory(\n    train_data_dir,\n    image_size=image_size,\n)","metadata":{"execution":{"iopub.status.busy":"2023-05-15T20:04:44.418391Z","iopub.execute_input":"2023-05-15T20:04:44.418764Z","iopub.status.idle":"2023-05-15T20:04:46.731144Z","shell.execute_reply.started":"2023-05-15T20:04:44.418737Z","shell.execute_reply":"2023-05-15T20:04:46.730143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15, 25))\nclass_names = dataset.class_names\nfor images, labels in dataset.take(1):\n    for i in range(32):\n        show_image(i)\n        #plt.subplot(7, 5, i + 1)\n        #plt.imshow(np.array(images[i]).astype(\"uint8\"))\n        #plt.title(class_names[labels[i]])\n        #title = get_y(i)\n        #plt.title(title)\n        #plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2023-05-15T20:04:20.623153Z","iopub.status.idle":"2023-05-15T20:04:20.623566Z","shell.execute_reply.started":"2023-05-15T20:04:20.623348Z","shell.execute_reply":"2023-05-15T20:04:20.623375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Création des datasets","metadata":{}},{"cell_type":"code","source":"train_data_dir = \"/kaggle/input/herbarium-2022-fgvc9/train_images/000\"\nimage_size = (150, 150)\n\ntrain_dataset = image_dataset_from_directory(\n    train_data_dir,\n    validation_split=0.2,\n    seed=1,\n    subset=\"training\",\n    label_mode=\"categorical\",\n    image_size=image_size\n)\n\nvalidation_dataset = image_dataset_from_directory(\n    train_data_dir,\n    validation_split=0.2,\n    seed=1,\n    subset=\"validation\",\n    label_mode=\"categorical\",\n    image_size=image_size\n)","metadata":{"execution":{"iopub.status.busy":"2023-05-14T20:39:03.896675Z","iopub.execute_input":"2023-05-14T20:39:03.897036Z","iopub.status.idle":"2023-05-14T20:39:04.62776Z","shell.execute_reply.started":"2023-05-14T20:39:03.897Z","shell.execute_reply":"2023-05-14T20:39:04.6267Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_augmentation = Sequential([\n    RandomFlip(\"horizontal\"),\n    RandomRotation(0.1),\n    RandomZoom((-0.1,0.1)),\n    RandomContrast(0.05),  \n    RandomTranslation(0.1,0.1)\n])","metadata":{"execution":{"iopub.status.busy":"2023-05-14T20:39:11.499847Z","iopub.execute_input":"2023-05-14T20:39:11.500428Z","iopub.status.idle":"2023-05-14T20:39:11.51412Z","shell.execute_reply.started":"2023-05-14T20:39:11.500395Z","shell.execute_reply":"2023-05-14T20:39:11.513192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Modèle CNN \nmodel = Sequential()\nmodel.add(InputLayer(input_shape=(150, 150, 3)))\nmodel.add(data_augmentation)\nmodel.add(Rescaling(scale=1./255))\nmodel.add(Conv2D(32, (3, 3), activation='relu'))\nmodel.add(Conv2D(32, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.2))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(Conv2D(64, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.2))\nmodel.add(Conv2D(20, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D(pool_size=(2, 2)))\nmodel.add(Dropout(0.2))\nmodel.add(Flatten())\n#model.add(Dense(2, activation='softmax', kernel_initializer=tf.keras.initializers.Constant(0.01)))\nmodel.add(Dense(100, activation='softmax'))\n\n# Compilation du modèle\nmodel.compile(loss='categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(1e-4), metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2023-05-14T20:08:26.026111Z","iopub.execute_input":"2023-05-14T20:08:26.026475Z","iopub.status.idle":"2023-05-14T20:08:30.048462Z","shell.execute_reply.started":"2023-05-14T20:08:26.026444Z","shell.execute_reply":"2023-05-14T20:08:30.04755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"model.add(InputLayer(input_shape=(150, 150, 3)))\nmodel.add(Dense(100, activation='softmax')) car on veut prédire les 100 classes","metadata":{}},{"cell_type":"code","source":"history = model.fit(\n    train_dataset, \n    validation_data=validation_dataset, \n    epochs=10,\n    verbose=1)","metadata":{"execution":{"iopub.status.busy":"2023-05-14T20:08:37.612365Z","iopub.execute_input":"2023-05-14T20:08:37.612736Z","iopub.status.idle":"2023-05-14T20:20:39.119415Z","shell.execute_reply.started":"2023-05-14T20:08:37.612706Z","shell.execute_reply":"2023-05-14T20:20:39.118397Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_scores(history)","metadata":{"execution":{"iopub.status.busy":"2023-05-14T20:20:39.123393Z","iopub.execute_input":"2023-05-14T20:20:39.123773Z","iopub.status.idle":"2023-05-14T20:20:39.375804Z","shell.execute_reply.started":"2023-05-14T20:20:39.123747Z","shell.execute_reply":"2023-05-14T20:20:39.374909Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Avec un modèle de type VGG16 :","metadata":{}},{"cell_type":"code","source":"model = Sequential()\nmodel.add(InputLayer(input_shape=(150, 150, 3)))\nmodel.add(data_augmentation)\nmodel.add(Rescaling(scale=1./255))\nmodel.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(3,3),padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=64,kernel_size=(3,3),padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=128, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=256, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(Conv2D(filters=512, kernel_size=(3,3), padding=\"same\", activation=\"relu\"))\nmodel.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))\nmodel.add(Flatten())\nmodel.add(Dense(100, activation='softmax', kernel_initializer=tf.keras.initializers.Constant(0.01)))\n\n# Compilation du modèle\nmodel.compile(loss='categorical_crossentropy', optimizer=tf.keras.optimizers.Adam(1e-4), metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2023-05-14T20:39:20.714113Z","iopub.execute_input":"2023-05-14T20:39:20.714709Z","iopub.status.idle":"2023-05-14T20:39:24.196818Z","shell.execute_reply.started":"2023-05-14T20:39:20.714673Z","shell.execute_reply":"2023-05-14T20:39:24.195898Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n    train_dataset, \n    validation_data=validation_dataset, \n    epochs=10,\n    verbose=1)","metadata":{"execution":{"iopub.status.busy":"2023-05-14T20:39:28.881571Z","iopub.execute_input":"2023-05-14T20:39:28.882429Z","iopub.status.idle":"2023-05-14T20:52:38.225367Z","shell.execute_reply.started":"2023-05-14T20:39:28.882384Z","shell.execute_reply":"2023-05-14T20:52:38.224393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_scores(history)","metadata":{"execution":{"iopub.status.busy":"2023-05-14T20:52:57.332387Z","iopub.execute_input":"2023-05-14T20:52:57.333095Z","iopub.status.idle":"2023-05-14T20:52:57.569289Z","shell.execute_reply.started":"2023-05-14T20:52:57.333062Z","shell.execute_reply":"2023-05-14T20:52:57.568377Z"},"trusted":true},"execution_count":null,"outputs":[]}]}