{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":3362,"databundleVersionId":31148,"sourceType":"competition"}],"dockerImageVersionId":30733,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nimport tensorflow_datasets as tfds\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras import layers, models","metadata":{"execution":{"iopub.status.busy":"2024-06-28T14:22:08.627098Z","iopub.execute_input":"2024-06-28T14:22:08.627908Z","iopub.status.idle":"2024-06-28T14:22:08.632399Z","shell.execute_reply.started":"2024-06-28T14:22:08.627876Z","shell.execute_reply":"2024-06-28T14:22:08.631352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Exercice 1","metadata":{}},{"cell_type":"code","source":"\"\"\"\n# on charge le dataset\n(ds_train, ds_validation, ds_test), ds_info = tfds.load(\n    'cats_vs_dogs',\n    split=['train[:70%]', 'train[70%:85%]', 'train[85%:]'],\n    with_info=True,\n    as_supervised=True,\n)\n\"\"\"\n#j'ai des problèmes de connexion, je diminue donc la taille des données (cela limite aussi le temps de calcul plus tard)\nfraction_train = 10 \nfraction_validation = 10 \nfraction_test = 10 \n\n\ntrain_split_end = fraction_train\nvalidation_split_start = train_split_end\nvalidation_split_end = validation_split_start + fraction_validation\ntest_split_start = validation_split_end\ntest_split_end = test_split_start + fraction_test\n\n# Charger seulement une partie du dataset\n(ds_train, ds_validation, ds_test), ds_info = tfds.load(\n    'cats_vs_dogs',\n    split=[\n        f'train[:{train_split_end}%]',\n        f'train[{validation_split_start}%:{validation_split_end}%]',\n        f'train[{test_split_start}%:{test_split_end}%]',\n    ],\n    with_info=True,\n    as_supervised=True,\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-28T14:22:09.667394Z","iopub.execute_input":"2024-06-28T14:22:09.668248Z","iopub.status.idle":"2024-06-28T14:22:09.823275Z","shell.execute_reply.started":"2024-06-28T14:22:09.668215Z","shell.execute_reply":"2024-06-28T14:22:09.822554Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocess(image, label):\n    image = tf.image.resize(image, [128, 128])  # Resize to a fixed size\n    image = tf.image.convert_image_dtype(image, tf.float32)  # Convert to float32\n    return image, label\n\n\nbatch_size = 32\n\n# Apply preprocessing to datasets\nds_train = ds_train.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)\nds_train = ds_train.shuffle(1000)\nds_train = ds_train.batch(batch_size)\nds_train = ds_train.prefetch(tf.data.AUTOTUNE)\n\nds_validation = ds_validation.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)\nds_validation = ds_validation.batch(batch_size)\nds_validation = ds_validation.prefetch(tf.data.AUTOTUNE)\n\nds_test = ds_test.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)\nds_test = ds_test.batch(batch_size)\nds_test = ds_test.prefetch(tf.data.AUTOTUNE)\n\n\nprint(f\"Nombre de classes : {ds_info.features['label'].num_classes}\")","metadata":{"execution":{"iopub.status.busy":"2024-06-28T14:22:11.373405Z","iopub.execute_input":"2024-06-28T14:22:11.374261Z","iopub.status.idle":"2024-06-28T14:22:11.476668Z","shell.execute_reply.started":"2024-06-28T14:22:11.374227Z","shell.execute_reply":"2024-06-28T14:22:11.475742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Exercice 2","metadata":{}},{"cell_type":"code","source":"\n# Créer le modèle de réseau de neurones demandé\nvocab_size = 1000\nembedding_dim = 16\n\nmodel = models.Sequential([\n    layers.Embedding(input_dim=vocab_size, output_dim=embedding_dim),\n    layers.GlobalAveragePooling1D(),\n    layers.Dense(16, activation='relu'),\n    layers.Dense(8, activation='relu'),\n    layers.Dense(1, activation='sigmoid')\n])\n\nmodel.compile(optimizer='adam',\n              loss='binary_crossentropy',\n              metrics=['accuracy'])\n\n# Entraîner le modèle\nhistory = model.fit(ds_train, validation_data=ds_validation, epochs=10)","metadata":{"execution":{"iopub.status.busy":"2024-06-28T14:22:11.478340Z","iopub.execute_input":"2024-06-28T14:22:11.478657Z","iopub.status.idle":"2024-06-28T14:22:11.619361Z","shell.execute_reply.started":"2024-06-28T14:22:11.478629Z","shell.execute_reply":"2024-06-28T14:22:11.617969Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Tester le modèle sur une image du jeu de données\nfor images, labels in ds_test.take(1):\n    test_image = images[21].numpy()\n    test_label = labels[21].numpy()\n    plt.imshow(test_image)\n    plt.title(f'Label: {test_label}')\n    plt.show()\n\n# Prédire avec le modèle\ntest_image = tf.expand_dims(test_image, axis=0)\nprediction = model.predict(test_image)\nprint(f\"Prédiction : {prediction}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-06-28T14:22:11.620284Z","iopub.status.idle":"2024-06-28T14:22:11.620691Z","shell.execute_reply.started":"2024-06-28T14:22:11.620479Z","shell.execute_reply":"2024-06-28T14:22:11.620494Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Tests avec modifications d'image\ntest_image_rotated = tf.image.rot90(test_image)\ntest_image_flipped = tf.image.flip_left_right(test_image)\n\nplt.imshow(test_image_rotated[0].numpy())\nplt.title('Image Rotated')\nplt.show()\n\nplt.imshow(test_image_flipped[0].numpy())\nplt.title('Image Flipped')\nplt.show()\n\nprediction_rotated = model.predict(test_image_rotated)\nprediction_flipped = model.predict(test_image_flipped)\n\nprint(f\"Prédiction (Rotated) : {prediction_rotated}\")\nprint(f\"Prédiction (Flipped) : {prediction_flipped}\")","metadata":{"execution":{"iopub.status.busy":"2024-06-28T14:22:11.622333Z","iopub.status.idle":"2024-06-28T14:22:11.622866Z","shell.execute_reply.started":"2024-06-28T14:22:11.622588Z","shell.execute_reply":"2024-06-28T14:22:11.622610Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Les 3 valeurs de prédictions sont similaire, avec ou sans la rotation et les prédictions sont correctes (1 : chien, 0 : chat) meme si le score est proche de 0.5","metadata":{}},{"cell_type":"code","source":"\n# Visualiser les plongements obtenus grâce à TensorBoard\nlog_dir = \"logs/embeddings\"\nembedding_layer = model.layers[0]\n\n# Enregistrer un point de contrôle du modèle\ncheckpoint_path = \"training_1/cp.ckpt\"\nmodel.save_weights(checkpoint_path)\n\n# Extraire les poids de la première couche d'embedding pour visualiser les plongements\nvecs = embedding_layer.get_weights()[0]\nmeta_data = os.path.join(log_dir, 'metadata.tsv')\n\n# Créer le répertoire des logs s'il n'existe pas\nos.makedirs(log_dir, exist_ok=True)\n\n# Enregistrer les métadonnées\nwith open(meta_data, 'w') as f:\n    for i in range(len(vecs)):\n        f.write(f\"{i}\\n\")\n\n# Créer un fichier de checkpoint\nweights = tf.Variable(vecs)\ncheckpoint = tf.train.Checkpoint(embedding=weights)\ncheckpoint.save(os.path.join(log_dir, \"embedding.ckpt\"))\n\n# Configurer le projecteur de TensorBoard\nconfig = projector.ProjectorConfig()\n\nembedding = config.embeddings.add()\nembedding.tensor_name = \"embedding/.ATTRIBUTES/VARIABLE_VALUE\"\nembedding.metadata_path = meta_data\n\nprojector.visualize_embeddings(log_dir, config)\n","metadata":{"execution":{"iopub.status.busy":"2024-06-28T14:22:11.624045Z","iopub.status.idle":"2024-06-28T14:22:11.624561Z","shell.execute_reply.started":"2024-06-28T14:22:11.624287Z","shell.execute_reply":"2024-06-28T14:22:11.624308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}