其他作业指路:⭐李宏毅机器学习2020作业汇总
1.配置环境
第三方库:
cv2
pytorch
torchvision
理论:
keras常用函数:
pytorch常用函数:
程序:
函数:
1.sorted():
当sorted()函数被调用时,它会提供一个有序的列表作为返回值。
2.os.listdir(path):
返回指定路径下的文件和文件夹列表。
3.np.zeros():
在opencv-python中,若想为图像创建一个容器,需要指定dtype=np.uint8,否则虽然你的容器矩阵中是有值的,但是无法正常imshow,另数据类型为 np.uint8,也就是0~255,所以若计算过程中数据超出了这个范围,就会造成溢出。
4.enumerate():
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。如: for i, file in enumerate(image_dir)
5.cv2.resize():
裁剪后的图片还是以numpy array
的方式保存的, 数值的取值范围是(0~255)
cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)
参数:
-
scr
:原图(cv2.imread()中读取出来的) -
dsize
:输出图像尺寸 -
fx
:沿水平轴的比例因子 -
fy
:沿垂直轴的比例因子 -
interpolation
:插值方法
6.dense():
keras.layers.Dense(units,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)
-
units:该层有几个神经元
-
activation:该层使用的激活函数
-
use_bias:是否添加偏置项
-
kernel_initializer:权重初始化方法
-
bias_initializer:偏置值初始化方法
-
kernel_regularizer:权重规范化函数
-
bias_regularizer:偏置值规范化方法
-
activity_regularizer:输出的规范化方法
-
kernel_constraint:权重变化限制函数
-
bias_constraint:偏置值变化限制函数
7.keras.callbacks.TensorBoard()的参数:
keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)
- log_dir:保存TensorBoard要解析的日志文件的目录路径。
- histogram_freq:默认为0。计算模型各层的激活值和权重直方图的频率(以epoch计)。如果设置为0,将不会计算直方图。若想直方图可视化,必须指定验证数据(或分割验证集)。
- write_graph:默认为True。是否在TensorBoard中可视化图形。当设置为True时,日志文件会变得非常大。
- write_images:默认为False。是否写入模型权重,在TensorBoard中将权重可视化为图像。
- update_freq:默认为"epoch"。可以是"epoch","batch" 或者整数。当使用"batch"时,在每个batch后将loss,metrics写入TensorBoard。"epoch"同理。如果使用整数,比如1000,则每经过1000个batch将loss,metrics写入到TensorBoard。过于频繁会减慢训练速度。
- profile_batch:默认为2。每过多少个batch分析一次Profile。profile_batch必须是非负整数或整数的元组。一对正整数表示要进入Profile的batch的范围。设置profile_batch=0会禁用Profile分析。
- embeddings_freq:默认为0。embedding在epochs中被可视化的频率。如果设置为0,embedding将无法可视化。
- embeddings_metadata:默认为None。没看懂。a dictionary which maps layer name to a file name in which metadata for this embedding layer is saved. See the details about metadata files format. In case if the same metadata file is used for all embedding layers, string can be passed.
8.keras.callbacks.ModelCheckpoint():
keras.callbacks.ModelCheckpoint(filepath,monitor='val_loss',verbose=0,save_best_only=False, save_weights_only=False, mode='auto', period=1)
- filename:字符串,保存模型的路径
- monitor:需要监视的值
- verbose:信息展示模式,0或1(checkpoint的保存信息,类似Epoch 00001: saving model to ...)
- save_best_only:当设置为True时,监测值有改进时才会保存当前的模型( the latest best model according to the quantity monitored will not be overwritten)
- mode:‘auto’,‘min’,‘max’之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当监测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。
- save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)
- period:CheckPoint之间的间隔的epoch数
9.CNN的计算:
1. 通道数和卷积核数
卷积核的通道数与输入的通道数相同(输出是这个卷积核对应所有通道的输出的和),如图所示,上图中我们设置的卷积核数是2,卷积核1的输出是下图三个的和
卷积核数与输出通道数相同(如下图设置两个卷积核所以feature map也会是两个)
2. 输出feature map的尺寸的计算
N=(W-F+2P)/S+1
其中N:输出大小
W:输入大小
F:卷积核大小
P:填充值的大小
S:步长大小
3. 整体表示
nn.Conv2d(in_channels=输入通道数,out_channels=输出通道数,kernel_size=卷积核大小,stride=步长,padding=填充)
卷积层输入特征图的尺寸为:
Hinput×Winput×Cinput
- Hinput表示输入特征图的高
- Winput表示输入特征图的宽
- CinputCinput表示输入特征图的通道数(如果是第一个卷积层则是输入图像的通道数,如果是中间的卷积层则是上一层的输出通道数)
卷积层的参数有如下几个:
- 输出通道数为K
- 正方形卷积核的边长为F
- 步幅(stride)为S
- 补零的行数和列数(padding)为P
输出特征图(output feature map)的尺寸为Houtput×Woutput×Coutput,其中每一个变量的计算方式如下:
- Houtput=(Hintput−F+2P)/S+1
- Woutput=(Winput−F+2P)/S+1
- Coutput=K
参数量大小的计算,分为weights和biases:
- weights的参数量:F×F×Cinput×K
- biases的参数量:K
- 总参数量:F×F×Cinput×K+K
10.modle.fit():
fit( x, y, batch_size=32, epochs=10, verbose=1, callbacks=None,validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0)
- x:输入数据。如果模型只有一个输入,那么x的类型是numpy
array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array - y:标签,numpy array
- batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
- epochs:整数,训练终止时的epoch值,训练将在达到该epoch值时停止,当没有设置initial_epoch时,它就是训练的总轮数,否则训练的总轮数为epochs - inital_epoch
- verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
- callbacks:list,其中的元素是keras.callbacks.Callback的对象。这个list中的回调函数将会在训练过程中的适当时机被调用,参考回调函数
- validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。注意,validation_split的划分在shuffle之前,因此如果你的数据本身是有序的,需要先手工打乱再指定validation_split,否则可能会出现验证集样本不均匀。
- validation_data:形式为(X,y)的tuple,是指定的验证集。此参数将覆盖validation_spilt。
- shuffle:布尔值或字符串,一般为布尔值,表示是否在训练过程中随机打乱输入样本的顺序。若为字符串“batch”,则是用来处理HDF5数据的特殊情况,它将在batch内部将数据打乱。
-
class_weight:字典,将不同的类别映射为不同的权值,该参数用来在训练过程中调整损失函数(只能用于训练)
-
sample_weight:权值的numpy
array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为(samples,sequence_length)的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode=’temporal’。 - initial_epoch: 从该参数指定的epoch开始训练,在继续之前的训练时有用。
import os
import numpy as np
import cv2
import keras
import pandas as pd
import time
def readfile(path,lable):
image = sorted(os.listdir(path))#读取标签
#x用来存储图片
x = np.zeros((len(image),128,128,3),dtype=np.uint8)
#y用来存储标签
y = np.zeros((len(image)),dtype=np.uint8)
for i,file in enumerate(image):
img = cv2.imread(os.path.join(path,file))
#将多个路径组合后返回(加上这个训练测试集都可以调用)
x[i,:,:] = cv2.resize(img,(128,128))
if lable:
y[i]=int(file.split("_")[0])
if lable:
return x,y
else:
return x
data_dress="./food-11"
train_x,train_y = readfile(os.path.join(data_dress,"training"),True)
val_x,val_y=readfile(os.path.join(data_dress,"validation"),True)
test_x = readfile(os.path.join(data_dress,"testing"),False)
#设计CNN
modle = keras.models.Sequential()
#输入尺寸(128,128,3)
# padding: same:对边缘补0 valid:对边缘不补0
modle.add(keras.layers.Conv2D(32,(3,3),strides = (1,1),padding = "same",activation="relu",input_shape=(128,128,3)))
modle.add(keras.layers.MaxPooling2D(pool_size = (2,2),strides = (2,2)))
modle.add(keras.layers.Conv2D(64,(3,3),strides = (1,1),padding = "same",activation="relu"))
modle.add(keras.layers.MaxPooling2D(pool_size = (2,2),strides = (2,2)))
modle.add(keras.layers.Flatten())#128个filter??
modle.add(Dropout(0.5))
for i in range(20):
modle.add(keras.layers.Dense(100,activation="selu"))
modle.add(keras.layers.Dense(11,activation="softmax"))
modle.compile(loss = "sparse_categorical_crossentropy",optimizer = "adam",metrics = ["accuracy"])
#激活函数
#网络一共20个layer,每个layer有100个Node。Activation Function选择selu是为了自动批归一化,提高准确率。
dress = "./H5"
epoch=20
if not os.path.exists(dress):
os.mkdir(dress)
#如果地址不存在就创建地址
output_modle = os.path.join(dress,"cnn_classification.h5")
history = modle.fit(train_x,train_y,epochs=epoch)
#计算测试集准确率
modle.evaluate(val_x,val_y)
训练集准确率达到87.5%
测试集准确率却只有29%,使用三种方法:早停,正则化,droupout
参考内容:
1.demo中程序:点击跳转
2.demo中程序:点此跳转
3.使用keras的作业:点击跳转
4.keras常用函数:点击跳转
5.pytorch常用函数:点击跳转