{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 构建模型示例\n", "1. 省略了读取config相关代码(在../Segmentation.py Segmentation3D的BuildSegModel中有读取参数+构建模型的全部过程)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 引入相关库文件" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "import os\n", "import sys\n", "import six\n", "import glob\n", "import math\n", "import pandas as pd\n", "import numpy as np\n", "from keras.utils import to_categorical\n", "import scipy.ndimage as nd\n", "from scipy.ndimage import zoom\n", "import random" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import keras\n", "import tensorflow as tf\n", "from keras import Model\n", "from keras import backend as K\n", "from keras.regularizers import l2\n", "from keras.engine import Layer,InputSpec\n", "from keras.layers.merge import concatenate\n", "from keras.callbacks import TensorBoard,Callback\n", "from keras.layers.advanced_activations import LeakyReLU\n", "from keras.preprocessing.image import ImageDataGenerator\n", "from keras.layers.normalization import BatchNormalization\n", "from keras.callbacks import ModelCheckpoint, ReduceLROnPlateau\n", "from keras import initializers, regularizers, constraints,optimizers\n", "from keras.callbacks import ModelCheckpoint, LearningRateScheduler,TensorBoard\n", "from keras.layers import Add,Input,Conv3D,Convolution3D,Dropout,UpSampling3D,Concatenate,MaxPooling3D,\\\n", "GlobalAveragePooling3D,Dense,GlobalMaxPooling3D,Lambda,Activation,Reshape,Permute, PReLU, Deconvolution3D,Multiply,GlobalAveragePooling3D,Dense" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 引入相关模型文件" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "sys.path.append('./backbones/')\n", "sys.path.append('./baseLayers/')\n", "from ResNet import Resnet3DBuilder\n", "from VGGmodel import VGG\n", "from NoduleSegEncoder import NoduleSegEncoder_proxima\n", "from InstanceNorm import InstanceNormalization" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "sys.path.append('./decoders/')\n", "from NoduleSegDecoder import NoduleSegDecoder_proxima" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from modelBuild import build_model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 参数定义" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 定义共用参数" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "num_blocks = 5\n", "strides = [1,2,2,2,2]\n", "nodule_seg_strides = [1,2,2,2,2]\n", "atrous_rates = [1,1,1,1,1]\n", "base_filters = 32\n", "norm_func = InstanceNormalization\n", "activation_func = LeakyReLU\n", "kernel_size = 3\n", "padding = 'same'\n", "dropout_rate = 0.5\n", "input_shape = (32,64,64,1)\n", "num_classes = 1\n", "kernel_initializer = 'he_normal'\n", "kernel_regularizer = None " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 定义每一个模型的参数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# VGG的参数" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "parameter_list = {\n", " 'num_blocks':num_blocks,\n", " 'strides':strides,\n", " 'atrous_rates':atrous_rates,\n", " 'base_filters':base_filters,\n", " 'norm_func':norm_func,\n", " 'activation_func':activation_func,\n", " 'kernel_size':kernel_size,\n", " 'padding':padding,\n", " 'dropout_rate':dropout_rate,\n", " 'num_classes':num_classes,\n", " 'classification_layers':GlobalMaxPooling3D\n", "}" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "resnet_parameter_list = {\n", " 'base_filters':base_filters,\n", " 'norm_func':norm_func,\n", " 'activation_func':activation_func,\n", " 'kernel_size':kernel_size,\n", " 'padding':padding,\n", " 'dropout_rate':dropout_rate,\n", " 'num_classes':num_classes,\n", " 'classification_layers':GlobalMaxPooling3D,\n", " 'init_kernel_size':1\n", "}" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "noduleseg_parameter_list = {\n", " 'num_blocks':num_blocks,\n", " 'strides':nodule_seg_strides,\n", " 'atrous_rates':atrous_rates,\n", " 'base_filters':base_filters,\n", " 'norm_func':norm_func,\n", " 'activation_func':activation_func,\n", " 'kernel_size':kernel_size,\n", " 'padding':padding,\n", " 'dropout_rate':dropout_rate,\n", " 'num_classes':num_classes,\n", " 'classification_layers':GlobalMaxPooling3D\n", "}" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "noduleseg_decoder_parameter_list = {\n", " 'kernel_initializer':kernel_initializer,\n", " 'kernel_regularizer':kernel_regularizer,\n", " 'kernel_size':kernel_size,\n", " 'final_kernel_size':1,\n", " 'norm_func':norm_func,\n", " 'activation_func':activation_func,\n", " 'kernel_size':kernel_size,\n", " 'padding':padding,\n", " 'seg_num_class':1,\n", " 'merge_axis':-1,\n", " 'SEB_choice':True,\n", " 'ACR_choice':False,\n", " 'OCR_choice':False,\n", " 'deep_supervision':True,\n", " 'num_units':[3,3,3,3],\n", " 'aux_task':False,\n", " u'densityTypeConvertMap': \n", " {u'1': 1,\n", " u'2': 2,\n", " u'3': 3,\n", " u'4': 4,\n", " u'5': 1,\n", " u'6': 4},\n", " u'num_classes': num_classes\n", " \n", " \n", " \n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 将各个模型的参数放到字典中,根据名字提取参数" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "model_parameter_list = {\n", " \"NoduleSegDecoder_proxima\":noduleseg_decoder_parameter_list,\n", " \"NoduleSegEncoder_proxima\":noduleseg_parameter_list,\n", " \"VGG\":parameter_list,\n", " \"Res\":resnet_parameter_list\n", " \n", " \n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 可能的encoder有:\n", " NoduleSegEncoder_proxima(结节分割encoder)\n", " Res(resnet,目前调用形式仍需改写)\n", " VGG(VGG)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 可能的decoder:\n", " NoduleSegDecoder_proxima" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "Encoder is NoduleSegEncoder_proxima, decoder is NoduleSegDecoder_proxima\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "decoders/NoduleSegDecoder.py:54: UserWarning: Update your `Conv3D` call to the Keras 2 API: `Conv3D(kernel_initializer=\"he_normal\", name=\"NoduleSegDecoder_Block01_conv\", activation=None, padding=\"same\", kernel_regularizer=