{"cells":[{"metadata":{"_uuid":"4c08ef44cc9bdc0d491b6c5d53387105186c2ab8"},"cell_type":"markdown","source":"**Sections of this kernel**\n- Data visualization\n- Baseline model (Fastai v1)\n- Validation and analysis\n    - Metrics\n    - Prediction and activation visualizations\n    - ROC & AUC\n- Submit\n\n","execution_count":null},{"metadata":{"_uuid":"dfc41ba2b70e88b92ff41a94f0b6504336f2360d"},"cell_type":"markdown","source":"-----------------------------------------\n# Data visualization","execution_count":null},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# 导入所需模块\n\nimport numpy as np\nimport pandas as pd\nimport os\nimport cv2\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as patches\nimport random\nfrom sklearn.utils import shuffle\nfrom tqdm import tqdm_notebook\n\n\n# 读取数据集\ndata = pd.read_csv('/kaggle/input/train_labels.csv')\ntrain_path = '/kaggle/input/train/'\ntest_path = '/kaggle/input/test/'\n\n# 查看正负样本分布状态\n# 正负样本数量并非完全平衡，总共包含约130K负样本和90K正样本，样本比例接近60:40\ndata['label'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"90811cbf83e65ba2679ed1044798a71b2dd89818","_kg_hide-input":true},"cell_type":"code","source":"# 定义图片读取函数（使用opencv模块）\n# opencv读取数据默认使用bgr顺序，这里转换回rgb格式，用于可视化\ndef readImage(path):\n    # OpenCV reads the image in bgr format by default\n    bgr_img = cv2.imread(path)\n    # We flip it to rgb for visualization purposes\n    b,g,r = cv2.split(bgr_img)\n    rgb_img = cv2.merge([r,g,b])\n    return rgb_img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"20e119981333d59b0ba4a52b46a9aa5b4bb2436f","_kg_hide-input":true},"cell_type":"code","source":"# 随机采样，打乱数据排序\nshuffled_data = shuffle(data)\n\nfig, ax = plt.subplots(2,5, figsize=(20,8))\nfig.suptitle('Histopathologic scans of lymph node sections',fontsize=20)\n\n# 负样本随机选取5张样本\nfor i, idx in enumerate(shuffled_data[shuffled_data['label'] == 0]['id'][:5]):\n    path = os.path.join(train_path, idx)\n    ax[0,i].imshow(readImage(path + '.tif'))\n    # 画出32*32方形选框\n    box = patches.Rectangle((32,32),32,32,linewidth=4,edgecolor='b',facecolor='none', linestyle=':', capstyle='round')\n    ax[0,i].add_patch(box)\nax[0,0].set_ylabel('Negative samples', size='large')\n\n# 正样本随机选取5张样本\nfor i, idx in enumerate(shuffled_data[shuffled_data['label'] == 1]['id'][:5]):\n    path = os.path.join(train_path, idx)\n    ax[1,i].imshow(readImage(path + '.tif'))\n    # 画出32*32方形选框\n    box = patches.Rectangle((32,32),32,32,linewidth=4,edgecolor='r',facecolor='none', linestyle=':', capstyle='round')\n    ax[1,i].add_patch(box)\nax[1,0].set_ylabel('Tumor tissue samples', size='large')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d08cfe0546459f2d9b5c8fd4c5d4994527677173"},"cell_type":"code","source":"# 使用opencv模块进行图像处理，效率和处理速度较PIL和scikit-image更快\n\nimport random\nORIGINAL_SIZE = 96      # 图片原始尺寸 96*96\n\n# 图像变换参数\nCROP_SIZE = 90          # 图片裁剪后尺寸\nRANDOM_ROTATION = 3    # 0-180度旋转\nRANDOM_SHIFT = 2        # x,y轴坐标随机互换\nRANDOM_BRIGHTNESS = 7  # range (0-100)\nRANDOM_CONTRAST = 5    # range (0-100)\nRANDOM_90_DEG_TURN = 1  # 左右旋转90度\n\n\n# 图像随机变换/增强函数\ndef readCroppedImage(path, augmentations = True):\n    # opencv读取图片，默认b,g,r\n    bgr_img = cv2.imread(path)\n    # b,g,r 转换成 r,g,b \n    b,g,r = cv2.split(bgr_img)\n    rgb_img = cv2.merge([r,g,b])\n    \n    if(not augmentations):\n        return rgb_img / 255\n    \n    # 随机旋转\n    rotation = random.randint(-RANDOM_ROTATION,RANDOM_ROTATION)\n    if(RANDOM_90_DEG_TURN == 1):\n        rotation += random.randint(-1,1) * 90\n    M = cv2.getRotationMatrix2D((48,48),rotation,1) \n    rgb_img = cv2.warpAffine(rgb_img,M,(96,96))\n    \n    # x,y轴坐标随机互换\n    x = random.randint(-RANDOM_SHIFT, RANDOM_SHIFT)\n    y = random.randint(-RANDOM_SHIFT, RANDOM_SHIFT)\n    \n    # 中心裁剪，像素点正则化（都除以255）\n    start_crop = (ORIGINAL_SIZE - CROP_SIZE) // 2\n    end_crop = start_crop + CROP_SIZE\n    rgb_img = rgb_img[(start_crop + x):(end_crop + x), (start_crop + y):(end_crop + y)] / 255\n    \n    # 随机反转（水平/上下）\n    flip_hor = bool(random.getrandbits(1))\n    flip_ver = bool(random.getrandbits(1))\n    if(flip_hor):\n        rgb_img = rgb_img[:, ::-1]\n    if(flip_ver):\n        rgb_img = rgb_img[::-1, :]\n        \n    # 随机亮度调整\n    br = random.randint(-RANDOM_BRIGHTNESS, RANDOM_BRIGHTNESS) / 100.\n    rgb_img = rgb_img + br\n    \n    # 随机对比度调整\n    cr = 1.0 + random.randint(-RANDOM_CONTRAST, RANDOM_CONTRAST) / 100.\n    rgb_img = rgb_img * cr\n    \n    # 裁剪值\n    rgb_img = np.clip(rgb_img, 0, 1.0)\n    \n    return rgb_img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4e36792e155852f9bfcc9f564da0328ff872bf0d","_kg_hide-input":true},"cell_type":"code","source":"# 测试图像变换效果\n\nfig, ax = plt.subplots(2,5, figsize=(20,8))\nfig.suptitle('Cropped histopathologic scans of lymph node sections',fontsize=20)\n# 负样本\nfor i, idx in enumerate(shuffled_data[shuffled_data['label'] == 0]['id'][:5]):\n    path = os.path.join(train_path, idx)\n    ax[0,i].imshow(readCroppedImage(path + '.tif'))\nax[0,0].set_ylabel('Negative samples', size='large')\n\n# 正样本\nfor i, idx in enumerate(shuffled_data[shuffled_data['label'] == 1]['id'][:5]):\n    path = os.path.join(train_path, idx)\n    ax[1,i].imshow(readCroppedImage(path + '.tif'))\nax[1,0].set_ylabel('Tumor tissue samples', size='large')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9568cbee8f077da727aa84fd13f459e5d03c5a44"},"cell_type":"markdown","source":"**查看随机图像变换的效果**","execution_count":null},{"metadata":{"trusted":true,"_uuid":"dd77955fd1742b4d72562113beca5712011122db","_kg_hide-input":true},"cell_type":"code","source":"fig, ax = plt.subplots(1,5, figsize=(20,4))\nfig.suptitle('Random augmentations to the same image',fontsize=20)\n# Negatives\nfor i, idx in enumerate(shuffled_data[shuffled_data['label'] == 0]['id'][:1]):\n    for j in range(5):\n        path = os.path.join(train_path, idx)\n        ax[j].imshow(readCroppedImage(path + '.tif'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 计算 RGB 三通道数值的统计量\n\n过暗或者过亮的图片可能是由于过度的曝光或者随机裁剪所造成的空白区域，我们可以把这些样本当作异常值，或者直接看作是负样本。","execution_count":null},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"065187a233372649ff42a734ad7380e4a16288b6"},"cell_type":"code","source":"# 这里计算 RGB 三通道数值的统计量，所以可以校验是否存在暗或者过亮的样本图片\ndark_th = 10 / 255      # 暗度阈值\nbright_th = 245 / 255   # 亮度阈值\ntoo_dark_idx = []\ntoo_bright_idx = []\n\nx_tot = np.zeros(3)\nx2_tot = np.zeros(3)\ncounted_ones = 0\nfor i, idx in tqdm_notebook(enumerate(shuffled_data['id']), 'computing statistics...(220025 it total)'):\n    path = os.path.join(train_path, idx)\n    imagearray = readCroppedImage(path + '.tif', augmentations = False).reshape(-1,3)\n    # 查看是否为全暗样本\n    if(imagearray.max() < dark_th):\n        too_dark_idx.append(idx)\n        continue # 全暗的样本不被计入统计总量\n    # 查看是否为全亮的样本\n    if(imagearray.min() > bright_th):\n        too_bright_idx.append(idx)\n        continue # 全亮的样本不被计入统计总量\n    x_tot += imagearray.mean(axis=0)\n    x2_tot += (imagearray**2).mean(axis=0)\n    counted_ones += 1\n    \n# 计算三通道数值得平均值，标准差\nchannel_avr = x_tot/counted_ones\nchannel_std = np.sqrt(x2_tot/counted_ones - channel_avr**2)\nchannel_avr,channel_std","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"20dcd95df7b64e785026c8a9816809e5fd0608f9"},"cell_type":"code","source":"print('There was {0} extremely dark image'.format(len(too_dark_idx)))\nprint('and {0} extremely bright images'.format(len(too_bright_idx)))\nprint('Dark one:')\nprint(too_dark_idx)\nprint('Bright ones:')\nprint(too_bright_idx)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"e142e95dd1f32e1cc81523b1e266dcf521def1ef"},"cell_type":"code","source":"# 尝试使用readCroppedImage读取过暗或者过亮的图像\n\nfig, ax = plt.subplots(2,6, figsize=(25,9))\nfig.suptitle('Almost completely black or white images',fontsize=20)\n# Too dark\ni = 0\nfor idx in np.asarray(too_dark_idx)[:min(6, len(too_dark_idx))]:\n    lbl = shuffled_data[shuffled_data['id'] == idx]['label'].values[0]\n    path = os.path.join(train_path, idx)\n    ax[0,i].imshow(readCroppedImage(path + '.tif', augmentations = False))\n    ax[0,i].set_title(idx + '\\n label=' + str(lbl), fontsize = 8)\n    i += 1\nax[0,0].set_ylabel('Extremely dark images', size='large')\nfor j in range(min(6, len(too_dark_idx)), 6):\n    ax[0,j].axis('off') # hide axes if there are less than 6\n# Too bright\ni = 0\nfor idx in np.asarray(too_bright_idx)[:min(6, len(too_bright_idx))]:\n    lbl = shuffled_data[shuffled_data['id'] == idx]['label'].values[0]\n    path = os.path.join(train_path, idx)\n    ax[1,i].imshow(readCroppedImage(path + '.tif', augmentations = False))\n    ax[1,i].set_title(idx + '\\n label=' + str(lbl), fontsize = 8)\n    i += 1\nax[1,0].set_ylabel('Extremely bright images', size='large')\nfor j in range(min(6, len(too_bright_idx)), 6):\n    ax[1,j].axis('off') # hide axes if there are less than 6","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4e437a4abe4ca906cf5b580474fed1e060f26c13"},"cell_type":"markdown","source":"根据结果显示，所有的全暗或全亮样本都被标记为负样本，从逻辑上来说并没有错误，所以即使不把这些特殊样本当作异常值进行剔除，也不会对模型的预测结果有所影响。\n\n-----------------------------------------","execution_count":null},{"metadata":{"_uuid":"2df0d87a864207ce1260acad6926f6dcf8d5fd58"},"cell_type":"markdown","source":"# Baseline model (Fastai)","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"这里选择 fastai 库来配置 baseline 模型，并在 baseline 模型的基础上进行后续的 finetuning。","execution_count":null},{"metadata":{"_uuid":"fe849b5a44217327e0451c0797bb981e7d700228"},"cell_type":"markdown","source":"### 数据准备\n将训练集分割为90%的训练集和10%的交叉验证集，并且通过添加索引的方式保持正负样本的比例（60：40），从而分割数据集时造成正负样本不均衡的问题。\n","execution_count":null},{"metadata":{"trusted":true,"_uuid":"31fef9db25fe198c5698d90db93ac91ddb60886c","_kg_hide-output":false},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\n# 为读取的数据集添加索引\ntrain_df = data.set_index('id')\n\n# 除去异常值样本\n#print('Before removing outliers we had {0} training samples.'.format(train_df.shape[0]))\n#train_df = train_df.drop(labels=too_dark_idx, axis=0)\n#train_df = train_df.drop(labels=too_bright_idx, axis=0)\n#print('After removing outliers we have {0} training samples.'.format(train_df.shape[0]))\n\ntrain_names = train_df.index.values\ntrain_labels = np.asarray(train_df['label'].values)\n\n# 分割训练集和测试集\ntr_n, tr_idx, val_n, val_idx = train_test_split(train_names, range(len(train_names)), test_size=0.1, stratify=train_labels, random_state=123)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9d217ce198f2f23fc722f8606a722fb9b3e71d38"},"cell_type":"code","source":"# 使用 fastai 1.0 建立模型\nfrom fastai import *\nfrom fastai.vision import *\nfrom torchvision.models import * \n\narch = densenet169                 \n# arch = resnet34\n\n# 设置BATCH_SIZE防止OOM\nBATCH_SIZE = 128                \n# 图像输入的尺寸\nsz = CROP_SIZE                     \n# 模型路径\nMODEL_PATH = str(arch).split()[1]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c1b95582bc4bf32c8a3686325f165ad72b5a48ed"},"cell_type":"code","source":"# 构造数据集 dataframe 结构\ntrain_dict = {'name': train_path + train_names, 'label': train_labels}\ndf = pd.DataFrame(data=train_dict)\n# 构造测试集 dataframe 结构\ntest_names = []\nfor f in os.listdir(test_path):\n    test_names.append(test_path + f)\ndf_test = pd.DataFrame(np.asarray(test_names), columns=['name'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5d25df6f20f350b1e796fa4ed34e134a4f11a826","_kg_hide-input":false},"cell_type":"code","source":"# Subclass ImageList 重定义 readCroppedImage 函数\nclass MyImageItemList(ImageList):\n    def open(self, fn:PathOrStr)->Image:\n        img = readCroppedImage(fn.replace('/./','').replace('//','/'))\n        # pil2tensor 将 ndarray 转换成 tensor\n        return vision.Image(px=pil2tensor(img, np.float32))\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e82294a7507e48b0481cfb67e3e7c93e9dfc1821","_kg_hide-input":false},"cell_type":"code","source":"# 使用 fastai 提供的 API 创建 ImageDataBunch\nimgDataBunch = (MyImageItemList.from_df(path='/', df=df, suffix='.tif')\n        # 定义数据路径\n        .split_by_idx(val_idx)\n        # 使用索引分割数据集\n        .label_from_df(cols='label')\n        # 标签列\n        .add_test(MyImageItemList.from_df(path='/', df=df_test))\n        # 测试集路径\n        .transform(tfms=[[],[]], size=sz)\n        # 这里留空，因为已经有了自定义的图像变换函数\n        .databunch(bs=BATCH_SIZE)\n        # 定义批次大小\n        .normalize([tensor([0.702447, 0.546243, 0.696453]), tensor([0.238893, 0.282094, 0.216251])])\n        # 使用训练集的统计数据结果来进行正则化，这里 hard code 的值是之前一步中计算出的结果\n       )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"35a9788f26ff06c92fb6592e3c8ee67db2f7415a","_kg_hide-input":true},"cell_type":"code","source":"# 检查 imgDataBunch 接口的工作状态是否正常\nimgDataBunch.show_batch(rows=2, figsize=(4,4))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b03f5cf0fd15fe757e5eca23720c5cf39c8cf431"},"cell_type":"markdown","source":"### Training\n","execution_count":null},{"metadata":{"trusted":true,"_uuid":"ebfd9acf7bec2c429dd8499514b9adcc5a235e44","_kg_hide-output":true},"cell_type":"code","source":"# 创建卷积学习器对象\n# ps 参数为dropout\ndef getLearner():\n    return create_cnn(imgDataBunch, arch, pretrained=True, path='.', metrics=accuracy, ps=0.5, callback_fns=ShowGraph)\n\nlearner = getLearner()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ac6b9d503b9144b04c7edd8fe033721ac7269a54"},"cell_type":"markdown","source":"### 1cycle policy","execution_count":null},{"metadata":{"trusted":true,"_uuid":"49c4bb9a9d899c9cfbfb483e486ae3338a8373bb","_kg_hide-input":true},"cell_type":"code","source":"# 使用 lr_find 方法配置不同的权重衰减率，并记录所有的losses,画出图像进行进一步分析\n# 增加迭代次数（默认仅100）\n\nlrs = []\nlosses = []\nwds = []\niter_count = 600\n\n# WEIGHT DECAY = 1e-6\nlearner.lr_find(wd=1e-6, num_it=iter_count)\nlrs.append(learner.recorder.lrs)\nlosses.append(learner.recorder.losses)\nwds.append('1e-6')\nlearner = getLearner() #reset learner - this gets more consistent starting conditions\n\n# WEIGHT DECAY = 1e-4\nlearner.lr_find(wd=1e-4, num_it=iter_count)\nlrs.append(learner.recorder.lrs)\nlosses.append(learner.recorder.losses)\nwds.append('1e-4')\nlearner = getLearner() #reset learner - this gets more consistent starting conditions\n\n# WEIGHT DECAY = 1e-2\nlearner.lr_find(wd=1e-2, num_it=iter_count)\nlrs.append(learner.recorder.lrs)\nlosses.append(learner.recorder.losses)\nwds.append('1e-2')\nlearner = getLearner() #reset learner","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"1d0e7276a4d7d770e920563cd2ad50118f99e7d8"},"cell_type":"code","source":"# Plot weight decays\n_, ax = plt.subplots(1,1)\nmin_y = 0.5\nmax_y = 0.55\nfor i in range(len(losses)):\n    ax.plot(lrs[i], losses[i])\n    min_y = min(np.asarray(losses[i]).min(), min_y)\nax.set_ylabel(\"Loss\")\nax.set_xlabel(\"Learning Rate\")\nax.set_xscale('log')\n\n# 使用其他 baseline 模型进行 finetuning 的时候可能需要修改坐标范围\nax.set_xlim((1e-3,3e-1))\nax.set_ylim((min_y - 0.02,max_y))\nax.legend(wds)\nax.xaxis.set_major_formatter(plt.FormatStrFormatter('%.0e'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"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"}},"execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"# 这里选择最大的权重衰减以防止模型过拟合","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2f456a26a2e422ded89a6fdee489bec0c061d77f"},"cell_type":"code","source":"max_lr = 2e-2\nwd = 1e-4\n# 1cycle policy\nlearner.fit_one_cycle(cyc_len=8, max_lr=max_lr, wd=wd)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a25db18361929f1642b369c60468de4d86345ce2"},"cell_type":"code","source":"# learning rate of the one cycle\nlearner.recorder.plot_lr()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"47f7e7e9eb03a3b1f17f8474dcf7e214162f9d17"},"cell_type":"markdown","source":"从图像中我们可以看到，学习率从较低的位置开始，不断增大，然后又趋于减少。较高的学习率会伴随正则化使得模型的loss不会产生太大的波动，并且较为平缓的趋向于极值。\n\n","execution_count":null},{"metadata":{"trusted":true,"_uuid":"ea77e45af04b5770f8f5ceffe54076e262394ed4"},"cell_type":"code","source":"# 画出第一轮迭代的损失值情况\nlearner.recorder.plot_losses()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"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"}},"execution_count":null},{"metadata":{},"cell_type":"markdown","source":"![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAYoAAAD8CAYAAABpcuN4AAAgAElEQVR4Ae2dCXhdxX323zRp4Guar03ga798JYqBEBJMs2CSQgM0pAkY2jpPKKSkgTRNUpqYpgkpbbxibFZjFgcMmGADYbfNji1Zli15t2XkXd7kTd7wJlvyItvywnzPO5oD4+t7r6+kc+8959x3nkc625w5M7+ZM++d5cwfkBMBERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABESgBAqeddprp0aOH/sRAZUBlQGWgA2UAwM4SkIj2JFIk5ERABERABDpGAECdhKJjzORbBERABEqKgISipLJbiRUBERCBjhOQUHScme4QAREQgZIiIKEoqexWYkVABESg4wQkFB1npjtEQAREoKQIhC0UPQGsArAGQJ80o+SnABjjrtcC6Ob8fBvAfABL3fab3r093HmG+TCAD7lrnwRQBWC1237CuyftrmY9lVTZVmJFQARCIhCmUHwYwFoAZwH4KIDFAM5LqbF7Axjpzl3vRIOHXwHw/9z58wFs8e6bB+AiJxAVAK5y1+7zxIiiNNS7J+2uhCKkUqNgREAESopAmEJxMYBKr4buC4B/vuN1+qP7CIAmr4XgTtsWw24AbH18CsDK4AKA7wN4wh2z5cLrdNzyOKuTUES3bLe2HTGz1uw0T89cZ347ucE8MqXBPDl9rXluTqN5e/EW8876XWbT7lZz+Oix6CZCMROBhBIIUyiuBTDKq6lvBDDCO+ZuPYAzvHNsgZzuHXOX4Ux25y709nnqUgDj3bUWt+WG3VH+sXcJN7lE1pWVlSU0G+ObrDU79plbxy4ynx9QYT7zm/En/Tu77wRzxYPTzC9eXGAeq1lj5q3fZQ4dORpfAIq5CMSAQNSEorvrvjrb1fS5CgW9N/vqkG5fLYrolMiDh4+a29+qN2f1nWC+MLDC/OaVxaZ6xXazfe9Bc+ToMdN25JhpOXDYbNtz0KzYusdUr9xuXqrdYO6tWGH+9el55q/vmfK+qHyuf7m5/ok55olpa8z6nfujk0jFRAQSQiBMoehq1xNbGg0Avu5V8up6SkhB85PBVgRbBWxB9Httidm575B/Oef9XfvbTMXS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"}},"execution_count":null},{"metadata":{"_uuid":"8f3a975ce2c969ae500b0f2f2f08730423057b61"},"cell_type":"markdown","source":"损失函数曲线会出现小幅上升再继续下降的情况，说明模型跨过了局部最小值。\n","execution_count":null},{"metadata":{"trusted":true,"_uuid":"7f3a660d0be1146e1783aad4a7d6b0bf99bded33"},"cell_type":"code","source":"# 使用模型来预测验证数据集\ninterp = ClassificationInterpretation.from_learner(learner)\ninterp.plot_confusion_matrix(title='Confusion matrix')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"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"}},"execution_count":null},{"metadata":{"trusted":true,"_uuid":"6e2326fe8a16469f9b120b6e7d19989f8f3affd9"},"cell_type":"code","source":"# 将已经训练好的 baseline 模型保存下来，方便后续的 finetunnig\nlearner.save(MODEL_PATH + '_stage1')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"4b46c33f3338636560f1ffaca4fd1845e8a4b49a"},"cell_type":"markdown","source":"# Finetuning the baseline model","execution_count":null},{"metadata":{"trusted":true,"_uuid":"68d5cd7dac6ee5fa1a41ef6a1029c18c64b709dd"},"cell_type":"code","source":"# 加载模型\nlearner.load(MODEL_PATH + '_stage1')\n\n# unfreeze 学习器\nlearner.unfreeze()\nlearner.lr_find(wd=wd)\n\n# 画出学习率曲线图\nlearner.recorder.plot()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAgAElEQVR4Ae2dCZwV1Z3vfxMd856ffPJmJi95L/MyrRDJgsZEOyaabSRjEuNEs4xOknk6ycQ8MzHLRJMoCBLFXdBExB0VjRpQUURoaLZmp5EGGrBZmmbfbPZ9627O+/yKKqwu6m59q+qeuvd3Pp/bt+qcqnP+51unz++epc4B5ERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABERABESgE4EPfOADprq6Wh8xUBlQGVAZKKAMANjWqTIt9xMKhZwIiIAIiEBhBAA0lLs+dMqfxKKwAqKrRUAERIAEJBYqByIgAiIgAjkJSCxyItIFIiACIiACEguVAREQAREQgZwEJBY5EekCERABERABiYXKgAiIgAiIQE4CEouciHSBCIiACIiAxEJlQAREQAQqgMDoxk3mjcZNXc6pxKLL6HSjCIiACKSDwOpt+03PW8eZKx+bZTo6jnXJaIlFl7DpJhEQARFIB4EjbR3mW4NnmHNvqzWbdh3sstESiy6j040iIAIiYD+BO95sMmfcPMaMf3tLUcZKLIrCp5tFQAREwF4CU5a3OkLR7/UlRRspsSgaoSIQAREQAfsItO45ZM4fMMF844/TzKGj7UUbKLEoGqEiEAEREAG7CHAQ+9+emmM+3q/GrGzdG4lxEotIMCoSERABEbCHwCN1K53up+FvrYvMKIlFZCgVkQiIgAiUnsDug0fNJ/qNMz97vsEcO9a1abJhubBFLC4FsAJAC4DenTagOH5yI4ClABYDmAzgDN81VQAmAFjmXnOmL+ykQ+1nEVYM5CcCIlAuBIbNWuO0KhZv2B1plmwQi1MArALQHcBpABYB6Bmo5XsBON31+zmAEb7wqQC+5p6/z3ed75J3DyUWkZYfRSYCImARAbYkvvbgVHP5wzMit8oGsbgIQO271Tn6AM7H59Xp8DwAs1wfisrMTqE5TiQWkZchRSgCImAJgXlrdkQ+VuFlzQaxuBLAUF8dfw2AIb7z4CHD+rme3wEwBsBrABYCGAiALZWMTmLhPXp9i4AIlBuB3wxfaM7pP94cONIWedbSJhZXA6gH8F5XDSg0e9wu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"}},"execution_count":null},{"metadata":{"trusted":true,"_uuid":"d0f527d1fe80bfe55f2ba0fb29f35bd7e1c8a6d6"},"cell_type":"code","source":"# 缩小学习率范围 4e-5 ~ 4e-4\nlearner.fit_one_cycle(cyc_len=12, max_lr=slice(4e-5,4e-4))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7cfcec9db08bc9ade154907800e9584153f368f3"},"cell_type":"code","source":"learner.recorder.plot_losses()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"![image.png](attachment:image.png)","attachments":{"image.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAgAElEQVR4Ae29B7hcVdU+vvywfT+/v0pRPxVDE0soKk2KIiAooqJIERBEpfkBFgS9/QZCC4RQA6EHQgk9gUAKqRCSkN57b4T0nhCSsP7Pe+asM2v23WfmzNy59869s/bz3Kxd1i7nPSdrzW5rEVkwBAwBQ8AQMAQMAUPAEDAEDAFDwBAwBAwBQ8AQMAQMAUPAEDAEDAFDwBAwBAwBQ8AQMAQMAUPAEDAEDAFDwBAwBAwBQ8AQMAQMAUPAEDAEDAFDwBAwBAwBQ8AQMAQMAUPAEDAEDAFDwBAwBDIQ2HvvvfnII4+0P8PAvgH7BuwbyOMbIKLVGcK0rSegKCwYAoaAIWAI5IcAEY1r6/oh4/lMWeT3gRi3IWAIGAJAwJSFfQeGgCFgCBgCOREwZZETImMwBAwBQ8AQMGVh34AhYAi0WgQ++ugjXrBgAc+YMcP+ioQB8ASubjBl4SJiaUPAEGg1CECwrV69mj/++ONWM+ZSHihwBJ7A1Q2mLFxELG0IGAKtBgHMKExRFPd1AU/g6gZTFi4iljYEDIFWg4BPqLWawZfwQH24loqyOJ2IZhPRPCKqzDjrmkqcSEQTiGgXEZ3jlO8moknh3+tOWYOkHZ0t/hc6c8VGHrtwbfEbthYNgRwI+IRajipWnAABH66loCz2IKL5RHQgEX2aiCYTUXtHyu9PRIcTUQ+Pstji8GZNmrJI8KXkybJfxRuMPwuGQHMj4BNqzTmGNWvW8Pe+973g7ytf+Qp/7Wtfi9I7duxINJQ//elPPGvWrES8zcXkw7UUlMVxRDRASfgqIsKfLzxpyqK5Ppfk/ZiySI6VcRYXAZ9QK24PyVvr0KEDd+7cuUEF7AHs3r27QX4pZ/hwLQVlgWWlx5RmuJiIuqq0jvqUBZamcA39PSL6rWb2xW1mUfxP1JRF8TG1FpMh4BNqyWoWn0sri7lz5/J3v/tdvvDCCwO6bNkyvvzyywNbVO3bt+cbb7wxGsAJJ5zAEydO5J07d/IXvvAFrqio4MMPP5yPPfZYXrlyZcTXnBEfrm1BWXw9VApYxlpERAd5lMQV4YOOa9euXXNiXhZ9mbIoi9dckg+phdoNr0/j8x4aWdQ/tJk0uMriE5/4BI8dOzaqvnZtal8PSuFHP/oRT58+PSjTyoKIuG/fvkH+tddey7fddltUvzkjGlfptxSURWOXobRu8M08dDnZzEJeffGoKYviYWkt5YeAFmqlpiy++c1vZjxM165d+Qc/+AEfdthhDOvXL730UlCulcV///d/R3WeeeYZvvLKK6N0c0Y0rtJvKSiLTxLRAiI6QG1wH5Ih4dMJVxnsSUSfCYv3IaK5ns3xdG0iUxby5otITVkUEUxrKi8EfEItrwaKyOzOLLDxLWHOnDl88MEH8/r164OsP/zhD/z0008Hca0ssAwloWfPnnzppZdKslmpD9dSUBYQ5mcQ0ZzwVFRNKN07EtGZYfxoIlpGRFuJaC0RTQ/zjyeiqeEJKtBLw/xY0piZxfA5q3n15g+b9aW1hs5MWbSGt9Q2x+gTai31pNmUxbhx4/iII44INrrff/993meffUxZxErpEikoVFngRAOE4qldhrXUt1iS/QouwMaCIdDcCLQWZYH/JxdddFEwuzj11FP5N7/5jSmLEtEJscNorLIwoZgpDv7Rc0KgRA2XTFws1TwIlJKyaJ4nbp5efLiWyjJUrHAvdoEpi+J+bFAS8lfclq01QyA3Aj6hlruWceRCwIerKYtcqIXlttziB0oUBeju3Wb504+S5TYVAj6h1lR9lVO7PlxNWST8AkxZ+IHSymLnrtZ1S9X/RJbbmhDwCbXWNP5SHasPV1MWCd+WKQs/UFpZfLhzl5/Jcg2BJkLAJ9SaqKuyataHqymLhJ8AllhEMCasksGG+j1GLuS2JlAFE9BtO0xZZLx0SzQ5Aj6h1uSdlkEHPlxNWSR88Y1VFj1GLQqUzY2vp674J+y25Nm0stj84c6SH68NsG0h4BNqbesJW+ZpfLiaskj4LhqrLLRQTdhlq2DTz7Vxe0O/va3iIWyQrRYBn1Brzoc56aSTuH///hld3n333fzXv/41I08nPve5zwXJ5cuX89lnn62LovhPfvKTDLtSUYGKoJ+tW7dGOb/4xS+iG+JRZoERH66mLBKCacrCD5RWFuu3JrPf72/Jcg2B/BHwCbX8Wym8xsMPP8zwR6HDD3/4Q3777bd1VkZclEVGppNIoiz222+/wF+2U7UoSR+upiwSQttYZfG9Gwc0as8j4TCbnU0rizVmCqXZ8S/3Dn1CrTkxgSXZL33pSyyOjhYuXMjf+MY3eNOmTXzKKacEhgMPPfRQ7t27dzQsURbgPeSQQ4L8bdu28e9//3v+zne+w7/97W/5mGOOiWYWmKXgfhhMm9fX1wf89957L3/qU59itI3ZDYJWHl26dAnaRvuYgSCgP7R/2WWXBW2ddtppjH59wYerKQsfUp68xiqLkzsPLZqy2PLhTp6weF00ynGL1vK3avpySwhrrSzu6D/T7lpEb8UizYFAhlDrW8H8xBnF/UObOcIvf/nLSBnApPh1110X+KbYuHFjUHP16tV80EEHMU5UIviUBYT7n//856B88uTJvMcee0TKQkyb79q1izHjQDmCVg46DTtUUCJbtmzhzZs3B4phwoQJgbJAu/CdgXDuuedGJkeCDPVPBq5hvikLBVC26K5Gnob6xT3vFE1Z/KX7mKCtDdtSewSXPTU2SPebuiLbIzRJ2aEd+kfPBcXRb+r7TdKPNWoI+BDIEGotpCxgSvz8888PhgdLsxDWH330EV999dWBOXLkffazn+UVK1L/P33KAraiBg8eHD0iTJmLL4xu3bpFps1hgBDWaBHilMU999zDdXV1UVu1tbWMmQhmFtpseqdOnfimm26K+HQkA9ewwJSFRihLvLHK4rcPvBsJ1SzdJCo66uaBQVsfbNwe8F/6ZEpZPDd6cVR/3qrNAc/sDzZFeU0R0TMLxF8et7QpurE2DQEvAj6h5mVswkz8esdS1Pjx4wNDgeiqe/fufN555wVKA2kIdghrhHyUxYIFC4JZybp1qZWESy65JGhb2sSsRYIoj2zKQpa9UAcuYGEp1xd8uJqy8CHlyWussrj+xUlFUxbH3JJSFis2ZCoLCOvtH+0Kprud+s0M+uvcv2kdwbvKAmkLhkBzIeATas3Vt+4HigEzCNlTgMC+5pprApYhQ4YwPOBlUxZYhhLfFVOnTo2WoSZNmhS4WIUP7w8++IC//OUvR8oCS01QJhJEWUBpwcESTkphKQoKQpahTFnkYW2wUEOCPmUxd+Vm/nvPCfxRAjMXT7y7IBDedb2nyrstmIqAXr4+tTl1/G2DI0W0aftHfO+gOVG6KZTFhY+O4sufGhsoJhmLpgU/mFU0BPJEoFSURa9evQKFMHPmzOAJ8IsfPrQh0HFaChvL2ZSF3uA+66yzMja4MZuA4yRsmKMMsxaE++67j7/1rW/ltcFtyqKZlYVcPvv1/cMDoTxxScr7Vbbv/MkRC4uuLJat3xbcCNeCGsrilDvTm+lJlAVuXuvN8XfmrOJZK+KXr6S/obNWRkpJ8kAtGALNhUCpKIvmet7m6seHa6ksQ51ORLOJaB4RVXpk/4lENIGIdhHROZ7yz4ee9Lp6yjKyijGzEMF6Zh7KAqY+IEirX53CmKXgT4IIXX3CScp8VATzkrVb+YDKtIlw5EORnXjHkAwh7raB8a/alPb4J+0Jn5uWfKFSHkeFrxA6av4aHjJzZTBr+c9Lk80zYSEgllEdn1Aro8dvskf14VoKymKP0J3qgcoHd/sMCU+0PxEdTkQ9YpTFvUT0HBE1mbKARVURjq6ySCLkRVlUvjI5akfetLRbn3CJSvgXrdkStSV5c1duapAn/QgVXjd9aH1/7jpkblRfyl0q9eOoy59PWtp8ceySYBzY67FgCMQh4BNqcbyWnxwBH66loCyOI6IBSjlUERH+fOFJj7I4koieJ6I/Nbuy6Jo64TRe3XmIex3dwz2L9nX9GghjEZCgSYLwy4knScdRaRPl13k22rPVm/H+RsYMRoc4fsnXvPnGpY0XQmXxrxdMWeSLYTnxQ6jJ/YVyeu6mfFbgWarKAstKjynNcHEWoe8qi/8iomFEtG8OZXFFqBXHtWvXriCcfTOL3+ShLB4fntrgFmEIKsGXJ2U+Kvw4FivxbFRsNrk80rabL2mU63gufuHFBcZCg7QhM4sreowttCmrVwYI4DQQNpNNYRTnZQNH4KlPWUnLpTCzaIyyuIaI/hMqmmafWYhg6/DaNMEzluoTSlJPmCUNmiQI//TlGyNhLnk+ihkIglsmfbn5ktZ1sMcyfM5qxqa6lMfRHTsLc4IEpSZtvjRuaRSXcRo1BFwEcPkNgg2/hO2vOBgAT+DqhlJQFo1ZhnqWiJYQ0SIiWkNEm4iok5qlNIgWusHtm1mIYDv7wREurg3SwqupMPnyUIaTTdj8doPwT122IRKokuejk5emTmu5ZdKumy9pvX+B2+HI18towufSrTv8psqR/926fjxw+gfSdQa99vmJ0fP0HL04imcwWcIQMARaBIFSUBafJKIFRHSA2uA+pIGUT2W4y1CarcVmFmc98G7Wl4fLc65ARVqCLpM8UDHjgV/zOgj/u3NXe9uVcqEj5qVueUpaqLQpaZfqI7h/e25Cor7Qhix7SftCYQoE5UfeNDBQhIi/Mj5143vlxkyMsNku45H6Rg0BQ6DlECgFZQGBfwYRzQlPRdWEGqAjEZ0Zxo8Oj8ZuJaK1RDRda4kw3qTKAhfvRHjJaShJH3nTW1nfoPC5FMs1MNEh+X/uPiajHRHWcxyTHcL/87vfjupKno8++s78oF23TPYW3Hxf+oJHRiXqC3XXbfGbKj/3oZFRG797cEQUx+AwRl+/yHt/wzZGXTOBnvF5WMIQaFYESkVZeGR/02QVugyllcXq0BS3Fm7Z3prm0/GLHx+dISDd292ndhkWlLsX5HQbSeMYn8sLBfDse2ll5ZbrtF6S0vm++MpNKTMk2CwTxYr+z1PKQtdDWW2vqQ3GJzw4Uow4bsHrgBmXm6fLLW4IGALFQ8CURUIstbIQASjCDDRb0HzZ4hDIOvzsrtTMAcdXdcjWRlwZ6seVJcn/3QPv8sEVvfiwiuf5mIoefFLlo/yLyq58VuVd/Ieq2/iyqhv4b1XV/O/q63js87dwp+oreHC3a/nEysdYNth//3B6ZqH7hEFEnXbjUKLIu2/QHA0D/zRUpljCsmAIGAJNi4Api4T4amUhM4tLnkjNDGAnKVtwhV9c2hWGTaUsflDxHN9efRk/VHMB96j5Hb9U+yvuU3saD6r9CY+sPZYn1v2AZ9YdwovrDuJV9d/gTfVf4Z0dvsjc4fN5/71fvz//tMMz3H9aaoM87tmz5f/o9rTtK42z1MGdDAuGgCHQtAiYskiIr1YWssxy7Qvp0zu6mdcmLech6hSTCLVcFLe7dZA9CRyR1SFXO75yLAkhH4piVl37QOhvq9+H19R/nZfWH8hz677Dk+u+x+/VHcPDan/EfWt/yq/UnsHP1vyWH635Pd9X88dAwdxQfTVXVP+L/15VyVdUdeCLqm7lsyvv5DMq7+eTKx/hYyue4u9V9ORvVbzKP698kDfWf4Vn132XD694PuvswTdmX97zY9Jm2KXcnZFprCxuCBgCxUHAlEVCHDOURbjsoTdspRl9D0HyRKgloVIHVPixCY5fzziRpK3fSnkc1SeKUA+KYkbdIQwlcX7V7VH7cfWLkf/7qjv4w/q9eHTd0YECKUabgpG09cjb84PjuEffPDA4XSUnrITPqCFgCDQeAVMWCTHEySURTuJ0SJvOWLh6S9CS8IBK0Hm54lIH1Mf79KhF3nwfr5gYQdlHm1bxjLpDeXv93nxBVafEbfjazTfvqqpa3l3/Be5X+1M+oOL1RvcN0/AaHxzJPfyGtI9zjM+CIWAIFBcBUxYJ8dTKAkc5EbTQhDFBLD3pPGla5+WKSx23fannuwkuZS7FJTjkYVlo94PHB4riwqrbMsbo1ikkrf1pxNXH8hX2PJ6qOZv3q+gTjQH7PXF14vInhSbh5Tgvbpa7vBpHixsChkDjETBlkRBDrSxgtwhBCyhxbarzpGmdlysuddz2pR42wSWei6IN7BVMqzuMP+74pWB/IVedQsrhnS9JvW41FwYKA5vrwl/Ta0oUl7xcVKz8/uHR94K6w2avatDGlg/9t8g1vhY3BAyB5AiYskiIlVYWEGYIuYSaNC18uOkt8TiqL+b5eOKUxc1vTG/QNm9dy1PrDucP6/fmuSN6NSjX7f/wlkFZyzWvG0+CBersX/E6v1r7i0BhXFf974L7g5VfXCgUv+aDZ37QoK21MRcD5Z0YNQQMgfwQMGWREK9iKItzuqVvLbsCV6dlSDpP4lc9M76BYDysQ/8GG9+4D8EPnRhsLl9SdTP3mby8QT1pEzTJUpLm13GMV6ezxb9Z0Zvfrj2Bd9Z/kTGubLxxZeMWreU/hceWwXN76G9c8xdLWeBgw/89My6r50B5X0YNgbaMgCmLhG+3GMoiqUCWIf0xvOHdZcCsSKj6bkE/MDR1mU+E5WEVL/Ckuu8zd9yHL6m6KaiL47xS7qMXPZZa0vGV5crDeHPx6PL2FS8FM56t9V/iX1fem1ddtDN24dqcdbQnQMGzECp9nXHvO4VUtzqGQJtBwJRFwlf54c7MdXlU0wLQF5emfWXZ8qTeX58el7MPtCP3DBA/tOJFnlj3fd5RvyfzrLSjpV4TlmVtCx7pZExJnk14QfPlR52jKp4JLv2trt83uOWt28sVH70gt7KA7alihJNDf+YndR5ajOasDUOg1SJgyiLhq2sJZYHlj1yCE+X3D06Zweg1agZPqDsiUBSvPPdI8GRSH3cPJO6j2BCWfFSUeBKaL7+0CZMhuBS4qO6bfGTFs0Gf1ySwbvve/DWJxpfw1WZlk7HmMhaZtRErNATaAAKmLBK+RFdZ3D1wdk6BJU2LwAGFXalcfiikXtKZxT0D5zBv38i7H/kpf1S/Z2CnqXP/WUEz0jfMlEvcR8Es+YjDQJ+kc1FdNxevW35m5T2M5SjcHv9uxcs8KoEiGDmv+ZXF928cEOBp/xgC5YqAKYuEb95VFq7Q86WlaV2GvJkrsnu4e/jtecGGNVyK6rpx8SNqX2F+9FT++Ma9AhMc4Lu174yge9mLyLV0A2ZpH/Fcy1bCKxvJki6EYl8FG94wM7J9e3ajgmhf/GLk6isAoJH/6D4a2ZRVNwRaNQKmLBK+Pp+ywKanFiZuHE1vVss7KEeAfwqX103DragYEnTLkJZf/tgsHlN3FPMNe/Kuab2jdm/qMz3oSzbH851ZLF6zNWrL1/+lT45huRyHjnw8+eRdX319cKR29ytXZFza87XRI+Et9gCARv6j+29kU1bdEGjVCJSKsjidiGYT0TwiqvR4sjiRiCYQ0S4igs9uCfuF+ZNCh0h/lYI4Wqg/C5+yOP2e7Mrijv4zGwhRfC0wV6GFkC8u5rd9ZciDccErHhsW2FzCr3Ke1itwWi/84hdclst8F9eEFxQBs4lXJ6Q81yGty934Da9n+h13ywtJd66+NFAYD9RclLXvX903PGu59B08VCP/kbZALRgC5YxAKSiLPUIPeQcqt6rtHWG/PxEdTkQ9HGXxaSL6TMj7P6Ev7q85dTOShSoL3y1lOCdKulQEYSOmtOevyq0stJDyxWcuXsFL7vxJsHzz2rNdo29YeLGujwClgbxc9yyiBlQE/rKlPZfKzEXY3fLC0n2Y+/wzUBh11X+L7Ttp2zK2xlDdV2PasbqGQGtHoBSUxXFENEBJ9Coiwp8vZPPBvTcRLSGiZlMWECRX9kh2Ygm8L49L/WpftGZLowThdype5q0P/5x3d/giX11Vw7AXJUGEm5vGspGU+ajwa4rN+LixiqtW4fe1WUge797F/WtPCQwP/rWqLuuYc7UvY2sM1X00ph2rawi0dgRKQVlgWekxpRkuJqKuKq2jPmXxDSKaQkTbiOhqzeyLF3NmAUGS9HgreHtPXBZ8L0vWZt8P0ALKjX+74hUeUXssf3zDF/nFJ+4KhKlsZqNxbJ5jOUmC1Nc+r5HXybn1LPw+Km1oumHbRxmsB1f3ZW2FV/O68SdHLIxVAmgUvjCwDwMzJedWdo7lddt10xkDLDCh2yywCatmCLQJBNqCshCdgBnFGCL6imQoekX4oOPatWtX0IvzLUNBkFz1bEPzG1rA6Dh8SiBonxe6/JD6/lkFIxTFu7XH8a76L/CK4U+x+OjOdgFNt6/jcLTUbdi8qL9soPj2COL4dR8SPyW82CbpbPsnaBd8MIA4p+67vLH+f/m0ym7ROKWNJDRujPnk637yqWe8hkBbQ6AUlEWxlqGgG55w9jSUvkhFiz2zSHKJDALnXy9Mir4dmDjXQkji4hlP0pri1/Y7tccHyzP/qKoM/FrLiSj4qI4Lug0dx17Gzl27GXc0oAizBZ/xwjh+3YfEcWpK4qDvzo2/84F2hfe4iid5Rf1+DNes8MAn+Ulp3BjdfNh/uuypsSx+SnT5aXcNC/qFa1cLhkA5I1AKyuKTRLSAiA5QG9yHNJDyqQx3GWpfIvrvkHdPIppDRIfF1A2yi60s/t5zQiIhBiOCElZu9N8l+OV9/tNVUBQwvgcHQtdW/SfoD5vkcoS06tUp0nQDGidYO4ZHaxtU8GQ0VllgRqW9Coq9Jd/Y0L3O/1nomnXBDYcwjCPqslxxz6MwnFTBbhROmwFDBJjykLbcOnJAwN3Qd/lypZ99b3Ewo8zFZ+WGQKkiUArKAkL8jFDQzyeimlDYdySiM8P40US0jIi2EtHa8Jgsik4L9ysmhxTLTVlDsZWFXHoTYRNHf9P13egbgLDy8fmWe6AocFkNiuJfoaJAXQi9vlPeD9rp8tbsqG03Alejvr7enr3KZY1Nw/YU2qh+Ne17Io7Z15fwShn8gWNGA+uxkicUvBIXCtesOzrsFfgHBx6Sn4tKv0KXr0/N6MTdrPg81+0IL3xlwI1tfe+pQX/uUWHhS0I3bv8oaMPsSyVBy3hKFYFSURZZBXwxC4utLLSgyRbHrEECbj37eM+8P/P+AATj0NofB0dJcWlN18GlOQhdbGbDIm5cuOstv1kS1E0aHhya2tuQX9kYR1zQY5S48Lpp5O9f+UbGcyEPy2rCK7TmphsDhdk3D9es6xyfFkNmZnoyRNsI0gcoTn/pvNpeqbFAaRQaMA60DdevFgyB1oqAKYuEby5ug1sLmmxxrH1LWL81Rll0TTtHOriiFw+uPTFQFP+pvi5DoKEfnKhKEuRSnju2JHWFB+ZHUL8plMWBVW9GzyanxeJOVYlr1icd16zybHCINHB62hGSPlIc9/7wjFJfqM7DEh/y4dFPAmZF8CuSNOgfB0nrGJ8hUGoImLJI+EbihI0ImCRUupJlCV3n0A79+cxQWUBRDKr9SaAoKquvbSDMUG/pumTKwp1ZXPvCxKA9GUsSijsV6FOWZBCPC/qZJC68WHaCv2wdTg73C7CmL2FiuCEu+0HH3pr24pd2zXp5A1ykvvSrx/nI26ln0GVSni0PS1Uor3wlrSyEX/rLRVdvTi875uK1ckOgVBEwZZHwzRRTWWhz4CJ4IDSxrwFPcm/VnhQoiqoYRYE6OH6bJLwZ7mtIP/ksP0n7jw1PWaBt7MxC2tNUxuUqEcyccFoLBwP06SntmlXv4aAdCdKmzoODKJ0vcdSRuFCd95+XUsoCVILmk7xsFKes8q2TrT0rMwRaAgFTFglRz0dZfLM6vbQiQgJUgq8t+NA+q+tw7lf700BR1FT/IxIwug2J4/htkqCXQPQYktQVnu6hufIkMwufTStpx0fleWCOJFsQPlDtmvWPVbdEOEl9zSt5su+iyxBHyJYnS2KgEoRf0rmovleTi9fKDYFSRcCURcI3s21Hpqc8ERg+GndCSrryKQtYp8Xlun9WVXBt9d8bCDC3nxUbtktzWemGramTOFI/K3NMoZg3x55CrnZ8x4Jjmg2ypT1Y2c0WhE+ouGbdolyzSv0jOr7VYJy+47+4BIkgbQodPDO97yHLdij7R88JGfzSn0sxS8L3IkGbTJE8o4ZAa0PAlEXCN5ZUWeC2sk9gQthIwFKQCCadf/aDIzLyNY8bRx9Jwqbw2KbUT1LHxyMzmVzt+JbYfO1JnrT3wpglkuWlwqepuGaFC9letaczLxnD/PHHrG+MS2PY7NZ1ET/mloGMTXE3X6f/+Xxqj0fy0J6OS/tCcaQZ5dhvkTBPGY6UPKOGQGtDwJRFwjeWRFl8q6Zv1JoIFE2jQiVwUC7h3G4jI0Gk6/niKzclUxZbd6Tdpeq+pM98qYwlrp425Q6BqU8R+epIe8+PSW9wZ+MTfqHHVPTgx2p+zxvrvxIs3/HDP+E7bu/AOCQAHgk+ZYFy34xD2gbFXQudxka8pKVtTcUL4i/uSR+VHr94XdY6ur7FDYFSRcCURcI3o5UFTi6JwMASjT6uKc2h/GRlE+nix0dLUUCl/tXPpo9gDp2VugegLdnKEpD+tYy6uNiXJLhLXknqZOOBUB+3aF0si/6lHsukCgQH7UhJFUfRP3fPtJorF+ykPlyy8uhHmO8/OlAaq+r35Xtr/si8MbUXguOuwqvp5U9l90aI96P5dTwanIoAG/AcdfPAKFcUCPItGAKtFQFTFgnfnFYWWsCjujZfIc3hJI+2LgtXoDpg43nB6i0Mu0RuQF0IFlkjHzJrJbvCMamyQPu5BJzbf2PTuPEN50xJgowNSiZbABbCC6rvqhx5U2qPIqj/8cf84OOP8lu1JweX+PjGvZhfvIQfefrZnB74dPsSx30KibvUN17NI+Vy9BhlFgyB1oqAKYuEb04rCxgP1GHMwrTZCp2vDQbq/ELi7j5H0j0L/Uu/FIVVxXC9rZwAACAASURBVMupo6m5MMFGvT7RBBPpIpgRlz0VtCOzqR9VPs7cv5r5tm8Es42pdYczbsLnYzJEz/KkP6G+MUsZqAStcPAee45ezEkPKEgbRg2BlkbAlEXCN6DX/rGOrYMsFWkBgXIIBBEemr/QuLQFqoVjrvZ0vVy8zV0OZYZ9jqRBnkU27uHNzxeED3dE5i9fybjcOKuufaA01tZ/jbvWXJTIkm22Zaps/aJ/Cfqui8RhYdiCIdCaEDBlkfBtaWWhT7qg+nvz13iVQrEvY4kABE16KQ/je23Scu/4Ej56SbEJBjKzwP6RLwhfJu3D51fdHtxlgU8Q+C5/s/ZUPi9wsNQnwiizTqbtKl2WrV/cxpegj+LCWyLaOPKm9J6G8Bk1BEoZAVMWCd+OVhaylyBV4e9ahIjkgeLEki9f8+QTx6W461+cFHi5y+cm9huTU9ZpMZbWHgRPeR9/fXqc95GEL44eX9GdH6z5A6+r/1ow25hRdwhXVP+L4WAqro6b79tnEZ7zHhoZjetnd70dtQm/JuDBPosFQ6A1IWDKIuHbEuGE/+juaaB35qyKhIFuTu8z6Pzmjuu1/ubuu9j94WIgjrsizPlgU6zjJhHauSj2L/5dfR1PrzssUBrr67/KsD91QmX36J3GtQHnU24QXu2/BI6TJP+O/jODOC4OWjAEWhMCpiwSvi1RFg8Nm9egBpzoiDBwC+PyXb6mTN/WNyWgMJZyCYJ7ctqHz6m8k/vUnhYsT2GZakDtyXxBVafYU1Q+D4XS31kPpJehTuiUVhb6Xke5vAt7zraBgCmLhO8xm7JAEzDxgNvLboDwgN2nlgzoX4RYS46jOfuW5y2E/rDiKb6/5mJeU//1YLaBjfHq6n82OEWFux9ukP70nsXxt6WVxbdr+0bvAsuKFgyB1oJAqSiL04loNhHNI6JKj7OjE4loAhHtcnxsf5+IRoWe86YQ0e89dTOyCnV+JGYsfDOLUn/ZYp67nE7giNAW6prtkPxsFEtUsGw7ue57gdJYWd+Ob6r+P/5OxcuBwIfBSDdIe/B6KEHMnEuZpsJj1BAodQRKQVnsQURwp3qg8sHdPkPCE+1PRIcTUQ9HWXyLiA4Oeb9GRCuI6ItO3YxkY5UFHAG1tiCXwm58vWVnOM2JmxbIjY/3CU5MDa89LlAamHHcXn05H1LxIms/HHg+6Uub+3jmvUVRvpQLbU5MrC9DoDEIlIKyOI6IBiiJXkVE+POFJx1l4fLAF7coD7csSJejssBtaggnHPEtlyDC2Ec795/Fsz/YFCvAfXUk76zKuyIPhhvq/5d73XU187a0+RPhwwkoCT1GLoztS3iMGgKljkApKItziOgxJdkvJqKuKq2j2ZTFMUQ0k4j+S1cI41eEDzquXbt2Bb0TWYZqjTOLgh64lVcSoe2juKMiJlV85Unyfll5H/evPSWYafAtX2ceeANvXJ0+ogy7YBKeHGHKQrAw2noRaCvK4qvhnsexHkWRkVWOM4vW+3kWPvI4gS8t6mPNcbxJ8n9e+SB//OIlzB2+wFvrv8QP11zAR1U8HcwkpC8csY1ra8fOhrbBpJ5RQ6CUECgFZdHYZajPh5vfmKHkDKYsSunza7qxyE1pV0jrHt2yQtOYpWxaMp1frj0jOHb7Yf3e3L3mHOYNKYdOj4duaX3t41izBUOgNSBQCsrik0S0gIgOUBvch8RIfXcZ6tNENJiI/hnD3yC7UGUBT3b4z27LUK3hs06N0Sec9eh95XF52oKwywPbVqNCky8/rnyce9acyR/V78l8497Mr/+dT65+MnZmAd/rFgyB1oBAKSgLCPQziGhOeCqqJpTwHYnozDB+NBEtI6KtRLQ2PCqLoouIaCcRTVJ/OE4bGxqrLHAM1ULrQMAV6kjr4Cv35cGjXrZlK1gkxj0bXRfmRLa++nfmjvsEs40Xa37FP6l8NIMH/CfeMUQPyeKGQMkiUCrKIla4F7ugUGUhvyzL6a5CyX61CQemhbfEdVXJy0Xlbk0cH2ad2j+58M1duZl54/uBJ79t9fswboXD/etPKx+KlAY8CULZDJqR8vu9enMyp1b6OSxuCDQHAqYsEqK8eM3W4D847PxYaB0IiNDWVI9c8uGl76LH3osEuOQLnbZ8Q1BN0i7duP2jDK+IUi6WZZE+suJZ7lbzB95S/6XAKROs3f6ismvQ58HV6VvdL4zN7otcj9/ihkBzImDKIiHaMrOA6QYLrQMBEdqa6pFLPvIwOxgyM+XWVvKFiuFISbtUe+1zy+56aza3r+sXKaLvVfQM3L2Kz/C3ak/iX1feG5XD/wba6DVhmR5qonj/aSt41opNiXiNyRDIFwFTFgkRM2WREKgSYnMFN9I6jFu0lvtNXRFlYYbgq/P6pJQfb18Z8tZs/tBbL44f+YdVvMB3Vv8lMpE+rPZH/LvKLvzTLsOCto67dVA0rqQR6S8pv/EZAvkgYMoiIVrwmY3/jK7jo4TVja0FEBDhqWm2YYixSM2POPyBIIyYm7mJLXzab4nkJaXtK17iW6uv5NX1+wYX/Obc91s+rOJ5Pvrm/J0jSZ/ZntHKDIFCETBlkQdyMJsB/84WWgcCIjw1zTZy8d2t+RHvOyWlLFDXLUNa+1r3lSfJg9Ol26sv49037MVL6w/kS268P9tQG5TJ0W70ZcEQaAoETFk0BarWZkkg4BPS2Qb20a7dkTIQH99oAzMKCUvXbeVFa7ZEfG4fMNp4yROjY8uF/98vpTzmSVrokEFv8uK6g3hnhy8yD7+LeXeyG94Yl7QhYzVqCBQTAVMWxUTT2iopBCA8j711UCREkc4W4CZVC1yJY3nKDVLm0vGL1/HC1fHKRPhXbky73JU80OfHLOZDK17kfvU/S9md6nEW8+ZVbvcN0svXb8sYewMGyzAEGomAKYtGAmjVSxcBLCvhdrUI41fGp8xvZBux8IJH4r6lRylz6diFaznJshTuU7h1ke4xKmXO/Nu1bzKPfZz5pi8zdz6Yef6wbMNmUxZZ4bHCIiBQbGVxEBF9JrxIdxIR/T2Xf4liX7rL1V6hl/KKgLU10UIIiFBO0v0pdw6NfFRIPZ+xPylzKU5Y+Ta8f/fgiAzlEHfcVo7OwrES7vYsmDaa+f6jAkOFPPgm5l0NZzl4LlMWSd6u8TQGgWIrC5jdgK2nb4bmOzoTUd9cArw5y01ZNOZzaZ11RaDnO3qpt2v3xw2qSplLoSzWhSfndNm53UbyrX1nRApD74lovm7D5gU8+1e+EfHyji384UtXppalHj+deUPDOxhaWbgzIYz/udGLA7PsDR7EMgyBhAgUW1nA9SnCv4nob2F8YkhLgpiySPhltCE2Ecb5PpLUg10oN0iZSycuWc9x9zXQhvDHHdO9d9CciEd4pd5dd3ZkvuVrzJ32Z57VL2NIeoP7sA79M8q6DpkbtHlAZfY9m4xKljAEHASKrSxGE9EFRDQttCILBYF4yQRTFs4XUAZJLXTzedxs9aTMpdgkh60nNx9phOtfnMQXPz46Yy9F88KLn05LPcnj1XOZu50QzDI2976et2zdGrQrl0aFb+qylIkSFP749iFRmwGz/WMIFIBAsZUFfGffFyoMKAiYHa8oGU1BRKYsCvhKWnkVEaD5Pka2elLmUvSBPQ43H2kd4jz13fpmeqlK2kA9iWOWM2DSIt79xnWBwpjd8UjmtfPZ3RMBf7+pqfshUhd0xvsbGRdMLRgC+SJQbGWh9cKeRHS4ziiFuCmLfD+R1s8vwjLfJ8GdiR90fMtbTdp0KZj1EVxdrhvKZvJc10EcQfJem7Q8iD84dB5fUdWB4Qccbl2vrqqJeIQXCkTXlXxpMyi0fwyBhAgUW1kMIyJ4rtuLiBYSEZal7ioFJSFjMGWR8MswtqwIaMGr41JJ5yHesc90KYqoyxOXzqZY4DeDHz01mGU8W/Mbxk1w3Q4602mJR4PwRLD/gSPAFgwBjUCxlYVsZl9GRDeGAnqKCOos9PTQh/Y8Iqr08J0Yuk7dRUSu+9T+RLSBiN7w1GuQZcpCv36LF4qACF2XSnvndMs8Knt7v4buU926cekub81uIPAPrkmbNeddH/EDNRcFCmNWXfsMfxkYj69dGaePCr+UiRkUnNSyUL4IFFtZTCWirxLRW0QE73YIuZTFHqGHvAOVW1Xsfeiwf7ik1cOjLH5KRL82ZVG+H3FLPPn8VZu5z+TUkpAIV1AJrrK4c8AsKYqorpdvHIYGpY4se11UdSuvqt+X4Wjp39XX8X4VfXjDVr8l3WgQnoi0K0X6AqHkGS0/BIqtLM4NlUO3UNJDAbyipb4nfhwRDVD5VUSEP19wfXALDy4A2syi/L7fFn9iEaygsPck4YJHRkXCHGXwa+GG7u8u4Bten5bBp9vLFodfFSmXX/5IH1XxNA+vPS6YZfSuPZ0PqXgx4hN+0GxB+IRHm2CXPKPlh0CxlYUI73wolpUeUxUuJqKuKq2jpizK7xst6ScWwQqq9yVcz3vVr07xPserE5Z6hblu1xfHTEXy3dvgB1S8zndUXxa4cV1QdzD/svK+iFfqeAcTZro8Yp4f+RbKF4FiK4t9iagXEa0K/zCrQF620BzK4orwQce1a9eufN+2PXnRERDBCnrzG+lNbPcoK5wa+YLPd7duMy5+z8D05T19e1vzn1N5Jy+v35931O/JN1RfHSxLSblvLJLn8oxesDZSNr4LilLPaNtGoNjKYiAR/Tk0+QGzH38iIuRlC7YM1ba/sTb9dCJYQXFHQsLsDzZFAlZ4pExTeOGT8nwolrWEf46nLymDG9eBtT8JlqXeqj2ZD694Pqinx+DGpa7kw62s5MGMu4XyRKDYygK2odzgy9M8UCoLwgt8nyaiyUR0iGZQcVuGKs/vtGSfesS8tPe82/qmTzxBqJ7UeWgkZCFsfcG3SS6COSmF7+3svH34xuqrgxnGsvoD+OzKO31DCfL07XOxMTV56fqofZRbKE8Eiq0sBhPRRUSEE074Qxx5ucIZoeHB+URUEzJ3JKIzwzhOVi0joq1EtJaIpqsGhxPRaiLaHvL8XJU1iNrR2fL80JvyqUVQd8pxPNY3BrhslfqFUm3OI1sbv6q8jxfWHcw76/2OlVwfG0NnrQyGPGlJWlnMXbnZ9xiWVwYIFFtZ7EdEr4fCG/sWvYnoGw0kdgtmmLIog6+6mR/xezcOCAT+Hf3TMwsZwqAZHwRlcpta8oUWQ1nglnk2JaHLcDqqT+1pwbIUP3Mu89b05TucztK8eJ4Hhs7lnqMXR/nYY7FQnggUW1n41MA/fZktlWfKojw/9KZ86vreUwNh6rtLMXxOapkKR2l9Afc1IKB9BgS14M4W/+Etmd4As/GmyvrwoCdvYu64D3OX9sxLRgdDO+aW9N0N8B1a3z9SEtLmhMXrfI9heWWAQHMoiyUtpRh8/ZqyKIOvupkf8cbXpwdCFTet3bD5w518QqfBDHercUGcK9X2SikdEcxNSYNZ0LLxzHcfxnzjXswj7ucfd0rf3Yjre/ryjXGPYfltHIHmUBZLfUK7pfJMWbTxL7oFHk+Oyf787rcb1XvfKY3fv9jy4c5YQ4ZaAWAmE4Rt65l7XhgsSw2/6TQ+LDwtpXl1HJvdFsoTgeZQFjazKM9vq2yeWgvTxjy0e7lOt5s0Lv27/NrzHsrgUyMKcO408gHe2WFPXlJ3EP+68t4Gy0/S3pU9xpnHvQi48ooUS1lsJqJNnj/kw/hfyQSbWZTXB94cTyuCFLQxAbMC3VYhcenfrfstZXgQZfDIpwP8a/ym8h5eWn9gcMS2vvpvGZf4dHt/6T5GV7V4mSBQLGVRMsog10BMWZTJl92Mj6kFaWO61TaedJv5xKV/t86hHTI3q3G/QwJuZVe9OiVQVLi0J5f43qg9lQ8twLaUtGu0bSFgyqJtvU97mhZAQI7OQkA3Juza/XGTzSyOcI7XPjd6cTRUOHnSymX/itf5luorg/sYuJdxRuX9GeWNfc6oY4u0KgRMWbSq12WDLUUEtCBu7Pi00M43fsa970Tdu3XdmYW2VeXySvp3lV34/fr9+cP6vbi6+p8Zy1JRRxYpGwRMWZTNq7YHbSoE9P2ExvYhgroQumz9tqh71P92bdpB0pE3Zd6hQLmEa56b0GDmIP1/v+I5Hlr74+C01Gu1P+f2FS8FvFLXaPkgYMqifN61PWkTIaB9SzS2CxHShVDdN2xTaWOGP7q94R2KDq9NY9wgr+mV2q+I6xPLUrdXXx6YPJ9X923+eeWDuiuLlwkCpizK5EXbYzYdAifeMST6Zd7YXs5/eBT3GLkwai9OgPvy3b43bU97ycMdEF+dfPLOq+zMH9S34+31ezOPf4oZR24tlA0CpizK5lXbgzYVAuIVr/KVyUXrIh8hLry+zqXsl/e902hlgbaOrHiW36k9PmVb6pUrmHdsCbrFiSooJwSYTH9tUvq0lYwLt9mxsW4+MQSR1kVNWbSu92WjLUEE/tEzteY/bPaqoo1OuzIVgX/pk2My7DUtWbs1QwH4Ope6xaTwxMdDOzF3+ALz/Uczr5zBT4RGCJeuS49p5oq0aRAsix1Y9WYw3nfnrvYN1fJKHAFTFiX+gmx4pY/Ahm0f8YND5wVmNoo5WlfAi8nwsx54NxC6u52jtr6+3TaKlQ76mj+U+Y6DmG/+X/5X1X+CMb09e1WkwPpNXREN6aFh86J87JNYaH0ImLJofe/MRlwmCLiX9N6bvyZ4cignsdEkwh/7HL4g5flSbZbcrXvUzQPTXW1awdz9l8Gy1PM1Z/Kh1a9GSgFeACWc221klI/Ndjhs0jMP4TNaugiYsijdd2MjMwQiAduxz3TvWr8I8jiopDxfClPk2epk9LdrJ99b80feXf8Fnll3CJ9c+UhQ9+6BaSu8J9+Z6TVQ2l68ZmtGU5YoXQRKRVmcTkSziWgeEVV6THacSEQTQjtT5zjllxDR3PAP8azBzH2U7sdoI2uIwPL124IlroYlqZzRC9byrBWb4oqzCnwR2D46UXnH85W7HYLnoqpbeU3913lL/Zf4b1VV/NDQuRHbaXcNix1LxGSRkkagFJQF3K/CneqBRCQ+uNs7En9/IjqciHoQkVYWe4X+u0H3DOOgscGURUl/jza4IiPgE/RJ8qYs3RAr3FHfDdLmMRU9eHTd0cGy1PY7vsv82t+Yp73KZ3d5I7Y9ty2kcUdkw9bU6SpfueU1PwKloCyOI6IBSrpXERH+fOFJR1lcQEQPK0bEkRcbTFk0/0dmPbYcAjABIoL81C7D2LU+K2UunfH+xqielD37Xtq9qvtEwgN6YMVr/O/q63jlo+cw3/qNQHHs7vAFnlj3g2C56pzKO/mgit5R+25bSKOdkzoP9RVZXgshUArKAjOFx5R0v5iIuqq0jrrK4noiqlUMdUSEPDdcET7ouHbt2rUQ1NatIdD8CIyctyYSyrjfgD8t2H1x+NXw8cGjn/C7TyL5mg6c/gHzrp2B29bed1/DY+uOCowTcofP86b6r/BbtSdzbfXfmdfMa3DBT9px+7F0yyFQLsoiUh42s2i5j816bn4Epi5LLSdhRiFBBHEcjePTR3URR8BlvzPvHx4pEd0mjs7iIh7ug3QdMjfgOaziBb6iqgM/XXMWL6r7ZupyX4fPM999aLhk1Yt5W3pzXcZitOURKAVlYctQLf8d2AjaKAKiLH5xT7xFWi3gEZfgy//r0+MCoS9+w10enX5zyvt8+j2pZTDXDLrw/bjyceYxj6Vcu966b0p53PBFnlB3BN9TcwnzopHMu2zvQt5JS9JSUBafDDemD1Ab3IdEU4HMiLsMhY3theHmNja2EUdebLCZRUt+btZ3cyNQbGUhMwRcQkQQoe+juGch+a+MXxrFJU9ohAmWrBa/x7N6VvG4uiMDw4VYsuJbvs783AXMox/xLllF9S3SpAiUgrKAYD+DiOaEp6JqQknfkYjODONHE9EyItpKRGuJaLrSBn8Jj9zi2O2fVb43asqiSb8na7zEEMDFNwjlcx8aGY1MhLSPXvrk2Fg+FOgN8sEzP4hVAGi714RlUfmLY5dEcbdf11aUlGPJiqe/xvz6P1LLVFAcwZLVYcyv/515em/mrWuj8VqkaREoFWXhFexNkWnKomk/KGu9tBCAIO42bB6v3Lg9GpgIY0079ZvJ72/Yxrg1LkGX39F/ZpCt8467dVCsAgDfy+PSs4lsN8Lh/1sH3UeUDwu32AjH7KLnhanZhiiPe77H/PKlzKO6MS8Zw7zzw6gaImiv4uXiGXnMaLyMEqYsyuhl26MaAkBAC2OJj1nY8Be6lIFOX54yCpjL94Wu88KY9GzikidGe/sFv1ZQ7vhi3xj2MRaPYh5+N/Pzf2C+8zvpzfIb92Z++CTmN69nntSTT6p8NPDyF9uWFSRCwJRFIpiMyRBoOwhAOLev68fax8W6LTsaPKAW/Nj7QMi19KTrwBy5pK/skdoYl7SmYtpcBqDLJC8R3bg8tWz1Vn3KXtXNX40UyPr6rzL3OIt58M3Ms/szbzHLt4kwVUymLBQYFjUEygmBuSs3RcJ8646dDR5dC20xXKityupyX7yu99Sofa2YXF7c69BBl+v8vOO7dzF/MC24IPhszW+YHzye+YYvRgqE7zmc+aU/M498ILgLwh+ll+ry7qsMKpiyKIOXbI9oCPgQWLB6SyTMfeVaaIt5dH3JT5f74j5Xrj6+VZvSewzzV22OxgTexga0LX0GbX24mXnhu8zv3sP8/EXMXb6bVh7B8tVPmN/4F/PE55hXz2Henbmf0tjxtOb6pixa89uzsRsCjUBAO0/yNXPho6MiQSt7GmMXro3yRAgLfSHLiSfh8VFsrEs4/IYBGe1LfqFUH9+NbWPj+8wz+jAP7MA7Hz+DP77la2kFcts3mJ87n/n9SbHVy6XAlEW5vGl7TkPAQQAWbUV4O0VRcsuHO3nIzJVRelIWa7TurEDazkVhh0qCyyv5hdL/eya9V5KrjdWbU7OQuwfMCLz/8fgeqSO6nfZPeQV87RrmzWkscrXX1spNWbS1N2rPYwgkRADHaUU4J6zC05bHW6OFbwppL1964h1D+JQ7h0auV6V+0nHF8WnT6HE8ki/GE7G/khG2rWfuV8V8416pI7tYwnKO52bwt9GEKYs2+mLtsQyBXAjIL+kjOr6VizUqh+lwEeQu1ctabpkvfWvfGbFtCb/YoJIB4E7G06MWsXs3Q8pd+p3aflEfbpmbxvFg9NtAWQgj9jCeOTe1RIW7HVi6wv2PMgmmLMrkRdtjGgIuAmu37AiE4/dvHOAWxab1prgIdKFL1+WeWZz94IhIeMP7n9SNox/uTF8SxKAefjvly7vHqEXce+KywFBh7GCdOyXZ+FCWU1lIA3MHMt+f8tnBT/46OHElRW2ZmrJoy2/Xns0QyIIAjqxCSGNTOWnINnuAb/A4oS/5vwuVRYfXpvFDw1KCX8qyURmfVjbg/9tzE6TIS79Z/WY0Ji+DyhQ7Wmg3Z8ClwPceYr6tXeo4bp9/tvm7G6Yscn4VxmAItE0EcBkOgvH42wYnfsAP1D6HK9zRiJvnps964N2AZ9T8Nfz48AU5+aW+DFDSQqE8soXHVB/Z+FCGMUm7uXijctimwk3xG/ZMOXoa2ZV5Z+a9kYi3lUdMWbTyF2jDNwQag0D3dxcwNqaTBtnnEKGqKdrAbGWhur+hy//SfQwfUJlyr/ru3NXcY+TCSDhrPl9cxueW/fr+4VLkpWd2TSkn1MsVdNu5eBuUr5zB3OO3qf2M+45I3RJvY/sZpiwavHXLMAQMgTgE4pTFS+OWZlTRglfi+vb3UyMXsnbTKjxxVBp3yw9WTp2ER1PNr/N98Xx4ffWDze5Z/Zjv/UFKacC8yMqUAUYvf3Nn7tjKvG5Rwb2asigYOqtoCJQfAh/t2s04PaUFK/YNXDPjUB6aB/Hhc1ZHeU+OWMjvzFkVpV1eNw2k4XXPzUfaDdh7wP4JguZfsWF7g3HquppX5+cdxzLUiPtTy1JYnnrz3y1jSh32r3Biq3818yOnpI7+PnZa3o8jFUxZCBJGDQFDIDECuQQrTippHsRHzE0riyfeXRD05fJI+txuIzPqgxn2qaRcU3fQKIOrVwTNhzhOUcUFzRvHk1c+hDV8ccAeVaf9mN97OOWTPK9GEjKLCfcJTzP3vooZS2Fiwr3jPsyP/zy4oc5zBiZssCFbqSiL04lodujEqNLjx+IzRPRCWD6aiPYPeT5NRN2JaCoRTSaikzx1M7LMn0XDj8ByDIF8EcglWN+Y/H4DQT1iXlpZQJkg6HYQx2b7v16YxNjf0GXgfU9tQOsybS5E+wn3tY8b3QjYM1m0ZksQl3+kzdh7FsKYL10xlfnJX6WEd9djmOcOyreFhvw4jbV0XGoGA/8edxyUVg6d9uNdz5zHk3veEHgeLNYFwlJQFnuEHvIOVG5V22dIeKKriOihMO/8UHEgeXWoLBD/MhGNJ6L/cupmJE1ZNPzuLMcQyBcBEaygvtBv6ooMYQ8+nDbCnQ7ExRmTbgfxo24eyP9+aRJrMx3I/9MToznOjzfKJWCZTNpEnsSFwoe4zpd6WEYTHu2vXMobTfHLH0tCsHSLX/zPnse8em7yZrdvZMb9jsE3pcyv3/SVtHJAm69eyTyue2qPZPdu/mmXYcHzdO4/K3kfOThLQVkcR0QDlESvIiL86YBy8CHAZ/caIvoEET1ARBeH+SCDiegYlW4QNWWR44uwYkMgAQIiWEF9YdCMhi5XRy9Yy2JsUC7b6XYkXvnKZP5HzwmR8Jb8bFTGAF8dwoeTWTgtJWnQOGWxa3daWRR9ZiGDA4WZEDhsgl9xmA+BGRGYE3HDhmXMU15ifuM65m4npE2rY0nroROZ+1YwT3uVGUYQPUGe+dQuwzylhWWVgrI4h4geU1Idwr+rSiM6jYj2VXnziWgfIrqCiF4KFcgBRLSBiM5WfA2ipiwK+1CsF+vhgAAAGvNJREFUliGgERBhBOoLPvPkUBZu0O1I/JrnJnCS293Cr8cAw4eS77ttDidMCMKD+LYdu3juyrRp9B/fPoShPJo0bPqAuffVKQOFtx+Q2s8Y8xjzy5cx33VoetYAB05Pnck85FbmeUOYP9yUaFjyfCd0Sn6HJlfDrV1ZYJZxNxFNIqLXiKgvEf22gYZIKZVxeNh27drlwsTKDQFDIAcCU5amDQr6WEVYaXp7v4bHSHW5jmM/QaezxX94S3oPQN8i91nBvfypscFwpT0kfqPuYkg+lsOaJSyfyPz46Wnl0Plg5hf+yDzqQeblEwreEP/9w6kDApWvTCnaY5SCsmjMMpSrF0YSkbvfkcFjM4uifTvWUJkjIBfsfDCIDScRvqA3vD6tAasu1/Flyny6zvfFj1aCHe5hhUfPFiTvwKo3+d5BcyIeDEjKXNpgsI3IqH51StCPtwnsZywZw7x2QdEME4qRxgeHzvN2WUhmKSgLzA4WEBGWkXC6CaeaDsmQ8KmNbL3B/WJY/v+I6HNh/DQiesep1yBpyqKQz8TqGAINEcCv+DWb017uNIc2syFCeOD0DzRLENczFOEDxQknnc4WxywAG9TYQNeXBudksZAr7WEQEndpg8HGZMxasSnr/Q3dR0wTRc++o//M4LnuHzynaG2XgrKAQD+DiOaEp6JqQgnfkYjODOOfDfcm5hHRGCLCySkEHKHFkduZRDSIiPYL82OJKYuifTvWkCEQi4B2rCRCGJfy3BAn0LPZoJL2hOKElVwC1DOabObUpS7GI3GXumP1peFBEPX0UpiPT9qWMlkuw0GApghdBswKxnXPwLanLGKFe7ELTFk0xadpbRoCDRGAgDz3oZH8z+cnBoILCsQNvk1o1Fu5Ke2YSQRtNoojoiivCpd7EJ+5IuWfIls9jCeu3B2rLw3fGlIfJt/jgvBIuSiZ9nX9eOP21G1zKSsGxYky9NnlrdnFaC5oo1RmFsXWCbHtmbIo2rdjDRkCWRHYsPUjxhFZnDYat2idlzfO5PmqTSkXpyJkNYVXPZ1GvFO/1LKLVhawG+XyuWnX5Lkux4Ax7nmrNnvHjky93Hb+w6Ni+aRdYcDJMMmDscNiB2nbt09UaF+mLApFzuoZAoZAoxHwLVdB0EHJgF71zPhIqIoA9CkS2dCVX9TC2xiKh5P6cQ+K/RLhAY0LwiPl7m10yQeFbStsiLv2tjRPrrj0B+VZrGDKolhIWjuGgCGQNwLaD7gIOC10fXsa6OSSJ0ZnCGmZWVz/4qSMfN1mvnH0I3XiHkz8c2Tj07fDRQFo3xmoq4MYasRmfSEBFn1lPMCjWMGURbGQtHYMAUMgbwTEtasIN9Dv1vWL2sESkC67b1Bqw1ab9UC5KAnZH9F1Co1jEFI3GpATcU2Q9J+2gh8YmjLjgXsl367ty/AZIu3IZT9tVBFlOhx5U2q2IiZRdFmSuPQFWswlLlMWSdA3HkPAEGgSBORUkBZw2JOQ4F7Og6FACbqOxF0DhJJfCEU/Uk/6dOnJdw6NeIQXVNe9+tn0UhqUHMKkJZkWdIPM8J9jbkkpC20gUZfniutxyFhy1UlSbsoiCUrGYwgYAk2CgDbPIUJOe+5zN8D1IMQoodRrSop+sYQky0gyDsyCfP2iXPK1UcQLHkltgmPjXMpBdTju1kFBGS4mFhJ0u27bhbQndUxZCBJGDQFDoNkRkI1sLeD0IJau2xorVF0jgbqNYscxJmlTxodZz0WPvRflSzmoNmio8yXu+vuQNkEPrk6d4tJKU5fniksfoDD7UaxgyqJYSFo7hoAhkDcC2tqrCDndiFYW7matz6aTtKEpPPnpdCFxjEnqyfjE3Inka6pvkut8id/4+vSoPeTBsZME4Zm7MpnRQKknVOqD1vSy01Cx9yhyFdg9C/mkjBoCLY+APikkQk6PSi9D6XzE9YU4qeujsI+E46i+sqR56E94ZRyS9tG4U17C2+G1aVF7kue2O335RsnKi0p7oKff805edbMx28wiGzpWZggYAk2OgAg3WdvXHeplKp2PuE/RSFuayqa4zouL71/5RgMhDl4EXUf7E0c+TkDp8ly2rep6T83glz7QD4wdIo19DdzuRvy1ScuDMST5R49Dt5ukbjYeUxbZ0LEyQ8AQaHIERLjFdXRy59SJI1+51M1GpV42Him79oWUaRJJC0UbEvdRfZMb5bms5vqWsHzjlEuGZ9ybniHAyi7uUsQFd3xxfPnmm7LIFzHjNwQMgaIiIMItrlFsFuOIrS9I3WxU6o0Njf5l4x0884PAP7fLgzbcPJ1+ckT6IhzysTkdN0vR9XQcJ8Pi+oGrV8yytHFEeS6X6jYRx9Hd8Yv95lbcutnSpiyyoWNlhoAh0OQIiHArpCO5uS1t+Ki0m2TfQsyou+2s2JDdsOHP7no7qzJx2/Olb+ozPRiqrwyuXsUnhpTLc4FCkYyctya2Puo0NpiyaCyCVt8QMAQahYBP+CVtMM62lLQJ964SklihHTBtRcAu9ZubYlM7aZ/yXKC1vVJ7IDPej6+v+QuJm7IoBDWrYwgYAkVDQIRjIQ3m8nuhb4NnUxanhDexMftAkDE1N016wgvj0kHcqLpmRPT4NX8hcVMWhaBmdQwBQ6BoCIhAK6RBfQ9D2tG027C0W1GftVrhfWHsEobRQgmSX0ya5L6HzBCS9CtjBcXNcNTBKS0xROi2ofkLiZeKsjg99HgHT3iVnrsSnyGiF4gI5aNDD3lg+xQRPUVEU0NveVWeuhlZds+ikM/E6hgCTYeACLVCeti6Y2eDWcAVPcZGea7lVunLpVA6OrjludIwGpiNB06g1m9N+wfPxpu0TJsekZvkb89exWKI0G1HP18h8VJQFnuE7lThKlV8cLfPkPBEVxGR9sENxYFwIRE9H8bhj3uRUiRhdiYxZVHIZ2J1DIGmQ0CEWqE9SH2haEfiruVWye86JH0v4pn3FjXoWviS0lyKQMxuJGkPx2ST8L0yfmk07osfT5lsHzJrJR9501ve+hFzgZFSUBbHEdEAJdIxO3BnCCgHH8IniWgNEX2CiC4goj5h3t6hH++9Qj4vMWVR4Jdi1QyBJkIAF8/gTa/Q4ApWtCN5OHarg+Rrnh6jGq8s9OVB6UNTMSCo83B/5OVxS6OxStmfHF8dku+jO3buZii+Cx9NLUP99oF3G7Qn9TQOhcRLQVmcQ0SPKcl+MRF1VWlEpxHRvipvPhHtEy5DYWaxmoi2EtEVikdHkT8Of+3atSsEJ6tjCBgCJYqACEOhGKbYXnKHjJvV2LtAEH7ckXADfrVLeRKa6zb5Hx59L+iiY5+0Tagz7x/uvYUuS0pJ+u0yIOV7PBcvToVNWLyOd4Ym0t3nTZJu7criBCJ6NlQaXw73PbCcFRtsZpHkszAeQ6D1IOAKyqQjl3rPjV7coEoucx1SVygakHgcBU/fKe9HfJgF+OpBsMe14eZXvDw5MS/qYm+l0FAKyqIxy1APEBFmIhKeIKLzJOGjpiwK/VSsniFQmgjAlpJeukk6ShG84pBI18t1JFfqCkVdicdR8GDZSMrPfnBE0KWkm4P+8fHR+jHzipeCssAexAIiOkBtcB/iCPqrnQ3uF8PyCiLqHsY/R0QziOhwp25G0pRFXt+HMRsCrQYBEbZJB5yNP9eRXKkrFH1iNjJi3upIGUiZUPBok+w4IYUg5c1BsRFeaCgFZQFhfka4OY29iJpQunckojPD+GeJ6KXw6OwYIpKlpv8J86eHiuLfGZrBkzBlUeinYvUMgdJGQIRt0lFm498UWnsVnlxU+nTdwOp64NF7G+c/nPKap3mKGT/q5pR7Vt0m9kMKDaWiLDxivWmyTFkU+qlYPUOgtBGYuGR9xsW6XKMVIRrHh2Oo4uJUeOOotJHN2qzwSBuy6S3pYlIc1fXZwvrhLYNkGHlTUxZ5Q2YVDAFDoC0gIMI527O4vrKlDqicWvpWTd+oCe2sSfMiLkHyZUnI59tCeEBhCVenk8Tv6D+T42Y5Mo58qSmLfBEzfkPAEGgTCIjQzfYw2ZTFnQNmMZTD2i07oiay2Z8SJukXm/IS1m2Jv90NMyRSJym95c0ZHHeiS/rMl5qyyBcx4zcEDIE2gQA88+XyUZ3NBwbuOLgBlwB9Ah32miTA1Sl4tEVclPnq9Z64jOet2pxRlk0hSRuot2bzhxn1pEzGkS81ZZEvYsZvCBgCZYPAtOUp391XPTM+uNAml/0geDGzcAOO4YpQ1hQe+CT86r7hEY/kgWp+ifeZvJwXrt4SlcnSlZTHUWyki0tWl0f3mU/clEU+aBmvIWAIlB0CENjixQ4Pf9+gOYHwhuMlN8Dftyuckf5HzwkRqy6PMmOUxZtT3g+WuqTO5U+NDaq4nvmkHBSKDcFnZBHlhQZTFoUiZ/UMAUOgLBG4/sVJkULwAQCBDDeoWoC/MGZJxKrzo8wYZYEb39rB05+7jwmqwGyHbkfHr3kupZjilsR0n/nETVnkg5bxGgKGQNkjIL4jIKCzBRHgKzdtD+5XCK/ku/W1f23heX3Scta3yWUZCm0Jj0uve3FS0FWcQpFx5EtNWeSLmPEbAoZAWSMAMx0ioLMBgVkAlpHcIHVBdZBjtyd0StuG+t2DIxjKRurAuqwEyXNp5StTAhZ9AVDzSP18qSmLfBEzfkPAEChrBLS/iUKAiBPcstx07K2D+NxuIwMF0XP0YoYDJ6kjfjHQr+SBnnbXsCj9yNvzo2FpHolHhXlGTFnkCZixGwKGQHkjcPxt6V/+hSAhQhse/XQQEyOVr0zmS0KfFriQh3scUqf/tBVRFckD1UtOmKFI0DwSl7J8qSmLfBEzfkPAEChrBK5+dnwgvDv3b3h0NgkwIrRxDNcNmF3g+C2sw4JvyMyVkTvWw28YkMEu7YAiSFpb0ZU8obf1bXiCK6PRLAlTFlnAsSJDwBAwBFwEsIeAX/+uFz6XLy4tghvtxAVsZIMP9qlwHPeqZ8fz6AVrM9ilnXGLUvmS1kySJxSnqwoNpiwKRc7qGQKGgCFQAALD56zmR99J7yv4mujw2rRAWUxast5XHOT97K63+aTOQ6NyUQhRRjjb+Ev3MdGsA+5fCw2mLApFzuoZAoaAIdBECECovz17VV6tz1+1mUfOW5NRB+1oHxoZhXkmTFnkCZixGwKGgCHQ2hDwzTryfYZSURanh/6z5xFRpceTxWeI6IXQ+dFoIto/5PkDEU1Sfx8T0fc99aMs82eR7ydi/IaAIdDaEWgrymIPIoKHPHi/+zQRTSai9pF0T0WuctyqQnG44bCwHTc/I23KorV/9jZ+Q8AQyBeBtqIsjiOiAUqiVxER/nRAOfgQ4LN7DRF9IkwLuZWIbpFEHDVlke9nZvyGgCHQ2hFoK8riHCJ6TAn3i4moq0ojOo2I9lV5mInso9KIIu9QJ69B0pRFa//sbfyGgCGQLwLPjV7McOTUmFAKexbFUBY/JKKpDTRDOuOK8EHHtWvXrjF4WV1DwBAwBMoSgVJQFsVYhrqbiKrTuiE+ZjOLsvzO7aENAUOgkQiUgrLAHsQCIjpAbXAf4oj7q50N7hdV+X8R0fJwg1xl+6OmLBr5xVh1Q8AQKEsESkFZQKqfQURzwn2HmlDMdySiM8P4Z4nopfDo7BhHMZxERO/5VUPDXFMWZfmd20MbAoZAIxEoFWXRUKo3UY4pi0Z+MVbdEDAEyhIBUxZl+drtoQ0BQ8AQyA8BUxb54WXchoAhYAiUJQKmLMrytdtDGwKGgCGQHwKmLPLDy7gNAUPAEChLBMpOWRDR6vChxxVIFxVYr9D+CqlnYyQqBDe3juFoOLrfREumW/p7hOy0kAcC+FhKPdgYi/OGDEfDsTgIFKeV1vA9FudJ20grreGF2RiL87EZjoZjcRAoTiut4XsszpO2kVZawwuzMRbnYzMcDcfiIFCcVlrD91icJ20jrcAoYakHG2Nx3pDhaDgWB4HitNIavsfiPKm1YggYAoaAIWAIGAKGgCFgCBgChkDZI5DLT3hTAvQNIhpKRDOIaDoR/SPs7IbQ4q74IYdBRgnwNgif5rOJ6OeSSURN+Rw42ge/IhiPrK/uRUQDiWhuSPcMxwJPh/eFY5xCREeoMV4S8qMO4sUK31b+2jHGTUT0TyJqaRyfIKJVoZMvedZi4nZk+F7wPQBz18uk9JmN+sbYmYhmERHeXy8i+mLYwP5EtF1h/ZBqOG4scc+rquaM+sZYzHcLy9ijw28Wrp3hBjrf4Bsj2pL/w/g/hDhCS+EYdm+kEASS+AkvpN2kdb6qhOn/F1rohZ9y/Ee43tMIyuDL/DOh6Xd4EcQzNPVz4EN3PRjeQUSV4RhBbw/jUGz9QsF1bPifEEUQGjBZDwrFgrgoGM+jFpwFLD4gov1KAMcTw/cLj5ASiokbLDUDYygJYP4L6SQP6hvjz0I3x2gG71XeLYScfhbdTdxY4p5X180V942xmP9H4Brh/HAQUID/l2tAnnLfGDVbFyKqDzNaCkc9HovniUASB015Ntko9teI6LQsQs71Yy4+zJv6OXzKAjMbKDsEUKQRHiaiC8I4iPAhD2USXD7JbyyFoBsRNhInUJoTR1cwCB4YYmNwQ138+pfg4iv5Sag7Rl3nLCJ6NsyI48s2lrjn1X0kibt9F+vdQtGuUcrR/b+UZGzC445R8tHHUiI6OMyI42sOHGVMRvNEIInr1zybLJgdH9ASIvp8qCwgoLEMgOmt/AKHD/OLVA+PExGeoamfYyERTSCi8UQkJzc2qHHgP4Ok3yCiH6mywUR0VDhTqlX5dTGzJ8VSUBR4XRPWhEBpaRxdwSA4YYiNwQ2YDlII/ZiIgH0hwR2jbqOP+ubAt5WIJhLR20SEPhGyjSXuecOqiYk7xmK9W8yYsYwnAUvDcbMn4Ymj7hiFD7MOWb5FXkviKGMymicCTS1kkw7nf0JB/LuwwlfCpSV4C7wlVBgoaill8fVwXF8Ol8Hw8WshgOL1IU9LKgusNeNXIvBDKAUcXQFSLNyyCejw8RMTd4xSEQ7LsGcBpYaA5c+9wzj2KPBrGT9uso0l7nnDZhITd4zFerfNoSy6EdF16klbEkc1DIvmg4A75XSXJ/Jpq1DeTxERlpP+FdOA/k/ijq+5lqH00GT6H7e84C4vCZ+7TOLy6T4Kjf+GiN6KqdxSOOp+MTTBA/FSXob6ExGNIqL/F4MnsoeFiqI5lk9cHPWwdFm+/0egCJtyGQrupVcS0b56wE68OXF0urZkUgSS+AlP2lYhfPhQexDRPU5l/OeTcC0RPR8m4MNcb3Bjkxgbuk35HJ8jImy+IyA+Mjx5hRMzeoMbG5kIv3Q2uLHxiYCNbSxnYUkNf4gjr5gBOP1ZNVgKOGpBhqEVEzd3U1mfmlMw5Iy6Y8TJOpzQ+5JTE2l8bwgHhif25B3GjSXuecNmEhN3jMV8t3DtrDe4r0o8qkxGd4woBZZYstOhJXHU47B4ngj4/ITn2UTB7Fjb53BvQo7YYTxPh0cisWfxutpIRkdYGsApKPxC1adfmuo5IBSgoPCH473iSx3LEdiPwDFYrJ2L0IACfCAcI47bYolCwl/C9WGsEWuhLuWNoVBka4noC6qRlsaxJxGtIKKdRLSMiC4Nl3GKhRuwxfo6vgcsUcpykYIgZ9Q3RrwfLDHJNylHZM8OvwHkYw/r16r1uLHEfSeqas6ob4zFfLf4xqHs8NxQHFgmyjf4xog2niSivzqNtRSOzjAsaQgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAqWPwO7wSCeO8uL45vE5hgyLqUnOzcvFqBzNlVUxjn3CyoEFQ8AQMARaHQJb1Ihhot298KSKg6jvopTLg3RLKQtcqCzVYMqiVN+MjcsQMARyIqCVxblE1DusAftauOyG2QYuA8L0BwJudYsPBtwmRqgIeTA76RTmQVnAFDcuZ81RRvJwYxn1xoaXJ68M+XGD+J1wloOLcWJULywOCIwY4mY7xoN2vxkWQgjjoht8KNwVXmjEc+AS5ntEdHjIh2fqri5o4jIXAizrwhQHnhWXyMCHgGfBzWu0c2eYB4wwPjwrxosQ90y41IfLfbjwiYuWfW1mESJmxBAwBFodArIMBfPcG4kIBu0Q8AsdRu0QxDgchJ87s8Ctd5gsEZtHcvMcygI+BxBwG14susLKrljLxc1eWA+FsxwYhpPb7BC+YhIlbCIgUBbC80dlFRbKAgYXxXTG/UTUIax4inKSA+WlTcHATAqeDUIfN9YRoPjgJwE3pSHk5Ra3OCyCohJDkJIX90wwZAmHVhjX10JjkbYMFQJtxBAwBFoXAnpmAUOQMEECAQmDjPhVjF/VMEeB2cT/epQFFMLlnkeGsjghzIdFUzFb/XI40xDTF7BphV/2sLwLHhhW/L6nPWRBWcCUBALGB3MkCFAW2lMgTH4LH8rFmitMwosPhFRNol+Fhu9kPJhJwFQ9lCVmDzDRDqEv3t4wg4ECwDOLxdi4Z4JigkkWCa/azEKgMGoIGAKtDQGtLDB2WPSE6XRYSYUbSwhlBAhqzCrcmUU2ZSF2rPDrHfURXnHc14bZAcGvbwhhCG7MHNyANjALQcC4YN0Uwd0LyEdZwB4T7BD5AmY+mBVBYQxRDD8koo7hM0FhxD2TKQsFmkUNAUOgdSOglcV3QgGMZRP4L8dyDsLJoYFGKAoIx8VhPgisgMYtQ/mUBZZssJ8gSuhb4RIQ3LbKMhKcLenlIukOykIs88JpFRwJIbjKAv6z4QwK4aTQuRDi2IPQ7WIZChZL4SRL9j+wHIUxYd8CShMBxhRlFnNQmAeCfRfMguKeCTMSmL3Hc2FPBj5KbBlKAWhRQ8AQaD0IyJ4Ffs1j2QUm0REwG8CmL9bosSk8M5xVoOy5cJNXNrghwLF8gzZuTVXPOA2lZxZwQAUetIuN4qGhMMYyEtKYFQxXM4iwuYBAWWDfAUtjENQi4F1lgX2TuA3up9QGtTjHwr4G2kO7+DszFO7YREcaY5VlLiwlydjvDZfs4p5Jb3Bj6co2uPXbtLghYAgYAk2EAJQFFI8FQ8AQMAQMAUMgFgFTFrHQWIEhYAgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCFgCBgChoAhYAgYAoaAIWAIGAIlicD/D3N/MwH/n4qyAAAAAElFTkSuQmCC"}},"execution_count":null},{"metadata":{"_uuid":"4595b55099a864b7bda54ee19bfbfcb799136b2a"},"cell_type":"markdown","source":"从损失函数当中可以看到，在尾部训练集和验证集曲线已经出现较大差距，这意味着模型在较小的学习率下开始出现过拟合问题。","execution_count":null},{"metadata":{"trusted":true,"_uuid":"d3dec96dfefbf8bce0653122eeaa4539c5ad7c68"},"cell_type":"code","source":"# 再次查看 Confusion matrix\ninterp = ClassificationInterpretation.from_learner(learner)\ninterp.plot_confusion_matrix(title='Confusion matrix')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d218bd64e3c68e9814de4058287bee69fae61acf"},"cell_type":"code","source":"# 保存第二次的模型结果\nlearner.save(MODEL_PATH + '_stage2')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"a7ab67d367443802daef153ac452053833112001"},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c4b0274418a67c87f5d9dd538a392d3d520cc70f"},"cell_type":"markdown","source":"-------------------------\n# Validation and analysis\n","execution_count":null},{"metadata":{"trusted":true,"_uuid":"4891afd988159436ec176dbcca6ddcf7cfd962fa"},"cell_type":"code","source":"preds,y, loss = learner.get_preds(with_loss=True)\n# 获取准确率\nacc = accuracy(preds, y)\nprint('The accuracy is {0} %.'.format(acc))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e8b994cb6e711b0e0702ecdcbc86168a5d93258e"},"cell_type":"markdown","source":"下面通过可视化来进一步查看被错误标记的样本","execution_count":null},{"metadata":{"trusted":true,"_uuid":"0399dfe70ae97a156c84034c8093413af61a6334","_kg_hide-input":true},"cell_type":"code","source":"# 返回交叉验证集中损失值最大的样本\nfrom random import randint\n\ndef plot_overview(interp:ClassificationInterpretation, classes=['Negative','Tumor']):\n    \n    tl_val,tl_idx = interp.top_losses()\n    #classes = interp.data.classes\n    fig, ax = plt.subplots(3,4, figsize=(16,12))\n    fig.suptitle('Predicted / Actual / Loss / Probability',fontsize=20)\n    \n    # 随机处理\n    for i in range(4):\n        random_index = randint(0,len(tl_idx))\n        idx = tl_idx[random_index]\n        im,cl = interp.data.dl(DatasetType.Valid).dataset[idx]\n        im = image2np(im.data)\n        cl = int(cl)\n        ax[0,i].imshow(im)\n        ax[0,i].set_xticks([])\n        ax[0,i].set_yticks([])\n        ax[0,i].set_title(f'{classes[interp.pred_class[idx]]} / {classes[cl]} / {interp.losses[idx]:.2f} / {interp.probs[idx][cl]:.2f}')\n    ax[0,0].set_ylabel('Random samples', fontsize=16, rotation=0, labelpad=80)\n    \n    # 损失值最高的错误分类样本\n    for i in range(4):\n        idx = tl_idx[i]\n        im,cl = interp.data.dl(DatasetType.Valid).dataset[idx]\n        cl = int(cl)\n        im = image2np(im.data)\n        ax[1,i].imshow(im)\n        ax[1,i].set_xticks([])\n        ax[1,i].set_yticks([])\n        ax[1,i].set_title(f'{classes[interp.pred_class[idx]]} / {classes[cl]} / {interp.losses[idx]:.2f} / {interp.probs[idx][cl]:.2f}')\n    ax[1,0].set_ylabel('Most incorrect\\nsamples', fontsize=16, rotation=0, labelpad=80)\n    \n    # 损失值最低的正确分类的样本\n    for i in range(4):\n        idx = tl_idx[len(tl_idx) - i - 1]\n        im,cl = interp.data.dl(DatasetType.Valid).dataset[idx]\n        cl = int(cl)\n        im = image2np(im.data)\n        ax[2,i].imshow(im)\n        ax[2,i].set_xticks([])\n        ax[2,i].set_yticks([])\n        ax[2,i].set_title(f'{classes[interp.pred_class[idx]]} / {classes[cl]} / {interp.losses[idx]:.2f} / {interp.probs[idx][cl]:.2f}')\n    ax[2,0].set_ylabel('Most correct\\nsamples', fontsize=16, rotation=0, labelpad=80)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":false,"_kg_hide-output":false,"trusted":true,"_uuid":"adcd722a33466b0a40a193775026d4f86d1b1129"},"cell_type":"code","source":"#interp = ClassificationInterpretation.from_learner(learner)\n# 可视化结果\nplot_overview(interp, ['Negative','Tumor'])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c270a3545fd39bc6f7e02bfda971e59d97b4bb46"},"cell_type":"markdown","source":"### Gradient-weighted Class Activation Mapping (Grad-CAM)\n[Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization](https://arxiv.org/abs/1610.02391)\n\n可视化模型关注度","execution_count":null},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"34e57f42859587eb528c0c3d07c6f2ee88f58b52"},"cell_type":"code","source":"from fastai.callbacks.hooks import *\n\n# hook into forward pass\ndef hooked_backward(m, oneBatch, cat):\n    # we hook into the convolutional part = m[0] of the model\n    with hook_output(m[0]) as hook_a: \n        with hook_output(m[0], grad=True) as hook_g:\n            preds = m(oneBatch)\n            preds[0,int(cat)].backward()\n    return hook_a,hook_g","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"1612cda873b56721486951e702d3271be5a55663"},"cell_type":"code","source":"# We can create a utility function for getting a validation image with an activation map\ndef getHeatmap(val_index):\n    \"\"\"Returns the validation set image and the activation map\"\"\"\n    # this gets the model\n    m = learner.model.eval()\n    tensorImg,cl = imgDataBunch.valid_ds[val_index]\n    # create a batch from the one image\n    oneBatch,_ = imgDataBunch.one_item(tensorImg)\n    oneBatch_im = vision.Image(imgDataBunch.denorm(oneBatch)[0])\n    # convert batch tensor image to grayscale image with opencv\n    cvIm = cv2.cvtColor(image2np(oneBatch_im.data), cv2.COLOR_RGB2GRAY)\n    # attach hooks\n    hook_a,hook_g = hooked_backward(m, oneBatch, cl)\n    # get convolutional activations and average from channels\n    acts = hook_a.stored[0].cpu()\n    #avg_acts = acts.mean(0)\n\n    # Grad-CAM\n    grad = hook_g.stored[0][0].cpu()\n    grad_chan = grad.mean(1).mean(1)\n    grad.shape,grad_chan.shape\n    mult = (acts*grad_chan[...,None,None]).mean(0)\n    return mult, cvIm","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":true,"trusted":true,"_uuid":"76c4fa90fa4c61e88b122f5af14183135d63da10"},"cell_type":"code","source":"# Then, modify our plotting func a bit\ndef plot_heatmap_overview(interp:ClassificationInterpretation, classes=['Negative','Tumor']):\n    # top losses will return all validation losses and indexes sorted by the largest first\n    tl_val,tl_idx = interp.top_losses()\n    #classes = interp.data.classes\n    fig, ax = plt.subplots(3,4, figsize=(16,12))\n    fig.suptitle('Grad-CAM\\nPredicted / Actual / Loss / Probability',fontsize=20)\n    # Random\n    for i in range(4):\n        random_index = randint(0,len(tl_idx))\n        idx = tl_idx[random_index]\n        act, im = getHeatmap(idx)\n        H,W = im.shape\n        _,cl = interp.data.dl(DatasetType.Valid).dataset[idx]\n        cl = int(cl)\n        ax[0,i].imshow(im)\n        ax[0,i].imshow(im, cmap=plt.cm.gray)\n        ax[0,i].imshow(act, alpha=0.5, extent=(0,H,W,0),\n              interpolation='bilinear', cmap='inferno')\n        ax[0,i].set_xticks([])\n        ax[0,i].set_yticks([])\n        ax[0,i].set_title(f'{classes[interp.pred_class[idx]]} / {classes[cl]} / {interp.losses[idx]:.2f} / {interp.probs[idx][cl]:.2f}')\n    ax[0,0].set_ylabel('Random samples', fontsize=16, rotation=0, labelpad=80)\n    # Most incorrect or top losses\n    for i in range(4):\n        idx = tl_idx[i]\n        act, im = getHeatmap(idx)\n        H,W = im.shape\n        _,cl = interp.data.dl(DatasetType.Valid).dataset[idx]\n        cl = int(cl)\n        ax[1,i].imshow(im)\n        ax[1,i].imshow(im, cmap=plt.cm.gray)\n        ax[1,i].imshow(act, alpha=0.5, extent=(0,H,W,0),\n              interpolation='bilinear', cmap='inferno')\n        ax[1,i].set_xticks([])\n        ax[1,i].set_yticks([])\n        ax[1,i].set_title(f'{classes[interp.pred_class[idx]]} / {classes[cl]} / {interp.losses[idx]:.2f} / {interp.probs[idx][cl]:.2f}')\n    ax[1,0].set_ylabel('Most incorrect\\nsamples', fontsize=16, rotation=0, labelpad=80)\n    # Most correct or least losses\n    for i in range(4):\n        idx = tl_idx[len(tl_idx) - i - 1]\n        act, im = getHeatmap(idx)\n        H,W = im.shape\n        _,cl = interp.data.dl(DatasetType.Valid).dataset[idx]\n        cl = int(cl)\n        ax[2,i].imshow(im)\n        ax[2,i].imshow(im, cmap=plt.cm.gray)\n        ax[2,i].imshow(act, alpha=0.5, extent=(0,H,W,0),\n              interpolation='bilinear', cmap='inferno')\n        ax[2,i].set_xticks([])\n        ax[2,i].set_yticks([])\n        ax[2,i].set_title(f'{classes[interp.pred_class[idx]]} / {classes[cl]} / {interp.losses[idx]:.2f} / {interp.probs[idx][cl]:.2f}')\n    ax[2,0].set_ylabel('Most correct\\nsamples', fontsize=16, rotation=0, labelpad=80)","execution_count":null,"outputs":[]},{"metadata":{"_kg_hide-input":false,"trusted":true,"_uuid":"26965128db3010f2e43dd0875fed848601411265"},"cell_type":"code","source":"plot_heatmap_overview(interp, ['Negative','Tumor'])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"e50ab570e1cc77979c082c8da561f93f6669f7aa"},"cell_type":"markdown","source":"结果显示当某一样本被检测为 tumor 时，模型的所真正认为的 tumor 是在具体的哪部分，通过热度图进行可视化","execution_count":null},{"metadata":{"_uuid":"1afca3014ca68714928c96c578b6bd1e4f820fc8"},"cell_type":"markdown","source":"### ROC curve and AUC","execution_count":null},{"metadata":{"trusted":true,"_uuid":"02b156c4b335575ac8b9e64e7c9ea8d2a1dead34"},"cell_type":"code","source":"from sklearn.metrics import roc_curve, auc\nprobs = np.exp(preds[:,1])\n# 计算 ROC 曲线\nfpr, tpr, thresholds = roc_curve(y, probs, pos_label=1)\n\n# 计算 ROC 面积\nroc_auc = auc(fpr, tpr)\nprint('ROC area is {0}'.format(roc_auc))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c6f6818925d9356185761f12f12594f3decd8ded"},"cell_type":"code","source":"plt.figure()\nplt.plot(fpr, tpr, color='darkorange', label='ROC curve (area = %0.2f)' % roc_auc)\nplt.plot([0, 1], [0, 1], color='navy', linestyle='--')\nplt.xlim([-0.01, 1.0])\nplt.ylim([0.0, 1.01])\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive Rate')\nplt.title('Receiver operating characteristic')\nplt.legend(loc=\"lower right\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"54efc207cf58612e6c27ba69cf7fbcd987a28ce3"},"cell_type":"markdown","source":"----------------\n\n# Submit predictions\n### TTA\n\n对测试集使用测试时增强","execution_count":null},{"metadata":{"trusted":true,"_uuid":"5b9d4a6eee767bbed3f0ca889ea1ce4c4fffc607"},"cell_type":"code","source":"# 导入最优模型\nlearner.load(MODEL_PATH + '_stage2')\n\n# TTA \nn_aug = 12\npreds_n_avg = np.zeros((len(learner.data.test_ds.items),2))\nfor n in tqdm_notebook(range(n_aug), 'Running TTA...'):\n    preds,y = learner.get_preds(ds_type=DatasetType.Test, with_loss=False)\n    preds_n_avg = np.sum([preds_n_avg, preds.numpy()], axis=0)\npreds_n_avg = preds_n_avg / n_aug","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"45a59c0e64fc20d1e3a3362f0479b43bf1cbbb3b"},"cell_type":"code","source":"# 输出可能性\nprint('Negative and Tumor Probabilities: ' + str(preds_n_avg[0]))\ntumor_preds = preds_n_avg[:, 1]\nprint('Tumor probability: ' + str(tumor_preds[0]))\n# argmax 输出分类结果\nclass_preds = np.argmax(preds_n_avg, axis=1)\nclasses = ['Negative','Tumor']\nprint('Class prediction: ' + classes[class_preds[0]])","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"eaa1a9651dff68793b4c66431d549e7eac2659a5"},"cell_type":"markdown","source":"### Submit the model for evaluation","execution_count":null},{"metadata":{"trusted":true,"_uuid":"453af28df5ec8db3bf01b51febe332af3622d37c"},"cell_type":"code","source":"SAMPLE_SUB = '/kaggle/input/sample_submission.csv'\nsample_df = pd.read_csv(SAMPLE_SUB)\nsample_list = list(sample_df.id)\n\n# 根据索引生成键值对\npred_list = [p for p in tumor_preds]\npred_dic = dict((key, value) for (key, value) in zip(learner.data.test_ds.items, pred_list))\npred_list_cor = [pred_dic['///kaggle/input/test/' + id + '.tif'] for id in sample_list]\ndf_sub = pd.DataFrame({'id':sample_list,'label':pred_list_cor})\n\n# 导出 csv\ndf_sub.to_csv('{0}_submission.csv'.format(MODEL_PATH), header=True, index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"skf=StratifiedKFold(n_splits=k_folds) \n\nfor i,(trdex,valdex) in enumerate(skf.split(X=dataset.id.values,y=dataset.label.values)): \n    train_sub_dataframe=dataset.iloc[trdex] print(trdex.shape)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}