1.assert()函数(断言)
用于判断一个表达式,在表达式条件为 false 的时候触发异常。
断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况
- 可以提前结束程序
def masks_Unet(masks):
assert (len(masks.shape)==4) #4D arrays
assert (masks.shape[1]==1 ) #check the channel is 1
im_h = masks.shape[2]
im_w = masks.shape[3]
masks = np.reshape(masks,(masks.shape[0],im_h*im_w))
new_masks = np.empty((masks.shape[0],im_h*im_w,2))
for i in range(masks.shape[0]):
for j in range(im_h*im_w):
if masks[i,j] == 0:
new_masks[i,j,0]=1
new_masks[i,j,1]=0
else:
new_masks[i,j,0]=0
new_masks[i,j,1]=1
return new_masks`
例如:
a = 5
assert (a==1)
报错:
2.python中 / 和 // 的区别
- “ / ” 为浮点数除法,返回浮点结果
print(“6 / 4 =” + str(6 / 4)) //1.5 - “ // ” 表示整数除法,返回不大于结果的一个最大整数
print(“6 // 4 =” + str(6 // 4)) //1
3.Python numpy函数:zeros()、ones()、empty()
4.Keras Model类中的predict()与predict_generator()
5.模型评价指标——准确性、特异性、敏感性
5.1. 准确率:Accuracy——整体的正确率
Accuracy = (True positives + True negatives) / all samples
- 注意:
在类别不平衡问题中难以准确度量:比如98%的正样本只需全部预测为正即可获得98%准确率
5.2. 【精确率】【查准率】 Precision:
Precision = True positives / (True positives + False positives)
eg.垃圾邮件:要有更高的查准率,即使漏放进来几个垃圾邮件,也不要把正常邮件给挡在外边
5.3. 【召回率】【查全率】 Recall:(敏感性)(真阳性率)
Recall = True positives / (True positives + False negatives)
eg.肿瘤判断和地震预测等场景,要求有更高的查全率,宁可错杀三千,也不放过一个
5.4. 特异性:(真阴性率)
Specificity = TN / (TN + FP)
5.5. 敏感性:(真阳性率)
Sensitivity = TP / ( TP + FN )
5.6. 假阳性率
- FPR = FP / ( FP + TN )
5.7. ROC Curve:横轴—FPR(最好为0),纵轴—TPR(最好为1)
在确保准确性不变的情况下选择不同的判断阈值 Decision Rule 而造成 Sensitivity 和 Specificity 的值的不同
- 很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。而Precision-Recall曲线会变化剧烈,故ROC经常被使用。
5.8.AUC(Area Under Curve)被定义为ROC曲线下的面积
完全随机的二分类器的AUC为0.5,虽然在不同的阈值下有不同的FPR和TPR,但相对面积更大,更靠近左上角的曲线代表着一个更加稳健的二分类器。
同时针对每一个分类器的ROC曲线,又能找到一个最佳的概率切分点使得自己关注的指标达到最佳水平。
5.9.F1系数:
F1兼顾了分类模型的准确率和召回率,可以看作是模型准确率和召回率的调和平均数,最大值是1,最小值是0。
5.10.Jaccard similarity coefficient—— 杰卡德相似系数
- 杰卡德相似系数是衡量两个集合的相似度一种指标。
- 两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。
6.np.array()和np.asarray()的区别
- array和asarray都可以将结构数据转化为ndarray
- 区别:
np.array (默认情况下)将会copy该对象
np.asarray 除非必要,否则不会copy该对象,占用更少的内存
7.random.randint( a, b):返回范围[a, b]内的随机整数,包括两个端点
- 输出[20,30]范围内的1个随机整数
-
print("random.randint(20)=",random.randint(20,30))
8.Conv2D相关:
8.1.卷积前后尺寸变化公式
- out_size = [ ( in_size + padding - filter_size ) / stride ] + 1
class Conv2D(Conv):
def __init__(self,
filters,
kernel_size,
strides=(1, 1),
padding='valid',
data_format=None,
dilation_rate=(1, 1),
groups=1,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs):
- eg:此时如果conv7 = 5 x 3 x 48 x 48,
依据data_format=‘channels_first’,则说明conv7数据是:5个通道为3,h * w 是48*48的数据 - ==>>输出的up8 = 5 x 128 x 47 x 47 的数据
up8 = Conv2D(128, 2, activation='relu', padding='same', data_format='channels_first')(UpSampling2D(size=(2, 2))(conv7))
8.2. 参数解释:
- filters:就是参与卷积的卷积核,对应的是输出的维数
- kernel_size,卷积核的大小,如果是单个整数则表示,长、宽相等
- strides=(1, 1), 横向和纵向的步长,如果为一个整数则表示,横纵的步长相等
- padding=‘valid’,valid表示不够卷积核大小的块,则丢弃
same表示,不够卷积核大小的块的就补0,所以输出和输入形状相同 - data_format=None, channels_last表示(batch,height,width,channels)
channels_first表示 (batch,channels,height,width) - dilation_rate=(1, 1), 表示空洞卷积的设置
- activation=None,激活函数的选择
- use_bias=True, 是否使用偏差量bias
- kernel_initializer=‘glorot_uniform’, 卷积核的初始化
- bias_initializer=‘zeros’,偏差bias的初始化,如果是None,则使用默认初始值
- kernel_regularizer=None,卷积核的正则项
- bias_regularizer=None,偏差量的正则项
- activity_regularizer=None,输出项的正则函数
- kernel_constraint=None,
- bias_constraint=None,映射函数,当偏差量被Optimizer更新后应用到偏差量上
8.3.空洞卷积
10.keras中的模型定义
主要通过add函数来添加layers,而这些layers包含比如:
- 卷积层Conv2D、
- 池化层Pool,
- 全连接层Dense,
- 激活函数层Activation等
10.1.keras.layers.core.Reshape(),改变数据的形状
- conv10输出 = (None, 2, 2304) #因为本例中:48*48=2304
- #
None
is the batch dimension
conv10 = keras.layers.core.Reshape((2,patch_height*patch_width))(conv9)
10.2.keras.layers.core.Permute(),改变数据的先后顺序
- 输入的conv10 = (None, 2, 2304)
- 输出的conv11 = (None, 2304, 2)
conv11 = keras.layers.core.Permute((2,1))(conv10)
10.3.keras.layers.core.Activation()——激活函数,ReLu、Sigmoid……
- 输出的conv12,是基于sigmoid计算的
conv12 = keras.layers.core.Activation('softmax')(conv11)
eg.当采用relu作为激活函数时
>> > layer = tf.keras.layers.Activation('relu')
>> > output = layer([-3.0, -1.0, 0.0, 2.0])
>> > output = [0.0, 0.0, 0.0, 2.0]
10.4.model.compile()函数
def compile(optimizer,
loss=None,
metrics=None,
loss_weights=None,
sample_weight_mode=None,
weighted_metrics=None,
target_tensors=None,
**kwargs)
- optimizer 优化器,比如SGD
- loss 损失函数,比如categorical_crossentropy
- metrics度量标准: 想要在模型训练和测试过程中要评估的内容所组成的度量标准列表,比如包含准确度,[“accuracy”]
- loss_weights:loss_weights的长度需要跟输出的个数一样,作用于多个输出,可以通过设置不同输出的loss的权重来决定训练过程,比如在手写数字识别中有10个输出,分别代表属于每个数字的概率,loss_weights就是给这十个输出的loss加上权重。
- sample_weight_mode:如果你需要执行按时间步采样权重(2D 权重),请将其设置为 temporal。 默认为 None,为采样权重(1D)。具体的sample_weight是再fit函数中设定
weighted_metrics:在训练和测试期间,由 sample_weight 或 class_weight 评估和加权的度量标准列表 - target_tensors:不常用,通常来讲,keras会给模型的目标张量创建占位符,然后在训练的时候把目标张量读入到这些占位符,如果你指定的target_tensors的话,keras就不会在训练的时候从外部再读入目标张量。它可以是单个张量(单输出模型),张量列表,或一个映射输出名称到目标张量的字典。
10.5.model.fit()函数
10.25——U-Net中训练部分代码:
model.fit(patches_imgs_train,
patches_masks_train,
epochs=N_epochs,
batch_size=batch_size,
verbose=1,
shuffle=True,
validation_split=0.1, # 十分之一的数据用在验证集上
callbacks=[checkpointer])
def fit(x=None,
y=None,
batch_size=None,
epochs=1,
verbose=1,
callbacks=None,
validation_split=0.,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False,
**kwargs)
- x:训练数据
- y:是标签
- epochs: 整数。训练模型迭代轮次。一个epoch轮次是在整个 x 和 y 上的一轮迭代
- initial_epochs(整数):开始训练的轮次(有助于恢复之前的训练)。真正训练的次数是epochs-initial_epochs
- verbose: 0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行。
callbacks :一系列的 keras.callbacks.Callback 实例。一系列可以在训练时使用的回调函数。 - validation_split: 0 和 1 之间的浮点数。用作验证集的训练数据的比例。 模型将分出一部分不会被训练的验证数据,并将在每一轮结束时评估这些验证数据的误差和任何其他模型指标
- validation_data(不常用):元组 (x_val,y_val) 或元组 (x_val,y_val,val_sample_weights), 用来评估损失,以及在每轮结束时的任何模型度量指标。 模型将不会在这个数据上进行训练。这个参数会覆盖 validation_split
- shuffle :布尔值(是否在每轮迭代之前混洗数据)
- sample_weight:采样权重主要解决的时样本质量不同的问题,比如前1000个样本的可信度高,它的权重就设置高一点,后1000个样本可信度低,权重就相应要低,这就是采用权重1D,它的长度通常和你的样本量是一致的。按时间采样权重是指在不同的训练阶段赋予不同的权重,它是2D的。
- class_weight: 主要针对的上数据类别不均衡问题,比如:异常检测的二项分类问题,异常数据仅占1%,正常数据占99%; 此时就要设置不同类对loss的影响。
这里的class_weight和上面的loss_weights还是有区别的,class_weight其实跟sample_weight更相近,sample_weight是可以每个样本的loss对于总的loss的影响权重,class_weight是训练数据中每一类的loss对于总的loss的影响权重,而loss_weights是每个样本的每个输出对于该样本的loss的影响权重。
10.6.model.evaluate()函数——输入【数据】和【标签】,输出【损失】和【精确度】
def evaluate(x=None,
label_y=None,
batch_size=None,
verbose=1,
sample_weight=None,
steps=None,
callbacks=None,
max_queue_size=10,
workers=1,
use_multiprocessing=False)
10.7.model.predict()函数——输入【测试集】,输出【预测结果】
- 10.25的U-net中test.py的:
predictions = model.predict(patches_imgs_test, batch_size=2, verbose=2)
print("predicted images size :")
print(predictions.shape)
print(predictions)
def predict(test_x,
batch_size=None,
verbose=0,
steps=None)
10.8. model.evaluate与model.predict两者差异
- 1.输入输出不同
model.evaluate输入数据(data)和金标准(label),然后将预测结果与金标准相比较,得到两者误差并输出.
model.predict输入数据(data),输出预测结果 - 2.是否需要真实标签(标准)
model.evaluate需要, 因为需要比较预测结果与真实标签的误差
model.predict不需要, 只是单纯输出预测结果,全程不需要标准的参与.
11.Keras_保存model文件和载入model文件
11.1.保存model:
1.json文件
# serialize model to JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:
json_file.write(model_json)
11.2.载入model:
- 注意要记得关闭读取流
# load json and create model
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close() 注意要记得关闭读取流
loaded_model = model_from_json(loaded_model_json)
11.3.保存权重的方法:
1.HDF5文件:model.save_weights()
# serialize weights to HDF5
model.save_weights("model.h5")
print("Saved model to disk")
11.4.载入权重:model.load_weights()
# load weights into new model
model.load_weights("model.h5")
print("Loaded model from disk")
eg:
- 加载Unet模型 .json文件
model = model_from_json(open(path_experiment+name_experiment +'_architecture.json').read())
- 加载Unet参数 .h5文件
model.load_weights(path_experiment+name_experiment + '_'+best_last+'_weights.h5')