这里记录一些自己常用的DL编程用法,包括前期的数据处理数据分析到后期的模型训练以及实验结果分析,以便自己快速开发。
数据处理
处理数据标签(lable)
将数值标签进行独热(one-hot)编码
from keras.utils import np_utils
one_hot_y = np_utils.to_categorical(y)
将分类器预测的标签概率分布转化为预测标签
import numpy as np
predict_lables = np.argmax(model.predict(test_X),axis=1)
使用sklearn划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.5)
使用sklearn进行特征标准化/归一化
特征标准化(z-score)
标准化的公式为:(X-mean)/std 计算时对每个属性/每列分别进行。
将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。
使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化。
from sklearn import preprocessing
X_scaled = preprocessing.scale(X)
特征归一化
除了标准化外,另一种常用的方法是将属性缩放到一个指定的最大和最小值(通常是0-1)之间,这可以通过preprocessing.MinMaxScaler类实现。
使用这种方法的目的包括:
1、对于方差非常小的属性可以增强其稳定性。
2、维持稀疏矩阵中为0的条目。
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
数据可视化
数据可视化推荐一个工具: yellowbrick
模型训练
当数据量较大时,可以考虑用fit_generator()函数,减少数据对显存的占用。
fit_generator的输入参数需要是generator,图像数据的话,可以用ImageDataGenerator:
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator()
train_generator = train_datagen.flow(x=trainX, y=trainY, batch_size=batch_size)
test_datagen = ImageDataGenerator()
test_generator = test_datagen.flow(x=testX, y=testY, batch_size=batch_size)
steps_per_epoch = int(train_generator.n / batch_size)
validation_steps = int(test_generator.n / batch_size)
model = Models.getVGG16()
model.fit_generator(
train_generator,
steps_per_epoch=steps_per_epoch,
epochs=nb_epoch,
validation_data=test_generator,
validation_steps=validation_steps,
verbose=1
)
模型超参数调优
实验结果分析
通过t-test检验比较两个模型的性能(如accuracy)是否为同分布
举个栗子,a,b两个list分别为模型A,B在n个测试数据集上的评价指标结果
from scipy.stats import ttest_ind
from scipy.stats import levene
print(levene(a, b) #用于确定a,b是否方差为同分布
print("equal_var=True",ttest_ind(a, b, equal_var=True))
print("equal_var=False",ttest_ind(a, b, equal_var=False))