keras & tensorflow
常规设置
修改默认的分配全部GPU内存设置
from keras import backend as K
import tensorflow as tf
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
K.tensorflow_backend.set_session(tf.Session(config=config)) #(定义会话,模型初始化第一步)
keras版本判断
import keras
from distutils.version import StrictVersion
# keras.__version__ 当前keras版本
if StrictVersion(keras.__version__) < StrictVersion('2.2.0'):
else:
模型定义
整体框架
###训练过程
from keras.layers import Input
# 输入层 定义模型所需要的 [输入的张量(占位?),张量的形状]
input_tensor = Input(shape=(imgSz[0],imgSz[1],self.params.NUM_CHANNELS))
input_shape = (imgSz[0],imgSz[1],self.params.NUM_CHANNELS)
# 模型逐层定义
# backbone(一般参数设置为不可训练)
# 自定义
# model = Model(input, x)
# 损失函数
# 优化算法
# 编译
# return model
#
###推理过程
from keras.layers import Input
# 输入层 定义模型所需要的 [输入的张量(占位?),张量的形状]
input_tensor = Input(shape=(imgSz[0],imgSz[1],self.params.NUM_CHANNELS))
input_shape = (imgSz[0],imgSz[1],self.params.NUM_CHANNELS)
# 模型逐层定义
# backbone(一般参数设置为不可训练)
# 自定义
# model = Model(input, x)
# return model
# 加载权重
#
层
确保正确的输入形状
import keras
from distutils.version import StrictVersion
if StrictVersion(keras.__version__) < StrictVersion('2.2.0'):
from keras.applications.imagenet_utils import _obtain_input_shape
else:
from keras_applications.imagenet_utils import _obtain_input_shape
input_shape = _obtain_input_shape(input_shape,
default_size=224,
min_size=197,
data_format='channels_last',
require_flatten=include_top)
输入层 [输入张量]
from keras.layers import Input
if input_tensor is None:
img_input = Input(shape=input_shape, name='data')
else:
if not K.is_keras_tensor(input_tensor):
img_input = Input(tensor=input_tensor, shape=input_shape)
else:
img_input = input_tensor
中间层 2D
# 批归一化
from keras.layers import BatchNormalization
x = BatchNormalization(name='bn_data')(img_input)
# 填充padding
from keras.layers import ZeroPadding2D
x = ZeroPadding2D(padding=(3, 3))(x)
# 卷积层
from keras.layers import Conv2D
x = Conv2D(init_filters, (7, 7), strides=(2, 2), name='conv0')(x)
# 批归一化
x = BatchNormalization(name='bn0', **bn_params)(x)
# 激活函数
from keras.layers import Activation
x = Activation('relu', name='relu0')(x)
# 填充padding
x = ZeroPadding2D(padding=(1, 1))(x)
# 最大池化
from keras.layers import MaxPooling2D
x = MaxPooling2D((3, 3), strides=(2, 2), padding='valid', name='pooling0')(x)
# **全局**平均池化
from keras.layers import GlobalAveragePooling2D
x = GlobalAveragePooling2D(name='pool1')(x)
# dense
x = Dense(classes, name='fc1')(x)
# 上采样
from keras.layers import UpSampling2D
# 反卷积
from keras.layers import Conv2DTranspose
层间操作–融合
特征求和(线性和)
from keras.layers import Add
x = Add()([x, input_tensor])
# 加减乘除等融合方式
from keras.layers import merge
特征级联
from keras.layers import Concatenate
x = Concatenate()([x, skip])
获取某一层的输出
output = backbone.layers[layersname].output
损失
优化算法
模型编译
model.compile(self.params.OPTIMIZER, loss=loss)
模型相关操作
模型打印输出
model.summary()
模型存储 回调定义
from keras.callbacks import ModelCheckpoint
checkpoint = ModelCheckpoint(filepath=self.params.CHECKPOINT_PATH, monitor='loss', verbose=0, save_best_only=False,
save_weights_only=False, mode='auto', period=self.params.MODEL_SAVE_PERIOD)
模型训练
model.fit_generator(train_datagen, steps_per_epoch=int(len(train_data)/self.params.BATCH_SZ),
epochs=self.params.NUM_EPOCHS, callbacks=[checkpoint])
模型加载权重
model.load_weights(self.params.SINGLEVIEW_TEST_MODEL, by_name=True)
模型推理
pred = model.predict(img)[0,:,:,:]