1 概念
下面是卷积神经网络的作用一般概述:
第一层级将检测图片中的边缘
第二层级将检测形状
第三个卷积层将检测更高级的特征
每个迁移学习情形将以不同的方式使用预先训练过的神经网络。
如果新数据集很小,并且与原始训练数据相似:
删除神经网络的最后层级
添加一个新的完全连接层,与新数据集中的类别数量相匹配
随机化设置新的完全连接层的权重;冻结预先训练过的网络中的所有权重
训练该网络以更新新连接层的权重
为了避免小数据集出现过拟合现象,原始网络的权重将保持不变,而不是重新训练这些权重。
因为数据集比较相似,每个数据集的图片将具有相似的更高级别特征。因此,大部分或所有预先训练过的神经网络层级已经包含关于新数据集的相关信息,应该保持不变。
以下是如何可视化此方法的方式:
如果新数据集很小,并且与原始训练数据不同:
将靠近网络开头的大部分预先训练过的层级删掉
向剩下的预先训练过的层级添加新的完全连接层,并与新数据集的类别数量相匹配
随机化设置新的完全连接层的权重;冻结预先训练过的网络中的所有权重
训练该网络以更新新连接层的权重
因为数据集很小,因此依然需要注意过拟合问题。要解决过拟合问题,原始神经网络的权重应该保持不变,就像第一种情况那样。
但是原始训练集和新的数据集并不具有相同的更高级特征。在这种情况下,新的网络仅使用包含更低级特征的层级。
以下是如何可视化此方法的方式:
如果新数据集比较大型,并且与原始训练数据相似:
删掉最后的完全连接层,并替换成与新数据集中的类别数量相匹配的层级
随机地初始化新的完全连接层的权重
使用预先训练过的权重初始化剩下的权重
重新训练整个神经网络
训练大型数据集时,过拟合问题不严重;因此,你可以重新训练所有权重。
因为原始训练集和新的数据集具有相同的更高级特征,因此使用整个神经网络。
以下是如何可视化此方法的方式:
如果新数据集很大型,并且与原始训练数据不同:
删掉最后的完全连接层,并替换成与新数据集中的类别数量相匹配的层级
使用随机初始化的权重重新训练网络
或者,你可以采用和“大型相似数据”情形的同一策略
虽然数据集与训练数据不同,但是利用预先训练过的网络中的权重进行初始化可能使训练速度更快。因此这种情形与大型相似数据集这一情形完全相同。
如果使用预先训练过的网络作为起点不能生成成功的模型,另一种选择是随机地初始化卷积神经网络权重,并从头训练网络。
以下是如何可视化此方法的方式:
2 常用函数
sklearn.preprocessing.LabelBinarize 标签二值化
sklearn.model_selection.StratifiedShuffleSplit
Cross-validation: evaluating estimator performance
keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
bottleneck_features = np.load('bottleneck_features/DogVGG19Data.npz')
train_VGG19 = bottleneck_features['train']
valid_VGG19 = bottleneck_features['valid']
test_VGG19 = bottleneck_features['test']
架构
VGG19_model=Sequential()
VGG19_model.add(GlobalAveragePooling2D(input_shape=train_VGG19.shape[1:]))
VGG19_model.add(Dense(133,activation='softmax'))
VGG19_model.summary()
编译
VGG19_model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
训练
checkpointer=ModelCheckpoint(filepath='saved_models/weights.best.VGG19.hdf5',verbose=1,save_best_only=True)
VGG19_model.fit(train_VGG19,train_targets,validation_data=(valid_VGG19,valid_targets),epochs=20,batch_size=20,callbacks=[checkpointer],verbose=1)
加载
VGG19_model.load_weights('saved_models/weights.best.VGG19.hdf5')
测试
VGG19_predictions=[np.argmax(VGG19_model.predict(np.expand_dims(feature,axis=0))) for feature in test_VGG19]
test_accuracy=100*np.sum(np.array(VGG19_predictions)==np.argmax(test_targets,axis=1))/len(VGG19_predictions)print('Test accuracy: %.4f%%'%test_accuracy)
预测
from extract_bottleneck_features import*
def VGG19_predict_breed(img_path):
bottleneck_feature=extract_VGG19(path_to_tensor(img_path))
predicted_vector=VGG19_model.predict(bottleneck_feature)
return dog_names[np.argmax(predicted_vector)]