Deep learning 初始V3微调

Deep learning 初始V3微调,deep-learning,keras,Deep Learning,Keras,我不是来自cs背景,我正在尝试创建一个分类器,在其中我输入包含疾病的图像和没有疾病的图像。为此,我尝试使用inception v3进行微调。不幸的是,所有的微调示例都是针对vgg-16完成的,他们只是说《盗梦空间》v3在几乎所有教程中都进行了类似的培训。我将keras与tensorflow后端一起使用。每个人都告诉我截断inception的最后一个softmax层,添加两个层并进行微调。我不知道如何在inception中添加层。我还要将我的数据存储在两个文件夹中。这也让我头疼,因为一些教程加载c

我不是来自cs背景,我正在尝试创建一个分类器,在其中我输入包含疾病的图像和没有疾病的图像。为此,我尝试使用inception v3进行微调。不幸的是,所有的微调示例都是针对vgg-16完成的,他们只是说《盗梦空间》v3在几乎所有教程中都进行了类似的培训。我将keras与tensorflow后端一起使用。每个人都告诉我截断inception的最后一个softmax层,添加两个层并进行微调。我不知道如何在inception中添加层。我还要将我的数据存储在两个文件夹中。这也让我头疼,因为一些教程加载cifar数据库,而其他教程使用目录,我对此也感到不舒服。有人能给我一些建议吗

train.py

导入操作系统
导入系统
导入glob
导入argparse
导入matplotlib
matplotlib.use('agg')
将matplotlib.pyplot作为plt导入
从keras导入后端为K
来自keras导入版本__
从keras.applications.inception\u v3导入InceptionV3,预处理\u输入
从keras.models导入模型
从keras.layers导入稠密、平均池2D、全局平均池2D、输入、展平、退出
从keras.preprocessing.image导入ImageDataGenerator
从keras.optimizers导入新加坡元
IM_宽度,IM_高度=299,299#用于接收的固定大小v3
NB_时代=3
蝙蝠大小=32
FC_大小=1024
#NB_IV3_层_至_冻结=172
def get_nb_文件(目录):
“”“通过递归搜索目录获取文件数”“”
如果不存在os.path.exists(目录):
返回0
cnt=0
对于r、dir和os.walk(目录)中的文件:
对于目录中的dr:
cnt+=len(glob.glob(os.path.join(r,dr+“/*”))
返回cnt
def设置到传输学习(型号、基本型号):
“”“冻结所有层并编译模型”“”
对于基本模型层中的层:
layer.trainable=错误
model.compile(优化器='rmsprop',
损失class='classifical_crossentropy',
指标=[‘准确度’])
def添加新的最后一层(基本模型、nb类):
“”“将最后一层添加到convnet
Args:
基本型:不包括顶部的keras型
nb#U类:#类
返回:
具有最后一层的新keras模型
"""
x=基本模型输出
x=AveragePoolg2D((8,8),border_mode='valid',name='avg_pool')(x)
x=辍学率(0.5)(x)
x=展平()(x)
预测=密集(2,激活='softmax')(x)
模型=模型(输入=基本模型。输入,输出=预测)
回归模型
"""
def设置至微调(型号):
冻结底部NB_IV3_层,并重新训练其余顶部层。
注:NB_IV3_层对应于inceptionv3拱门中的前2个起始块
Args:
模型:keras模型
对于模型中的层。层[:NB_IV3_layers_TO_FREEZE]:
layer.trainable=错误
对于模型中的层。层[NB_IV3_层到_冻结:]:
layer.trainable=True
compile(优化器=SGD(lr=0.0001,动量=0.9),loss='classifical\u crossentropy',metrics=['accurity'])
"""
def序列(args):
“”“使用迁移学习和微调在新数据集上训练网络”“”
培训img=‘培训集/’
验证\u img='test\u set/'
nb_epoch=int(参数nb_epoch)
nb\u train\u samples=获取nb\u文件(train\u img)
nb_classes=len(glob.glob(train_img+“/*”))
#数据准备
列车\数据发生器=图像数据发生器(
旋转范围=40,
宽度\偏移\范围=0.2,
高度\位移\范围=0.2,
重新缩放=1./255,
剪切范围=0.2,
缩放范围=0.2,
水平翻转=真,
填充模式(最近的)
验证\u datagen=ImageDataGenerator(
旋转范围=40,
宽度\偏移\范围=0.2,
高度\位移\范围=0.2,
重新缩放=1./255,
剪切范围=0.2,
缩放范围=0.2,
水平翻转=真,
填充模式(最近的)
train_generator=来自目录的train_datagen.flow_(
火车站,
目标_大小=(299299),
批次大小=32,
class_mode='classifical')
验证\u生成器=验证\u datagen.flow\u来自\u目录(
验证(img),,
目标_大小=(299299),
批次大小=32,
class_mode='classifical')
如果(K.image\u dim\u ordering()=“th”):
输入\张量=输入(形状=(3299299))
其他:
输入\张量=输入(形状=(299299,3))
#设置模型
基本\模型=接收v3(输入\张量=输入\张量,权重='imagenet',包括\顶部=假,输入\形状=(IM \高度,IM \宽度,3))\包括\顶部=假排除最终FC层
模型=添加新的最后一层(基本模型,nb类)
#迁移学习
设置到转移学习(模型、基本模型)
历史\u tl=模型安装\u发电机(列车发电机,
每个历元的样本数=320,
nb_epoch=nb_epoch,
验证数据=验证生成器,
nb_val_样本=64)
model.save(args.output\u model\u文件)
如果args.plot:
绘图培训(历史)
def plot_培训(历史记录):
acc=历史。历史['acc']
val_acc=历史。历史['val_acc']
损失=历史。历史['loss']
val_loss=历史。历史['val_loss']
历元=范围(len(acc))
plt.绘图(时代,附件,右)
plt.绘图(时代,val_acc,'r')
产品名称(“培训和验证准确性”)
plt.savefig('accurity.png'))
plt.图()
plt.绘图(年代、损失、r.)
plt.绘图(时代、价值损失、“r-”)
产品名称(“培训和验证损失”)
plt.savefig('loss.png'))
如果名称=“\uuuuu main\uuuuuuuu”:
a=argparse.ArgumentParser()
a、 添加参数(“--nb\u epoch”,默认值=nb\u epoch)
a、 添加参数(“--batch\u size”,默认值=BAT\u size)
a、 添加参数(“--plot”,action=“store\u true”)
a、 添加参数(“--output\u model\u file”,default=“inceptionv3-ft.model”)
args=a.parse_args()
训练(
train/
  |-label_a/
  |-label_b/
  ...
  |-label_z/
valid/
  |-label_a/
  |-label_b/
  ...
  |-label_z/