python深度学习微调模型与冻结部分层

python深度学习微调模型与冻结部分层
特征微调有助于提⾼深度学习的精度,⽽将卷积基(就是预先训练好的卷积模型)的前⾯⼤部分层冻结,只微调(此时的学习率也应该相应的调低)顶部更抽象的层---可以理解为更细节的特征
这样可以在⼀定程度上提⾼模型的识别精度,我的实验结果⽐原有的精度提⾼了4个点左右,从90%提⾼到94%
下⾯是全部的代码,很简单.
不过有个疑问:训练出来的验证精度达不到书上说的97%,有解决的同学请留⾔告知⼀下,不慎感激
配对比较法#即可单独安装keras,也可以⽤tensorflow⾃带的keras
try:
from keras.applications import VGG16
from keras.preprocessing.image import ImageDataGenerator
from keras import models
from keras import layers
from keras import optimizers
except ModuleNotFoundError:
import tensorflow as tf
VGG16 = tf.keras.applications.VGG16
ImageDataGenerator = tf.keras.preprocessing.image.ImageDataGenerator
models = dels
layers = tf.keras.layers
optimizers = tf.keras.optimizers
import os,sys
sys.path.append( os.pardir )  #为了到上级⽬录common,import⾥⾯的⼯具土工合成材料
from common.file_arrange import get_dirs  #⾃定义的⼩⼯具
import numpy as np
import matplotlib.pyplot as plt
def get_convBase( input_shape=None ):
'''
input_shape: tuple ,example:( 150,150,3 )
从⽹络上下载已训练的模型
'''
return VGG16(
weights='imagenet',
include_top=False,
input_shape=input_shape
)
def get_generators( directorys,target_size,batch_size ):
'''
directory: tuple ("train_path","validation_path") 分别是两个⽬录,⼀个训练样本⽬录,⼀个测试样本⽬录
target_size: "tuple" 缩放⼤⼩ example:( 150,150 )  所有图像缩放成150*150像素
batch_size: "int"  每次在样本中抽取的批次⼤⼩
'''中国农业生态学报
#初始化⼀个训练generator对象(⼯⼚) 使⽤数据增强
train_datagen = ImageDataGenerator(
rescale=1./255,
zoom_range=0.2,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
horizontal_flip=True,
fill_mode='nearest'联通宝视通
)
#初始化⼀个测试generator实例,因为是验证推理的成功率,所以不使⽤数据增强
val_datagen = ImageDataGenerator( rescale=1./255 )
#得到⼀个⽤于训练的ImageDataGenerator实例
train_generator = train_datagen.flow_from_directory(
target_size=target_size,
batch_size=batch_size,
interpolation='nearest',
class_mode='binary'
)
#得到⼀个⽤于验证的ImageDataGenerator实例
val_generator = val_datagen.flow_from_directory(
directorys[1],
亚当 斯密target_size=target_size,
batch_size=batch_size,
interpolation='nearest',
class_mode='binary'
)
return train_generator,val_generator
def run_network():
train_gener, test_gener = get_generators( ( get_dirs()['train'], get_dirs()['test'] ), (150,150), 20 )
#⽣成⼀个欲训练模型
conv_base = get_convBase( ( 150,150,3 ) )
#冻结卷积层的可训练权重
ainable =False
model = models.Sequential()
#将预训练的模型添加到新建模型⾥
model.add( conv_base )
model.add( layers.Flatten() )
model.add( layers.Dense( 256,activation='relu' ) )#注意,这⾥不是第⼀层⽹络,所以不需要input_shape参数    #model.add( layers.Dropout(0.5) )
model.add( layers.Dense( 1,activation='sigmoid' ) )
#配置训练模型
modelpile(
optimizer=optimizers.RMSprop(lr = 2e-5),
metrics=['acc'],
loss='binary_crossentropy',
)
#将训练图⽚⽣成器.测试图⽚⽣成器送⼊fit_generator,并以设定的次数训练模型
history=model.fit_generator(
train_gener,
steps_per_epoch=100,
epochs=30,
validation_data=test_gener,
validation_steps=50
)
#微调模型
ainable=True
set_trainable = False
for layer in conv_base.layers:
if layer.name == 'block5_conv1':  #block5_conv1后⾯的层都设为可训练
set_trainable = True
if set_trainable:
体育的力量
else:
modelpile(
optimizer=optimizers.RMSprop(lr=1e-5), #以⼀个较⼩的学习率微调
loss='binary_crossentropy',
metrics=['acc']
)
history = model.fit_generator(
steps_per_epoch=100,
epochs=77,
validation_data=test_gener,
validation_steps=50
)
epochs = range( 1, len( history.history['acc'] ) + 1 )
plt.plot(epochs, history.history['acc'],'bo',label = 'train_acc' )
plt.plot( epochs,history.history['val_acc'], 'b',label = 'validation_Acc' )    plt.title( 'Training and validation Accuracy' )
plt.legend()
plt.figure()
plt.plot( epochs,history.history['loss'],'bo',label='Train_loss' )
plt.plot( epochs,history.history['val_loss'],'b',label='Validation_loss' )    plt.legend()
plt.show()
if __name__ == '__main__':
run_network()
#model = get_convBase( (150,150,3) )
#model.summary()

本文发布于:2024-09-23 14:34:42,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/453316.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   训练   精度   微调   学习   验证   比较法   卷积
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议