{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_qint8 = np.dtype([(\"qint8\", np.int8, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_quint8 = np.dtype([(\"quint8\", np.uint8, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_qint16 = np.dtype([(\"qint16\", np.int16, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_quint16 = np.dtype([(\"quint16\", np.uint16, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " _np_qint32 = np.dtype([(\"qint32\", np.int32, 1)])\n", "/netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.\n", " np_resource = np.dtype([(\"resource\", np.ubyte, 1)])\n" ] } ], "source": [ "import numpy as np\n", "import keras\n", "import sys\n", "import os, glob\n", "from keras.models import Model\n", "import tensorflow as tf\n", "from keras.utils import Sequence\n", "from keras.optimizers import Adam\n", "from keras.callbacks import ModelCheckpoint, LearningRateScheduler\n", "#from IPython.display import clear_output\n", "import tqdm \n", "import math\n", "\n", "sys.path.append('../src')\n", "\n", "from util import get_model_by_name\n", "\n", "from sal_imp_utilities import *\n", "from cb import InteractivePlot\n", "\n", "config = tf.ConfigProto()\n", "config.gpu_options.allow_growth = True\n", "sess = tf.Session(config=config)\n", "\n", "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mon May 9 14:23:41 2022 \n", "+-----------------------------------------------------------------------------+\n", "| NVIDIA-SMI 470.103.01 Driver Version: 470.103.01 CUDA Version: 11.4 |\n", "|-------------------------------+----------------------+----------------------+\n", "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", "| | | MIG M. |\n", "|===============================+======================+======================|\n", "| 0 NVIDIA GeForce ... Off | 00000000:29:00.0 On | N/A |\n", "| 30% 41C P2 38W / 184W | 975MiB / 7959MiB | 5% Default |\n", "| | | N/A |\n", "+-------------------------------+----------------------+----------------------+\n", " \n", "+-----------------------------------------------------------------------------+\n", "| Processes: |\n", "| GPU GI CI PID Type Process name GPU Memory |\n", "| ID ID Usage |\n", "|=============================================================================|\n", "| 0 N/A N/A 1377 G /usr/lib/xorg/Xorg 95MiB |\n", "| 0 N/A N/A 2243 G /usr/lib/xorg/Xorg 432MiB |\n", "| 0 N/A N/A 2378 G /usr/bin/gnome-shell 72MiB |\n", "| 0 N/A N/A 3521 G ...AAAAAAAAA= --shared-files 16MiB |\n", "| 0 N/A N/A 5912 G ...RendererForSitePerProcess 103MiB |\n", "| 0 N/A N/A 18975 G ...sktop/bin/mendeleydesktop 42MiB |\n", "| 0 N/A N/A 168057 G ...178058406726361824,131072 78MiB |\n", "| 0 N/A N/A 178813 C .../envs/tf-cuda9/bin/python 87MiB |\n", "+-----------------------------------------------------------------------------+\n" ] } ], "source": [ "%%bash\n", "nvidia-smi" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'0'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "os.environ[\"CUDA_VISIBLE_DEVICES\"] = '0'\n", "os.environ[\"CUDA_VISIBLE_DEVICES\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ENV" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "data_path = '/your/path/VisRecall/'\n", "# 0: T, 1: FE, 2: F, 3: RV, 4: U\n", "TYPE = 0\n", "split = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Load data" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "TYPE_Q = ['T','FE','F','RV','U']\n", "bp_imp = data_path + 'merged/src/'\n", "training_set = np.load(data_path + 'training_data/%s-question/train_split%d.npy'%(TYPE_Q[TYPE], split),allow_pickle=True)\n", "val_set = np.load(data_path + 'training_data/%s-question/val_split%d.npy'%(TYPE_Q[TYPE], split),allow_pickle=True)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "train_filename = []\n", "train_label = []\n", "train_mean = []\n", "train_type = []\n", "\n", "for data in training_set:\n", " one_hot = [0,0,0,0,0,0]\n", " one_hot[data['vistype']] = 1\n", " train_filename.append(bp_imp+data['name'])\n", " train_label.append(one_hot)\n", " train_mean.append(data['norm_mean_acc_withD'])\n", " train_type.append(data['norm_%d_withD'%(TYPE)])\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "val_filename = []\n", "val_label = []\n", "val_mean = []\n", "val_type = []\n", "for data in val_set:\n", " one_hot = [0,0,0,0,0,0]\n", " one_hot[data['vistype']] = 1\n", " val_filename.append(bp_imp+data['name'])\n", " val_label.append(one_hot)\n", " val_mean.append(data['norm_mean_acc_withD'])\n", " val_type.append(data['norm_%d_withD'%(TYPE)])\n", "#val_filename" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Model and training params" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# FILL THESE IN: set training parameters \n", "ckpt_savedir = \"ckpt\"\n", "\n", "load_weights = False\n", "weightspath = \"\"\n", "\n", "batch_size = 4\n", "init_lr = 0.002\n", "lr_reduce_by = .1\n", "reduce_at_epoch = 3\n", "n_epochs = 15\n", "\n", "opt = Adam(lr=init_lr) \n", "\n", "\n", "model_name = \"RecallNet_xception\"\n", "\n", "model_inp_size = (240, 320)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "input_shape = model_inp_size + (3,)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "WARNING:tensorflow:From /netpool/homes/wangyo/.conda/envs/tf-cuda9/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:4070: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.\n", "\n", "xception output shapes: (?, 30, 40, 2048)\n", "Model: \"model_1\"\n", "__________________________________________________________________________________________________\n", "Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", "input_1 (InputLayer) (None, 240, 320, 3) 0 \n", "__________________________________________________________________________________________________\n", "block1_conv1 (Conv2D) (None, 119, 159, 32) 864 input_1[0][0] \n", "__________________________________________________________________________________________________\n", "block1_conv1_bn (BatchNormaliza (None, 119, 159, 32) 128 block1_conv1[0][0] \n", "__________________________________________________________________________________________________\n", "block1_conv1_act (Activation) (None, 119, 159, 32) 0 block1_conv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block1_conv2 (Conv2D) (None, 117, 157, 64) 18432 block1_conv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block1_conv2_bn (BatchNormaliza (None, 117, 157, 64) 256 block1_conv2[0][0] \n", "__________________________________________________________________________________________________\n", "block1_conv2_act (Activation) (None, 117, 157, 64) 0 block1_conv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block2_sepconv1 (SeparableConv2 (None, 117, 157, 128 8768 block1_conv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block2_sepconv1_bn (BatchNormal (None, 117, 157, 128 512 block2_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block2_sepconv2_act (Activation (None, 117, 157, 128 0 block2_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block2_sepconv2 (SeparableConv2 (None, 117, 157, 128 17536 block2_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block2_sepconv2_bn (BatchNormal (None, 117, 157, 128 512 block2_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_1 (Conv2D) (None, 59, 79, 128) 8192 block1_conv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block2_pool (MaxPooling2D) (None, 59, 79, 128) 0 block2_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_1 (BatchNor (None, 59, 79, 128) 512 conv2d_1[0][0] \n", "__________________________________________________________________________________________________\n", "add_1 (Add) (None, 59, 79, 128) 0 block2_pool[0][0] \n", " batch_normalization_1[0][0] \n", "__________________________________________________________________________________________________\n", "block3_sepconv1_act (Activation (None, 59, 79, 128) 0 add_1[0][0] \n", "__________________________________________________________________________________________________\n", "block3_sepconv1 (SeparableConv2 (None, 59, 79, 256) 33920 block3_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block3_sepconv1_bn (BatchNormal (None, 59, 79, 256) 1024 block3_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block3_sepconv2_act (Activation (None, 59, 79, 256) 0 block3_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block3_sepconv2 (SeparableConv2 (None, 59, 79, 256) 67840 block3_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block3_sepconv2_bn (BatchNormal (None, 59, 79, 256) 1024 block3_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_2 (Conv2D) (None, 30, 40, 256) 32768 add_1[0][0] \n", "__________________________________________________________________________________________________\n", "block3_pool (MaxPooling2D) (None, 30, 40, 256) 0 block3_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_2 (BatchNor (None, 30, 40, 256) 1024 conv2d_2[0][0] \n", "__________________________________________________________________________________________________\n", "add_2 (Add) (None, 30, 40, 256) 0 block3_pool[0][0] \n", " batch_normalization_2[0][0] \n", "__________________________________________________________________________________________________\n", "block4_sepconv1_act (Activation (None, 30, 40, 256) 0 add_2[0][0] \n", "__________________________________________________________________________________________________\n", "block4_sepconv1 (SeparableConv2 (None, 30, 40, 728) 188672 block4_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block4_sepconv1_bn (BatchNormal (None, 30, 40, 728) 2912 block4_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block4_sepconv2_act (Activation (None, 30, 40, 728) 0 block4_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block4_sepconv2 (SeparableConv2 (None, 30, 40, 728) 536536 block4_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block4_sepconv2_bn (BatchNormal (None, 30, 40, 728) 2912 block4_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_3 (Conv2D) (None, 30, 40, 728) 186368 add_2[0][0] \n", "__________________________________________________________________________________________________\n", "block4_pool (MaxPooling2D) (None, 30, 40, 728) 0 block4_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_3 (BatchNor (None, 30, 40, 728) 2912 conv2d_3[0][0] \n", "__________________________________________________________________________________________________\n", "add_3 (Add) (None, 30, 40, 728) 0 block4_pool[0][0] \n", " batch_normalization_3[0][0] \n", "__________________________________________________________________________________________________\n", "block5_sepconv1_act (Activation (None, 30, 40, 728) 0 add_3[0][0] \n", "__________________________________________________________________________________________________\n", "block5_sepconv1 (SeparableConv2 (None, 30, 40, 728) 536536 block5_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block5_sepconv1_bn (BatchNormal (None, 30, 40, 728) 2912 block5_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block5_sepconv2_act (Activation (None, 30, 40, 728) 0 block5_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block5_sepconv2 (SeparableConv2 (None, 30, 40, 728) 536536 block5_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block5_sepconv2_bn (BatchNormal (None, 30, 40, 728) 2912 block5_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "block5_sepconv3_act (Activation (None, 30, 40, 728) 0 block5_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block5_sepconv3 (SeparableConv2 (None, 30, 40, 728) 536536 block5_sepconv3_act[0][0] \n", "__________________________________________________________________________________________________\n", "block5_sepconv3_bn (BatchNormal (None, 30, 40, 728) 2912 block5_sepconv3[0][0] \n", "__________________________________________________________________________________________________\n", "add_4 (Add) (None, 30, 40, 728) 0 block5_sepconv3_bn[0][0] \n", " add_3[0][0] \n", "__________________________________________________________________________________________________\n", "block6_sepconv1_act (Activation (None, 30, 40, 728) 0 add_4[0][0] \n", "__________________________________________________________________________________________________\n", "block6_sepconv1 (SeparableConv2 (None, 30, 40, 728) 536536 block6_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block6_sepconv1_bn (BatchNormal (None, 30, 40, 728) 2912 block6_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block6_sepconv2_act (Activation (None, 30, 40, 728) 0 block6_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block6_sepconv2 (SeparableConv2 (None, 30, 40, 728) 536536 block6_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block6_sepconv2_bn (BatchNormal (None, 30, 40, 728) 2912 block6_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "block6_sepconv3_act (Activation (None, 30, 40, 728) 0 block6_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block6_sepconv3 (SeparableConv2 (None, 30, 40, 728) 536536 block6_sepconv3_act[0][0] \n", "__________________________________________________________________________________________________\n", "block6_sepconv3_bn (BatchNormal (None, 30, 40, 728) 2912 block6_sepconv3[0][0] \n", "__________________________________________________________________________________________________\n", "add_5 (Add) (None, 30, 40, 728) 0 block6_sepconv3_bn[0][0] \n", " add_4[0][0] \n", "__________________________________________________________________________________________________\n", "block7_sepconv1_act (Activation (None, 30, 40, 728) 0 add_5[0][0] \n", "__________________________________________________________________________________________________\n", "block7_sepconv1 (SeparableConv2 (None, 30, 40, 728) 536536 block7_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block7_sepconv1_bn (BatchNormal (None, 30, 40, 728) 2912 block7_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block7_sepconv2_act (Activation (None, 30, 40, 728) 0 block7_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block7_sepconv2 (SeparableConv2 (None, 30, 40, 728) 536536 block7_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block7_sepconv2_bn (BatchNormal (None, 30, 40, 728) 2912 block7_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "block7_sepconv3_act (Activation (None, 30, 40, 728) 0 block7_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block7_sepconv3 (SeparableConv2 (None, 30, 40, 728) 536536 block7_sepconv3_act[0][0] \n", "__________________________________________________________________________________________________\n", "block7_sepconv3_bn (BatchNormal (None, 30, 40, 728) 2912 block7_sepconv3[0][0] \n", "__________________________________________________________________________________________________\n", "add_6 (Add) (None, 30, 40, 728) 0 block7_sepconv3_bn[0][0] \n", " add_5[0][0] \n", "__________________________________________________________________________________________________\n", "block8_sepconv1_act (Activation (None, 30, 40, 728) 0 add_6[0][0] \n", "__________________________________________________________________________________________________\n", "block8_sepconv1 (SeparableConv2 (None, 30, 40, 728) 536536 block8_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block8_sepconv1_bn (BatchNormal (None, 30, 40, 728) 2912 block8_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block8_sepconv2_act (Activation (None, 30, 40, 728) 0 block8_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block8_sepconv2 (SeparableConv2 (None, 30, 40, 728) 536536 block8_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block8_sepconv2_bn (BatchNormal (None, 30, 40, 728) 2912 block8_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "block8_sepconv3_act (Activation (None, 30, 40, 728) 0 block8_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block8_sepconv3 (SeparableConv2 (None, 30, 40, 728) 536536 block8_sepconv3_act[0][0] \n", "__________________________________________________________________________________________________\n", "block8_sepconv3_bn (BatchNormal (None, 30, 40, 728) 2912 block8_sepconv3[0][0] \n", "__________________________________________________________________________________________________\n", "add_7 (Add) (None, 30, 40, 728) 0 block8_sepconv3_bn[0][0] \n", " add_6[0][0] \n", "__________________________________________________________________________________________________\n", "block9_sepconv1_act (Activation (None, 30, 40, 728) 0 add_7[0][0] \n", "__________________________________________________________________________________________________\n", "block9_sepconv1 (SeparableConv2 (None, 30, 40, 728) 536536 block9_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block9_sepconv1_bn (BatchNormal (None, 30, 40, 728) 2912 block9_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block9_sepconv2_act (Activation (None, 30, 40, 728) 0 block9_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block9_sepconv2 (SeparableConv2 (None, 30, 40, 728) 536536 block9_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block9_sepconv2_bn (BatchNormal (None, 30, 40, 728) 2912 block9_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "block9_sepconv3_act (Activation (None, 30, 40, 728) 0 block9_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block9_sepconv3 (SeparableConv2 (None, 30, 40, 728) 536536 block9_sepconv3_act[0][0] \n", "__________________________________________________________________________________________________\n", "block9_sepconv3_bn (BatchNormal (None, 30, 40, 728) 2912 block9_sepconv3[0][0] \n", "__________________________________________________________________________________________________\n", "add_8 (Add) (None, 30, 40, 728) 0 block9_sepconv3_bn[0][0] \n", " add_7[0][0] \n", "__________________________________________________________________________________________________\n", "block10_sepconv1_act (Activatio (None, 30, 40, 728) 0 add_8[0][0] \n", "__________________________________________________________________________________________________\n", "block10_sepconv1 (SeparableConv (None, 30, 40, 728) 536536 block10_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block10_sepconv1_bn (BatchNorma (None, 30, 40, 728) 2912 block10_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block10_sepconv2_act (Activatio (None, 30, 40, 728) 0 block10_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block10_sepconv2 (SeparableConv (None, 30, 40, 728) 536536 block10_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block10_sepconv2_bn (BatchNorma (None, 30, 40, 728) 2912 block10_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "block10_sepconv3_act (Activatio (None, 30, 40, 728) 0 block10_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block10_sepconv3 (SeparableConv (None, 30, 40, 728) 536536 block10_sepconv3_act[0][0] \n", "__________________________________________________________________________________________________\n", "block10_sepconv3_bn (BatchNorma (None, 30, 40, 728) 2912 block10_sepconv3[0][0] \n", "__________________________________________________________________________________________________\n", "add_9 (Add) (None, 30, 40, 728) 0 block10_sepconv3_bn[0][0] \n", " add_8[0][0] \n", "__________________________________________________________________________________________________\n", "block11_sepconv1_act (Activatio (None, 30, 40, 728) 0 add_9[0][0] \n", "__________________________________________________________________________________________________\n", "block11_sepconv1 (SeparableConv (None, 30, 40, 728) 536536 block11_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block11_sepconv1_bn (BatchNorma (None, 30, 40, 728) 2912 block11_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block11_sepconv2_act (Activatio (None, 30, 40, 728) 0 block11_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block11_sepconv2 (SeparableConv (None, 30, 40, 728) 536536 block11_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block11_sepconv2_bn (BatchNorma (None, 30, 40, 728) 2912 block11_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "block11_sepconv3_act (Activatio (None, 30, 40, 728) 0 block11_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block11_sepconv3 (SeparableConv (None, 30, 40, 728) 536536 block11_sepconv3_act[0][0] \n", "__________________________________________________________________________________________________\n", "block11_sepconv3_bn (BatchNorma (None, 30, 40, 728) 2912 block11_sepconv3[0][0] \n", "__________________________________________________________________________________________________\n", "add_10 (Add) (None, 30, 40, 728) 0 block11_sepconv3_bn[0][0] \n", " add_9[0][0] \n", "__________________________________________________________________________________________________\n", "block12_sepconv1_act (Activatio (None, 30, 40, 728) 0 add_10[0][0] \n", "__________________________________________________________________________________________________\n", "block12_sepconv1 (SeparableConv (None, 30, 40, 728) 536536 block12_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block12_sepconv1_bn (BatchNorma (None, 30, 40, 728) 2912 block12_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block12_sepconv2_act (Activatio (None, 30, 40, 728) 0 block12_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block12_sepconv2 (SeparableConv (None, 30, 40, 728) 536536 block12_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block12_sepconv2_bn (BatchNorma (None, 30, 40, 728) 2912 block12_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "block12_sepconv3_act (Activatio (None, 30, 40, 728) 0 block12_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block12_sepconv3 (SeparableConv (None, 30, 40, 728) 536536 block12_sepconv3_act[0][0] \n", "__________________________________________________________________________________________________\n", "block12_sepconv3_bn (BatchNorma (None, 30, 40, 728) 2912 block12_sepconv3[0][0] \n", "__________________________________________________________________________________________________\n", "add_11 (Add) (None, 30, 40, 728) 0 block12_sepconv3_bn[0][0] \n", " add_10[0][0] \n", "__________________________________________________________________________________________________\n", "block13_sepconv1_act (Activatio (None, 30, 40, 728) 0 add_11[0][0] \n", "__________________________________________________________________________________________________\n", "block13_sepconv1 (SeparableConv (None, 30, 40, 728) 536536 block13_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block13_sepconv1_bn (BatchNorma (None, 30, 40, 728) 2912 block13_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block13_sepconv2_act (Activatio (None, 30, 40, 728) 0 block13_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block13_sepconv2 (SeparableConv (None, 30, 40, 1024) 752024 block13_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "block13_sepconv2_bn (BatchNorma (None, 30, 40, 1024) 4096 block13_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "conv2d_4 (Conv2D) (None, 30, 40, 1024) 745472 add_11[0][0] \n", "__________________________________________________________________________________________________\n", "block13_pool (MaxPooling2D) (None, 30, 40, 1024) 0 block13_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "batch_normalization_4 (BatchNor (None, 30, 40, 1024) 4096 conv2d_4[0][0] \n", "__________________________________________________________________________________________________\n", "add_12 (Add) (None, 30, 40, 1024) 0 block13_pool[0][0] \n", " batch_normalization_4[0][0] \n", "__________________________________________________________________________________________________\n", "block14_sepconv1 (SeparableConv (None, 30, 40, 1536) 1582080 add_12[0][0] \n", "__________________________________________________________________________________________________\n", "block14_sepconv1_bn (BatchNorma (None, 30, 40, 1536) 6144 block14_sepconv1[0][0] \n", "__________________________________________________________________________________________________\n", "block14_sepconv1_act (Activatio (None, 30, 40, 1536) 0 block14_sepconv1_bn[0][0] \n", "__________________________________________________________________________________________________\n", "block14_sepconv2 (SeparableConv (None, 30, 40, 2048) 3159552 block14_sepconv1_act[0][0] \n", "__________________________________________________________________________________________________\n", "block14_sepconv2_bn (BatchNorma (None, 30, 40, 2048) 8192 block14_sepconv2[0][0] \n", "__________________________________________________________________________________________________\n", "block14_sepconv2_act (Activatio (None, 30, 40, 2048) 0 block14_sepconv2_bn[0][0] \n", "__________________________________________________________________________________________________\n", "global_conv (Conv2D) (None, 10, 14, 256) 4718592 block14_sepconv2_act[0][0] \n", "__________________________________________________________________________________________________\n", "global_BN (BatchNormalization) (None, 10, 14, 256) 1024 global_conv[0][0] \n", "__________________________________________________________________________________________________\n", "activation_1 (Activation) (None, 10, 14, 256) 0 global_BN[0][0] \n", "__________________________________________________________________________________________________\n", "dropout_1 (Dropout) (None, 10, 14, 256) 0 activation_1[0][0] \n", "__________________________________________________________________________________________________\n", "global_average_pooling2d_1 (Glo (None, 256) 0 dropout_1[0][0] \n", "__________________________________________________________________________________________________\n", "global_dense (Dense) (None, 256) 65792 global_average_pooling2d_1[0][0] \n", "__________________________________________________________________________________________________\n", "dropout_2 (Dropout) (None, 256) 0 global_dense[0][0] \n", "__________________________________________________________________________________________________\n", "out_mean_acc (Dense) (None, 1) 257 dropout_2[0][0] \n", "__________________________________________________________________________________________________\n", "out_type0_acc (Dense) (None, 1) 257 dropout_2[0][0] \n", "==================================================================================================\n", "Total params: 25,647,402\n", "Trainable params: 25,592,362\n", "Non-trainable params: 55,040\n", "__________________________________________________________________________________________________\n" ] } ], "source": [ "# get model \n", "model_params = {\n", " 'input_shape': input_shape,\n", " #'n_outs': len(losses),\n", " 'n_outs': 2\n", "}\n", "model_func, mode = get_model_by_name(model_name)\n", "#assert mode == \"simple\", \"%s is a multi-duration model! Please use the multi-duration notebook to train.\" % model_name\n", "model = model_func(**model_params)\n", "\n", "if load_weights: \n", " model.load_weights(weightspath)\n", " print(\"load\")" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checkpoints will be saved with format ckpt/RecallNet_xception/RecallNet_xception_ep{epoch:02d}_valloss{val_loss:.4f}.hdf5\n" ] } ], "source": [ "# set up data generation and checkpoints\n", "if not os.path.exists(ckpt_savedir): \n", " os.makedirs(ckpt_savedir)\n", "\n", "\n", "# Generators\n", "gen_train = RecallNet_Generator(train_filename,\n", " train_label,\n", " train_mean,\n", " train_type,\n", " batch_size = 4)\n", "\n", "gen_val = RecallNet_Generator(val_filename,\n", " val_label,\n", " val_mean,\n", " val_type,\n", " 1)\n", "\n", "# Callbacks\n", "\n", "# where to save checkpoints\n", "#filepath = os.path.join(ckpt_savedir, dataset_sal + \"_\" + l_str + '_ep{epoch:02d}_valloss{val_loss:.4f}.hdf5')\n", "filepath = os.path.join(ckpt_savedir, model_name, model_name+'_ep{epoch:02d}_valloss{val_loss:.4f}.hdf5')\n", "\n", "print(\"Checkpoints will be saved with format %s\" % filepath)\n", "\n", "cb_chk = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_weights_only=False, period=1)\n", "cb_plot = InteractivePlot()\n", "\n", "def step_decay(epoch):\n", " lrate = init_lr * math.pow(lr_reduce_by, math.floor((1+epoch)/reduce_at_epoch))\n", " if epoch%reduce_at_epoch:\n", " print('Reducing lr. New lr is:', lrate)\n", " return lrate\n", "cb_sched = LearningRateScheduler(step_decay)\n", "\n", "cbs = [cb_chk, cb_sched, cb_plot]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([0.74688797, 0.84647303, 0.93360996, 0.8340249 ]), array([0.7826087 , 0.95652174, 1. , 0.86956522])]\n" ] } ], "source": [ "#test the generator \n", "batch_img, out= gen_train.__getitem__(1)\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Train" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#model.compile(optimizer=opt, loss={'out_mean_acc': 'mean_squared_error', 'out_type0_acc':'mean_squared_error','out_classif':'binary_crossentropy'}, loss_weights={'out_mean_acc': 3, 'out_type0_acc': 3, 'out_classif': 1})\n", "model.compile(optimizer=opt, loss={'out_mean_acc': 'mean_squared_error', 'out_type0_acc':'mean_squared_error'}, loss_weights={'out_mean_acc': 1, 'out_type0_acc': 1})\n", "\n", "print('Ready to train')\n", "model.fit_generator(gen_train, epochs=n_epochs, verbose=1, callbacks=cbs, validation_data=gen_val, max_queue_size=10, workers=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## validation" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "load\n" ] } ], "source": [ "data_path = '/your/path/VisRecall/'\n", "\n", "if True:\n", " W = \"./ckpt/RecallNet/U-question/Fold4/RecallNet_xception_ep10_valloss0.0313.hdf5\"\n", " model.load_weights(W)\n", " print('load')" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "avg, type: 0.02553353417062307 0.02617591625785007\n" ] } ], "source": [ "from sklearn.metrics import mean_squared_error\n", "\n", "mean_list = []\n", "type_list = []\n", "\n", "num_t = 0.0\n", "\n", "for i in range(len(val_filename)):\n", " img = preprocess_images([val_filename[i]], 240, 320)\n", " preds = model.predict(img)\n", " #if(np.argmax(preds[2][0]) == np.argmax(val_label[i])):\n", " # num_t += 1\n", " mean_acc = preds[0][0]\n", " type_acc = preds[1][0]\n", " mean_list.append(mean_squared_error([val_mean[i]], mean_acc))\n", " type_list.append(mean_squared_error([val_type[i]], type_acc))\n", " #print(val_label[i])\n", "\n", "#print('classificaion: ', num_t/len(val_filename))\n", "print('avg, type: ', np.mean(mean_list),np.mean(type_list))\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "from sklearn.metrics import mean_squared_error" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "load\n", "[(0.1154690275375791, 0.07620564377135046)]\n", "load\n", "[(0.1154690275375791, 0.07620564377135046), (0.10878741427577963, 0.2667425108749781)]\n", "load\n", "[(0.1154690275375791, 0.07620564377135046), (0.10878741427577963, 0.2667425108749781), (0.5932855723937102, 0.38129302771926993)]\n", "load\n", "[(0.1154690275375791, 0.07620564377135046), (0.10878741427577963, 0.2667425108749781), (0.5932855723937102, 0.38129302771926993), (0.015003968232081454, 0.06507362662601399)]\n", "load\n", "[(0.1154690275375791, 0.07620564377135046), (0.10878741427577963, 0.2667425108749781), (0.5932855723937102, 0.38129302771926993), (0.015003968232081454, 0.06507362662601399), (0.02553353417062307, 0.02617591625785007)]\n" ] } ], "source": [ "# 0: T, 1: FE, 2: F, 3: RV, 4: U\n", "TYPE = 4\n", "final = []\n", "for split in range(5):\n", " TYPE_Q = ['T','FE','F','RV','U']\n", " bp_imp = data_path + 'merged/src/'\n", " training_set = np.load(data_path + 'training_data/%s-question/train_split%d.npy'%(TYPE_Q[TYPE], split),allow_pickle=True)\n", " val_set = np.load(data_path + 'training_data/%s-question/val_split%d.npy'%(TYPE_Q[TYPE], split),allow_pickle=True)\n", " train_filename = []\n", " train_label = []\n", " train_mean = []\n", " train_type = []\n", "\n", " for data in training_set:\n", " one_hot = [0,0,0,0,0,0]\n", " one_hot[data['vistype']] = 1\n", " train_filename.append(bp_imp+data['name'])\n", " train_label.append(one_hot)\n", " train_mean.append(data['norm_mean_acc_withD'])\n", " train_type.append(data['norm_%d_withD'%(TYPE)])\n", " \n", " val_filename = []\n", " val_label = []\n", " val_mean = []\n", " val_type = []\n", " for data in val_set:\n", " one_hot = [0,0,0,0,0,0]\n", " one_hot[data['vistype']] = 1\n", " val_filename.append(bp_imp+data['name'])\n", " val_label.append(one_hot)\n", " val_mean.append(data['norm_mean_acc_withD'])\n", " val_type.append(data['norm_%d_withD'%(TYPE)])\n", "\n", " mean_list = []\n", " type_list = []\n", "\n", " num_t = 0.0\n", " if True:\n", " W = \"./ckpt/RecallNet_xception/U-question/Fold\"+str(split)+\"/RecallNet_xception_ep10.hdf5\"\n", " model.load_weights(W)\n", " print('load')\n", "\n", " for i in range(len(val_filename)):\n", " img = preprocess_images([val_filename[i]], 240, 320)\n", " preds = model.predict(img)\n", " #if(np.argmax(preds[2][0]) == np.argmax(val_label[i])):\n", " # num_t += 1\n", " mean_acc = preds[0][0]\n", " type_acc = preds[1][0]\n", " mean_list.append(mean_squared_error([val_mean[i]], mean_acc))\n", " type_list.append(mean_squared_error([val_type[i]], type_acc))\n", " final.append((np.mean(mean_list),np.mean(type_list)))\n", " print(final)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([0.1716159 , 0.16309815]), array([0.21483601, 0.13730111]))" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(final ,axis=0),np.std(final ,axis=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/bar4.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/pie4.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/bar1.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/pie2.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/bar3.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/line1.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/bar2.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/pie1.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/line2.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/line4.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/line3.png', '/netpool/homes/wangyo/Projects/2020_luwei_VisQA/Dataset/application/src/pie3.png']\n" ] } ], "source": [ "#W_T = \"./ckpt/VMQA_UMSI/T-question/UMSI_weight1:1/Fold0/VMQA_UMSI_ep10_valloss0.6198.hdf5\"\n", "W_T = \"./ckpt/RecallNet_xception/T-question/Fold4/RecallNet_xception_ep10.hdf5\"\n", "\n", "model.load_weights(W_T)\n", "\n", "image_path = \"/your/path/to/src\"\n", "list_img_targets = glob.glob(image_path + '/*.png')\n", "print(list_img_targets)\n", "images = preprocess_images(list_img_targets, model_inp_size[0], model_inp_size[1])\n" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "preds_recallNet = model.predict(images)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(12, 1) [array([[0.6729137 ],\n", " [0.62224036],\n", " [0.6644782 ],\n", " [0.63536835],\n", " [0.6595377 ],\n", " [0.6628296 ],\n", " [0.600067 ],\n", " [0.64756936],\n", " [0.600191 ],\n", " [0.6459451 ],\n", " [0.6242438 ],\n", " [0.60450727]], dtype=float32), array([[0.7803583 ],\n", " [0.67262685],\n", " [0.75816834],\n", " [0.718869 ],\n", " [0.7442306 ],\n", " [0.76404536],\n", " [0.8003189 ],\n", " [0.7172563 ],\n", " [0.7985541 ],\n", " [0.81216127],\n", " [0.6953638 ],\n", " [0.6564585 ]], dtype=float32)]\n" ] } ], "source": [ "print(preds_recallNet[0].shape, preds_recallNet)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.9" } }, "nbformat": 4, "nbformat_minor": 2 }