Files
Ipsofacto/ante_hoc_model_generative_lstm.ipynb
T

895 lines
255 KiB
Plaintext
Raw Normal View History

2024-11-25 11:22:29 +03:30
{
"cells": [
{
"cell_type": "markdown",
"id": "2111825f",
"metadata": {
"id": "2111825f"
},
"source": [
"<h1 align='center' dir='rtl' style='color:yellow'>نام طرح</h1>"
]
},
{
"cell_type": "markdown",
"id": "1ab61eab",
"metadata": {
"id": "1ab61eab"
},
"source": [
"<h2 align='center' dir='rtl'>فراخوانی کتابخانه های مورد نیاز</h2>"
]
},
{
"cell_type": "code",
2024-11-27 01:22:26 +03:30
"execution_count": 2,
2024-11-25 11:22:29 +03:30
"id": "b97c8a8b",
"metadata": {
"id": "b97c8a8b"
},
2024-11-27 01:22:26 +03:30
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2024-11-25 22:06:12.893677: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
"To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
]
}
],
2024-11-25 11:22:29 +03:30
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import tensorflow as tf\n",
"from tensorflow import keras\n",
"from tensorflow.keras.layers import Dense, Input, Flatten, Conv2D, SimpleRNN, LSTM\n",
"from tensorflow.keras.models import Model\n",
"from tensorflow.keras.datasets import mnist"
]
},
{
"cell_type": "markdown",
"id": "79ef7ea0",
"metadata": {
"id": "79ef7ea0"
},
"source": [
"<h2 align='center' dir='rtl'> لود کردن دیتاست MNIST</h2>"
]
},
{
"cell_type": "code",
2024-11-27 01:22:26 +03:30
"execution_count": 3,
2024-11-25 11:22:29 +03:30
"id": "511bc7e3",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "511bc7e3",
"outputId": "af449f04-1da5-4b14-89af-75adf6100681"
},
2024-11-27 01:22:26 +03:30
"outputs": [],
2024-11-25 11:22:29 +03:30
"source": [
"train_set, test_set = mnist.load_data()"
]
},
{
"cell_type": "markdown",
"id": "8af0ed71",
"metadata": {
"id": "8af0ed71"
},
"source": [
"<h2 align='center' dir='rtl'>طراحی لایه های استخراج ویژگی و سنجش نسبت ها</h2>"
]
},
{
"cell_type": "markdown",
"id": "bb994741",
"metadata": {
"id": "bb994741"
},
"source": [
"<h3 align='center' dir='rtl'>لایه استخراج ویژگی</h3>"
]
},
{
"cell_type": "code",
2024-11-27 01:22:26 +03:30
"execution_count": 4,
2024-11-25 11:22:29 +03:30
"id": "8494ca6d",
"metadata": {
"id": "8494ca6d"
},
"outputs": [],
"source": [
"# لایه استخراج ویژگی\n",
"kernel_initializer = 'normal'\n",
"activation = \"relu\"\n",
"\n",
"dtype = tf.float32\n",
"\n",
"\n",
"def get_module_1():\n",
" shape=(28,28, 1)\n",
" chs=1\n",
" inputs = Input(shape)\n",
" layer = Conv2D(filters=32*chs, kernel_size=(3,3), activation=activation, kernel_initializer=kernel_initializer)(inputs)\n",
" layer = Conv2D(filters=16*chs, kernel_size=(3,3), strides=(2, 2), activation=activation, kernel_initializer=kernel_initializer)(layer)\n",
" layer = Conv2D(filters=8*chs, kernel_size=(3,3), activation=activation, kernel_initializer=kernel_initializer)(layer)\n",
" layer = Conv2D(filters=4*chs, kernel_size=(3,3), strides=(2, 2), activation='linear', kernel_initializer=kernel_initializer)(layer)\n",
" layer = Conv2D(filters=64*2, kernel_size=(4,4), activation='softplus', kernel_initializer=kernel_initializer)(layer)\n",
" layer = Flatten()(layer)\n",
" model = Model(inputs, layer)\n",
"\n",
" return model"
]
},
{
"cell_type": "markdown",
"id": "ed717db9",
"metadata": {
"id": "ed717db9"
},
"source": [
"<h3 align='center' dir='rtl'>لایه سنجش نسبت ها</h3>"
]
},
{
"cell_type": "code",
2024-11-27 01:22:26 +03:30
"execution_count": 5,
2024-11-25 11:22:29 +03:30
"id": "f63a27eb",
"metadata": {
"id": "f63a27eb"
},
"outputs": [],
"source": [
"# لایه سنجش نسبت ها\n",
"def get_module_2():\n",
" shape=(1, 64*2+10,)\n",
" inputs = Input(shape)\n",
" lstm1 = LSTM(64, return_sequences=True)(inputs)\n",
" lstm2 = LSTM(32)(lstm1)\n",
" outputs = Dense(10, activation='softmax')(lstm2)\n",
" model = Model(inputs, outputs)\n",
" return model"
]
},
2024-11-27 01:22:26 +03:30
{
"cell_type": "code",
"execution_count": 8,
"id": "a2848909",
"metadata": {},
"outputs": [],
"source": [
"def get_module_3():\n",
" shape=(1, 10,)\n",
" inputs = Input(shape)\n",
" lstm1 = LSTM(64, return_sequences=True)(inputs)\n",
" lstm2 = LSTM(32)(lstm1)\n",
" outputs = Dense(10, activation='softmax')(lstm2)\n",
" model = Model(inputs, outputs)\n",
" return model"
]
},
2024-11-25 11:22:29 +03:30
{
"cell_type": "markdown",
"id": "614adfad",
"metadata": {
"id": "614adfad"
},
"source": [
"<h2 align='center' dir='rtl'>طراحی‌ و ساختن شبکه عصبی</h2>"
]
},
{
"cell_type": "code",
2024-11-27 01:22:26 +03:30
"execution_count": 9,
2024-11-25 11:22:29 +03:30
"id": "6a14ab0a",
"metadata": {
"id": "6a14ab0a"
},
"outputs": [],
"source": [
"def get_m2_input_vector(f0, f1, lbl1):\n",
" # ترکیب ویژگی های کلاس مورد مطالعه با کلاس های دیگر\n",
"\n",
" inp = f0 * f1\n",
" return tf.concat([inp, lbl1], axis=1)\n",
"\n",
"\n",
"class InfluenceModel(keras.Model):\n",
" def __init__(self, module_1, module_2):\n",
" super(InfluenceModel, self).__init__()\n",
" # لایه استخراج ویژگی\n",
" self.module_1 = module_1\n",
" # لایه تمام متصل (سنجش نسبت ها)\n",
" self.module_2 = module_2\n",
"\n",
" self.loss = keras.losses.SparseCategoricalCrossentropy(from_logits=False)\n",
" self.metric = keras.metrics.SparseCategoricalAccuracy()\n",
"\n",
"\n",
" def compile(self, optimizer_1, optimizer_2):\n",
" super(InfluenceModel, self).compile()\n",
" self.optimizer_1 = optimizer_1\n",
" self.optimizer_2 = optimizer_2\n",
"\n",
" def call_at_zero(self, x):\n",
" # جدا کردن تصاویر\n",
" imgs = x[0]\n",
" # جدا کردن برچسب\n",
" lbls = tf.one_hot(x[1], 10)\n",
"\n",
" # استخراج ویژگی های تصاویر\n",
" features = self.module_1(imgs)\n",
"\n",
" n_feat = features.shape[0]\n",
" # جدا سازی ویژگی های هر تصویر\n",
" features = tf.split(features, n_feat, axis=0)\n",
"\n",
" # ویژگی های استحراج شده تصویر مورد مطالعه\n",
" f0 = features[0]\n",
"\n",
" res_mtx = []\n",
" res_row = []\n",
" for j in range(1, n_feat):\n",
" # ترکیب هر نمونه با تصویر مورد مطالعه\n",
" f1 = features[j]\n",
" lbl1 = lbls[j:j+1,:]\n",
" inp = get_m2_input_vector(f0, f1, lbl1)\n",
"\n",
" res_row += [inp]\n",
"\n",
" # محاسبه نسبت هر نمونه با تصویر مورد مطالعه\n",
" res_row = tf.concat(res_row, axis=0)\n",
" res_row = tf.expand_dims(res_row, axis=1)\n",
" res_mtx = self.module_2(res_row)\n",
"\n",
" # میانگین بر روی نمونه ها\n",
" res = tf.reduce_sum(res_mtx, axis=0) / (n_feat-1)\n",
" return res, res_mtx\n",
"\n",
" # Feed - Forward\n",
" def call(self, x):\n",
" # جدا کردن تصاویر\n",
" imgs = x[0]\n",
" # جدا کردن برچسب\n",
" lbls = tf.one_hot(x[1], 10)\n",
"\n",
" # استخراج ویژگی های تصاویر\n",
" features = self.module_1(imgs)\n",
"\n",
" # جدا سازی ویژگی های هر تصویر\n",
" n_feat = features.shape[0]\n",
" features = tf.split(features, n_feat, axis=0)\n",
"\n",
"\n",
" res_mtx = []\n",
" # ساخت جفت های ترکیب شده به ازای هر تصویر برای اموزش مدل\n",
" for i in range(n_feat):\n",
" res_row = []\n",
" for j in range(n_feat):\n",
" f0 = features[i]\n",
" f1 = features[j]\n",
" lbl1 = lbls[j:j+1,:]\n",
" inp = get_m2_input_vector(f0, f1, lbl1)\n",
" res_row += [inp]\n",
" res_row = tf.concat(res_row, axis=0)\n",
" res_row = tf.cast(res_row, dtype=tf.float32)\n",
" res_row = tf.expand_dims(res_row, axis=1)\n",
" # محاسبه سنجش تاثیر حضور تصاویر دیگر در پیش بینی تصویر مورد مطالعه\n",
" res_mtx += [self.module_2(res_row)]\n",
"\n",
" res_mtx = tf.stack(res_mtx)\n",
" #\n",
" res_mtx = tf.transpose(res_mtx, [2, 1, 0])\n",
" #\n",
" res_mtx -= tf.linalg.diag(tf.linalg.diag_part(res_mtx))\n",
" #\n",
" res_mtx = tf.transpose(res_mtx, [2, 1, 0])\n",
" #\n",
2024-11-27 01:22:26 +03:30
" print(res_mtx.shape)\n",
2024-11-25 11:22:29 +03:30
" res = tf.reduce_sum(res_mtx, axis=1) / (n_feat-1)\n",
"\n",
" return res, res_mtx\n",
"\n",
" def train_step(self, x):\n",
" # تعریف تابع ضرر\n",
" loss = keras.losses.SparseCategoricalCrossentropy(from_logits=False)\n",
"\n",
" # محاسبه گرادیان و اعمال گرادیان\n",
" with tf.GradientTape() as tape_1, tf.GradientTape() as tape_2:\n",
" output, _ = self.call(x)\n",
" loss_batch = loss(x[1], output)\n",
" gradient_1 = tape_1.gradient(loss_batch, self.module_1.trainable_variables)\n",
" self.optimizer_1.apply_gradients(zip(gradient_1, self.module_1.trainable_variables))\n",
" gradient_2 = tape_2.gradient(loss_batch, self.module_2.trainable_variables)\n",
" self.optimizer_2.apply_gradients(zip(gradient_2, self.module_2.trainable_variables))\n",
"\n",
" # اعمال معیار ارزیابی\n",
" metric_batch = self.metric(x[1], output)\n",
"\n",
" return {\"loss\": loss_batch, \"metric\": metric_batch}\n"
]
},
{
"cell_type": "markdown",
"id": "c1a0891a",
"metadata": {
"id": "c1a0891a"
},
"source": [
"<h2 align='center' dir='rtl'>اموزش مدل</h2>"
]
},
{
"cell_type": "markdown",
"id": "67d4458d",
"metadata": {
"id": "67d4458d"
},
"source": [
"<h3 align='center' dir='rtl'>اتصال لایه ها</h3>"
]
},
{
"cell_type": "code",
2024-11-27 01:22:26 +03:30
"execution_count": 10,
2024-11-25 11:22:29 +03:30
"id": "f6ed77af",
"metadata": {
"id": "f6ed77af"
},
2024-11-27 01:22:26 +03:30
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2024-11-25 22:07:38.582469: I tensorflow/core/common_runtime/process_util.cc:146] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.\n",
"2024-11-25 22:07:39.158327: I tensorflow/core/common_runtime/executor.cc:1197] [/device:CPU:0] (DEBUG INFO) Executor start aborting (this does not indicate an error and you can ignore this message): INVALID_ARGUMENT: You must feed a value for placeholder tensor 'gradients/split_2_grad/concat/split_2/split_dim' with dtype int32\n",
"\t [[{{node gradients/split_2_grad/concat/split_2/split_dim}}]]\n",
"2024-11-25 22:07:39.160707: I tensorflow/core/common_runtime/executor.cc:1197] [/device:CPU:0] (DEBUG INFO) Executor start aborting (this does not indicate an error and you can ignore this message): INVALID_ARGUMENT: You must feed a value for placeholder tensor 'gradients/split_grad/concat/split/split_dim' with dtype int32\n",
"\t [[{{node gradients/split_grad/concat/split/split_dim}}]]\n",
"2024-11-25 22:07:39.162665: I tensorflow/core/common_runtime/executor.cc:1197] [/device:CPU:0] (DEBUG INFO) Executor start aborting (this does not indicate an error and you can ignore this message): INVALID_ARGUMENT: You must feed a value for placeholder tensor 'gradients/split_1_grad/concat/split_1/split_dim' with dtype int32\n",
"\t [[{{node gradients/split_1_grad/concat/split_1/split_dim}}]]\n",
"2024-11-25 22:07:39.421363: I tensorflow/core/common_runtime/executor.cc:1197] [/device:CPU:0] (DEBUG INFO) Executor start aborting (this does not indicate an error and you can ignore this message): INVALID_ARGUMENT: You must feed a value for placeholder tensor 'gradients/split_2_grad/concat/split_2/split_dim' with dtype int32\n",
"\t [[{{node gradients/split_2_grad/concat/split_2/split_dim}}]]\n",
"2024-11-25 22:07:39.424466: I tensorflow/core/common_runtime/executor.cc:1197] [/device:CPU:0] (DEBUG INFO) Executor start aborting (this does not indicate an error and you can ignore this message): INVALID_ARGUMENT: You must feed a value for placeholder tensor 'gradients/split_grad/concat/split/split_dim' with dtype int32\n",
"\t [[{{node gradients/split_grad/concat/split/split_dim}}]]\n",
"2024-11-25 22:07:39.426262: I tensorflow/core/common_runtime/executor.cc:1197] [/device:CPU:0] (DEBUG INFO) Executor start aborting (this does not indicate an error and you can ignore this message): INVALID_ARGUMENT: You must feed a value for placeholder tensor 'gradients/split_1_grad/concat/split_1/split_dim' with dtype int32\n",
"\t [[{{node gradients/split_1_grad/concat/split_1/split_dim}}]]\n"
]
}
],
2024-11-25 11:22:29 +03:30
"source": [
"m1 = get_module_1()\n",
"m2 = get_module_2()\n",
"\n",
"model = InfluenceModel(m1, m2)"
]
},
{
"cell_type": "markdown",
"id": "16f4ec08",
"metadata": {
"id": "16f4ec08"
},
"source": [
"<h3 align='center' dir='rtl'>کامپایل کردن مدل</h3>"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0bbddc92",
"metadata": {
"id": "0bbddc92"
},
"outputs": [],
"source": [
"optimizer_1 = tf.optimizers.Adam(learning_rate=1e-3, beta_1=0.9)\n",
"optimizer_2 = tf.optimizers.Adam(learning_rate=1e-3, beta_1=0.9)\n",
"\n",
"m1.compile(optimizer_1)\n",
"m2.compile(optimizer_2)\n",
"model.compile(optimizer_1, optimizer_2)\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b8ea93f6",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 374
},
"id": "b8ea93f6",
"outputId": "13054850-6a0c-484a-8fc1-8858d7eb0c3e"
},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"functional\"</span>\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"\u001b[1mModel: \"functional\"\u001b[0m\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
"│ input_layer (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">28</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">26</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">26</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">320</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">4,624</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,160</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">4</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">292</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Conv2D</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">8,320</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
"│ input_layer (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m28\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m26\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m320\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_1 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m16\u001b[0m) │ \u001b[38;5;34m4,624\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_2 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m10\u001b[0m, \u001b[38;5;34m8\u001b[0m) │ \u001b[38;5;34m1,160\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_3 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m, \u001b[38;5;34m4\u001b[0m) │ \u001b[38;5;34m292\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ conv2d_4 (\u001b[38;5;33mConv2D\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m8,320\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ flatten (\u001b[38;5;33mFlatten\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">14,716</span> (57.48 KB)\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m14,716\u001b[0m (57.48 KB)\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">14,716</span> (57.48 KB)\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m14,716\u001b[0m (57.48 KB)\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
}
],
"source": [
"m1.summary()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "f2ea384a",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 272
},
"id": "f2ea384a",
"outputId": "9a7dc510-a44c-4d69-bc09-26fb404d89a2"
},
"outputs": [
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"functional_1\"</span>\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"\u001b[1mModel: \"functional_1\"\u001b[0m\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
"│ input_layer_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">138</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ lstm (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LSTM</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">51,968</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ lstm_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LSTM</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">12,416</span> │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">330</span> │\n",
"└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
"│ input_layer_1 (\u001b[38;5;33mInputLayer\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m138\u001b[0m) │ \u001b[38;5;34m0\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ lstm (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m51,968\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ lstm_1 (\u001b[38;5;33mLSTM\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m12,416\u001b[0m │\n",
"├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m) │ \u001b[38;5;34m330\u001b[0m │\n",
"└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">64,714</span> (252.79 KB)\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m64,714\u001b[0m (252.79 KB)\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">64,714</span> (252.79 KB)\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m64,714\u001b[0m (252.79 KB)\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
},
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
"</pre>\n"
2024-11-27 01:22:26 +03:30
],
"text/plain": [
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
2024-11-25 11:22:29 +03:30
]
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
}
],
"source": [
"m2.summary()"
]
},
{
"cell_type": "markdown",
"id": "ac325eb7",
"metadata": {
"id": "ac325eb7"
},
"source": [
"<h3 align='center' dir='rtl'>اموزش مدل</h3>"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "c5e948ab",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "c5e948ab",
2024-11-27 01:22:26 +03:30
"outputId": "558b2117-9d0d-4734-e6d8-5ae549fb0c14",
"scrolled": true
2024-11-25 11:22:29 +03:30
},
"outputs": [
{
"name": "stdout",
2024-11-27 01:22:26 +03:30
"output_type": "stream",
2024-11-25 11:22:29 +03:30
"text": [
"Epoch 1/3\n",
"\u001b[1m1875/1875\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m437s\u001b[0m 126ms/step - loss: 0.3255 - metric: 0.8450\n",
"Epoch 2/3\n",
"\u001b[1m1875/1875\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m252s\u001b[0m 121ms/step - loss: 0.0815 - metric: 0.9786\n",
"Epoch 3/3\n",
"\u001b[1m1875/1875\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m272s\u001b[0m 127ms/step - loss: 0.0633 - metric: 0.9833\n"
]
},
{
"data": {
"text/plain": [
"<keras.src.callbacks.history.History at 0x7ed72d47f6d0>"
]
},
2024-11-27 01:22:26 +03:30
"execution_count": 10,
2024-11-25 11:22:29 +03:30
"metadata": {},
2024-11-27 01:22:26 +03:30
"output_type": "execute_result"
2024-11-25 11:22:29 +03:30
}
],
"source": [
"model.fit(train_set[0], train_set[1], epochs=3, batch_size=32)"
]
},
{
"cell_type": "markdown",
"id": "a42879cd",
"metadata": {
"id": "a42879cd"
},
"source": [
"<h2 align='center' dir='rtl'>اماده سازی نمونه ها و محاسبه اهمیت هر نمونه نسبت به حضور دیگر نمونه ها</h2>"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "2a669978",
"metadata": {
"id": "2a669978"
},
"outputs": [],
"source": [
"def get_samples(sample_ind, batch_size=64):\n",
"\n",
" # اماده سازی نمونه ها\n",
" sample_image = test_set[0][sample_ind:sample_ind+batch_size,...]\n",
" sample_label = test_set[1][sample_ind:sample_ind+batch_size,...]\n",
" return sample_image, sample_label"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "c910c017",
"metadata": {
"id": "c910c017"
},
"outputs": [],
"source": [
"def get_imporance_function(sample_ind):\n",
" loss_fnc = tf.keras.losses.SparseCategoricalCrossentropy(reduction='none', from_logits=False)\n",
" img, lbl = get_samples(sample_ind, 1)\n",
" def get_batch_importance(batch_ind, batch_size=64):\n",
" sample_images, sample_labels = get_samples(batch_ind, batch_size)\n",
" sample_images = np.concatenate([img, sample_images])\n",
" sample_labels = np.concatenate([lbl, sample_labels])\n",
"\n",
" probs_vec, probs_mtx = model.call_at_zero([sample_images, sample_labels])\n",
" samples = probs_mtx.numpy()\n",
" probs_vec = probs_vec.numpy()\n",
"\n",
" m = samples.mean(axis=0)\n",
"\n",
" # حذف نمونه مورد مطالعه و مشاهده تاثیر حضور دیگر نمونه و عدم حضور نمونه بر پیس بینی\n",
" sample_output = samples.sum(axis=0, keepdims=True) - samples\n",
" sample_output = sample_output/(batch_size-1)\n",
" loss_with_sample = loss_fnc(lbl, m)\n",
" loss_without_sample = loss_fnc(tf.repeat(lbl[tf.newaxis, ...], repeats=batch_size, axis=0), sample_output)\n",
" sample_importance = loss_with_sample-loss_without_sample\n",
" return sample_images[1:,...], sample_importance, probs_vec, samples\n",
" return get_batch_importance, img, lbl"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "a4761918",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "a4761918",
"outputId": "1ca243ec-9aaa-4974-a37e-ced6ac5fd023"
},
"outputs": [
{
"name": "stdout",
2024-11-27 01:22:26 +03:30
"output_type": "stream",
2024-11-25 11:22:29 +03:30
"text": [
"(64, 1, 138)\n"
]
}
],
"source": [
"batch_ind = 5888\n",
"batch_ind = 4498\n",
"batch_ind = 1522\n",
"batch_ind = 625\n",
"batch_ind = 9698\n",
"\n",
"batch_size = 64\n",
"\n",
"batch_ind = batch_ind+1\n",
"\n",
"sample_ind = batch_ind-1\n",
"importance_function_batch, img, lbl = get_imporance_function(sample_ind)\n",
"sample_images, importance, probs_vec, sample_output = importance_function_batch(batch_ind)"
]
},
{
"cell_type": "markdown",
"id": "52cfc350",
"metadata": {
"id": "52cfc350"
},
"source": [
"<h2 align='center' dir='rtl'>مشاهده تاثیر دیگر نمونه ها بر پیش بینی مدل</h2>"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "7b17b3c2",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 486
},
"id": "7b17b3c2",
"outputId": "ef8a4779-5ce3-4cee-8d18-c45702d4ca5a"
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7ed6fbfbad40>"
]
},
2024-11-27 01:22:26 +03:30
"execution_count": 26,
2024-11-25 11:22:29 +03:30
"metadata": {},
2024-11-27 01:22:26 +03:30
"output_type": "execute_result"
2024-11-25 11:22:29 +03:30
},
{
"data": {
2024-11-27 01:22:26 +03:30
"image/png": "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IEBXX3211q5de84xVq1apeTkZAUEBOiqq67Sli1bvI8dPXpUI0aMUFxcnIKCgtS1a1f93//93znPUVZWprFjxyosLEwRERGaOHGiPB6P9/GzlwJV9RozMjK0f/9+XXvttZKkFi1ayGKx6Pe//72kc5cCXexr++OPPyotLU0tWrRQcHCwrrjiCn388cfV+bIDtWfixPLyZNKk8jJFqlyqVDWTBWjEKFYAAEC9lZ2draioqErboqKiVFBQoFOnTlU5xul0qqCgoNKtJjwej06WlJlyO/NNe3W8+eabioiI0Jo1a/TAAw/o/vvv16233qq+fftq/fr1uv7663XHHXfo5MmTkqTDhw9r8ODBuvLKK7Vx40a9+uqrmjt3rp599lnvcz766KP66quv9OGHH+rTTz/VihUrtH79+krHHTt2rFavXq23335bmzZt0q233qobbrhBu3btqlH+Rx99VA8//LA2bNigPn36KC0tTUePHq20z/jx4zVt2jRt27ZNycnJeuyxx/Tee+/pzTff1Pr169WuXTsNGjRIx44dO+e5p0+frrVr16pVq1ZKS0vzXna4uLhYPXr00JIlS7Rlyxbde++9uuOOO7RmzZpzvr52u11r1qzRSy+9pBkzZuj111+v0WuUypcFvffee5KkHTt2KCsrSy+99FKV+17saztmzBg5nU59/fXX2rx5s55//nk1a9asxpmAS3ZmueLvT6mCJq3+zKUEAACoBVOnTtVTTz1lePypUpc6T1pWi4mq74enBynIUf0/z1JSUvTEE09IkiZMmKBp06YpIiJC99xzjyRp0qRJevXVV7Vp0yZdddVVeuWVV5SQkKBZs2bJYrGoU6dOyszM1OOPP65Jkybp5MmTmjt3rv7xj3/ouuuuk1ReLsTHx3uPeeDAAb3xxhs6cOCAYmNjJUmPPPKIli5dqjfeeENTpkypdv6xY8fqlltukSS9+uqrWrp0qebOnavHHnvMu8/TTz+tgQMHSiqfTfPqq69q/vz53iVlc+bM0Weffaa5c+fq0Ucf9Y6bPHmyd1zFa1i0aJFuu+02xcXF6ZFHHvHu+8ADD2jZsmV655131KtXL+/2hIQEvfjii7JYLOrYsaM2b96sF1980fv1rS6bzeZd8hMZGXneE/tW52t74MAB3XLLLerataskqW3btjXKAtSqiROlZ5+VSkokh4NSBU0WxQoAAKi3oqOjlZOTU2lbTk6OQkNDFRgYWOWYCRMmKD093Xu/oKBACQkJdZrTLMnJyd7PbTabWrZs6X3DLck72yc3N1eStG3bNvXp00cWi8W7T79+/VRYWKhDhw7p+PHjKikpUe/evb2Ph4eHq2PHjt77mzdvlsvlUocOHSplcTqdatmyZY3y9+nTx/u53W5Xz549tW3btkr79OzZ0/v5nj17VFpaqn79+nm3+fn5qVevXueMO/O5K15DxT4ul0tTpkzRO++8o8OHD6ukpEROp1NBQUGVnuOqq66q9LXq06ePpk+fLpfLJZvNVqPXWh3V+dr+8Y9/1P33369PP/1UAwYM0C233FLp5wDwqWee+blUKSkpv0+5giaIYgUAANRbffr0Oef8EZ999lmlN81n8/f3l7+/v+FjBvrZ9MPT5pwYN9CvZm/Wz76ajMViqbStohRwu92XHu60wsJC2Ww2r
2024-11-25 11:22:29 +03:30
"text/plain": [
"<Figure size 1500x500 with 2 Axes>"
2024-11-27 01:22:26 +03:30
]
2024-11-25 11:22:29 +03:30
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
}
],
"source": [
"plt.figure(figsize=(15,5))\n",
"plt.subplot(121)\n",
"plt.imshow(img[0])\n",
"plt.title(lbl[0])\n",
"plt.axis('off')\n",
"\n",
"plt.subplot(122)\n",
"plt.plot(probs_vec, label='model probabilities')\n",
"plt.plot(lbl, 1, 'rx', label='correct label')\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "e1124039",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "e1124039",
"outputId": "25b8e29e-4df6-4568-a5e1-b11add567f33"
},
"outputs": [
{
"data": {
2024-11-27 01:22:26 +03:30
"image/png": "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
2024-11-25 11:22:29 +03:30
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
2024-11-27 01:22:26 +03:30
]
2024-11-25 11:22:29 +03:30
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
},
{
"data": {
2024-11-27 01:22:26 +03:30
"image/png": "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
2024-11-25 11:22:29 +03:30
"text/plain": [
"<Figure size 1500x1500 with 64 Axes>"
2024-11-27 01:22:26 +03:30
]
2024-11-25 11:22:29 +03:30
},
2024-11-27 01:22:26 +03:30
"metadata": {},
"output_type": "display_data"
2024-11-25 11:22:29 +03:30
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"import numpy as np\n",
"\n",
"inds = np.argsort(importance)\n",
"plt.figure()\n",
"plt.plot(sample_output[inds[:5]].mean(axis=0))\n",
"\n",
"\n",
"plt.figure(figsize=(15,15))\n",
"for i in range(len(inds)):\n",
" plt.subplot(batch_size//8+1, 8, i+1)\n",
" plt.imshow(sample_images[inds[i],...])\n",
" plt.title(\"%.7f\"%(importance[inds[i]]))\n",
" plt.axis('off')"
]
}
],
"metadata": {
2024-11-27 01:22:26 +03:30
"colab": {
"provenance": []
},
2024-11-25 11:22:29 +03:30
"kernelspec": {
"display_name": "CV",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
2024-11-27 01:22:26 +03:30
}