已经看到第五章发现内容越来越有点难度,代码运行中因为个人电脑配置差异,及软件版本的不同会出现各种问题,再次记录一下我在学习过程中遇到的问题,争取每个工作日更新。
- 利用预训练网络进行特征提取及微调
- 卷积神经网络的可视化
2020/09/08(补)
今日的学子内容主要是5.3利用已有网络进行特征提取微调。
利用预训练好的网络进行特征提取主要有两种方法:
1.去掉预训练网络的Dense层,用到的命令为
include_top=False:
conv_base = VGG16(weights='imagenet',#指定模型初始化的权重检查点
include_top=False,# 指定模型最后是否包含密集连接分类器
input_shape=(150,150,3)
然后将样本输入到conv_base网络中输出即为特征
features_batch = conv_base.predict(inputs_batch)
之后再这个输出特征的基础上构建分类网络并用这些特征训练该网络即可。
缺点:不能使用数据增强,性能有限
2. 可以使用数据增强的特征提取,即扩展conv_base模型并训练
from keras.applications.vgg16 import VGG16
conv_base = VGG16(weights='imagenet',#指定模型初始化的权重检查点
include_top=False,# 指定模型最后是否包含密集连接分类器
input_shape=(150,150,3)
)
'''在卷积基上添加一个密集连接分类器'''
from keras import models
from keras import layers
model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))
model.summary()
'''冻结conv_base'''
conv_base.trainable = False
优点:利用数据增强增多了训练样本数,使得新增加的分类网络的性能比较优于第1种方法
缺点:网络性能提升有限,因为conv——base中的参数并未进行调整
3.网络微调
该方案是在第2种方法基础之上的改进,记住一定要先冻结conv_base,训练出分类网络后再解冻conv_中的某些层进行微调。
冻结conv_中的某些层,解冻一些层并进行训练代码如下:
conv_base.trainable = True
set_trainable = False
for layer in conv_base.layers:
if layer.name == 'block5_conv1':
set_trainable = True
if set_trainable:
layer.trainable = True
else:
layer.trainable = False
''' 微调模型'''
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-5),
metrics=['acc'])
history = model.fit(
train_generator,
steps_per_epoch=100,
epochs=100,
validation_data=validation_generator,
validation_steps=50
)
在这个过程中我发现我运行出来的结果并不像书中给出的实验结果那样好,差4% 吧
2020/09/09
开始第7章学习,因为我的研究方向主要是图像处理,因此先跳过第六章
解决办法:百度说是GPU被占用,在代码前加上如下几句话就OK了
import os import tensorflow as tf os.environ["CUDA_VISIBLE_DEVICES"] = '0' config = tf.compat.v1.ConfigProto(allow_soft_placement=True) config.gpu_options.allow_growth = True sess=tf.compat.v1.Session(config=config)
看来以后程序中要经常加这几句话了