2020.10.25—python笔记—Conv2D()函数—模型评价指标—keras相关函数(载入、保存model、权重参数)

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 而造成 SensitivitySpecificity 的值的不同

  • 很好的特性:当测试集中的正负样本的分布变化的时候,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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值