tensorflow垃圾分类的构建和实现是怎样的
Admin 2022-07-18 群英技术资讯 558 次浏览
这是一个基于深度学习的垃圾分类小工程,用深度残差网络构建
cans易拉罐
在实际的模型中,我们只使用了resnet50的5个stage,后面的输出部分需要我们自己定制,网络的结构图如下:
stage5后我们的定制网络如下:
"""定制resnet后面的层""" def custom(input_size,num_classes,pretrain): # 引入初始化resnet50模型 base_model = ResNet50(weights=pretrain, include_top=False, pooling=None, input_shape=(input_size,input_size, 3), classes=num_classes) #由于有预权重,前部分冻结,后面进行迁移学习 for layer in base_model.layers: layer.trainable = False #添加后面的层 x = base_model.output x = layers.GlobalAveragePooling2D(name='avg_pool')(x) x = layers.Dropout(0.5,name='dropout1')(x) #regularizers正则化层,正则化器允许在优化过程中对层的参数或层的激活情况进行惩罚 #对损失函数进行最小化的同时,也需要让对参数添加限制,这个限制也就是正则化惩罚项,使用l2范数 x = layers.Dense(512,activation='relu',kernel_regularizer= regularizers.l2(0.0001),name='fc2')(x) x = layers.BatchNormalization(name='bn_fc_01')(x) x = layers.Dropout(0.5,name='dropout2')(x) #40个分类 x = layers.Dense(num_classes,activation='softmax')(x) model = Model(inputs=base_model.input,outputs=x) #模型编译 model.compile(optimizer="adam",loss = 'categorical_crossentropy',metrics=['accuracy']) return model
网络的训练是迁移学习过程,使用已有的初始resnet50权重(5个stage已经训练过,卷积层已经能够提取特征),我们只训练后面的全连接层部分,4个epoch后再对较后面的层进行训练微调一下,获得更高准确率,训练过程如下:
class Net(): def __init__(self,img_size,gar_num,data_dir,batch_size,pretrain): self.img_size=img_size self.gar_num=gar_num self.data_dir=data_dir self.batch_size=batch_size self.pretrain=pretrain def build_train(self): """迁移学习""" model = resnet.custom(self.img_size, self.gar_num, self.pretrain) model.summary() train_sequence, validation_sequence = genit.gendata(self.data_dir, self.batch_size, self.gar_num, self.img_size) epochs=4 model.fit_generator(train_sequence,steps_per_epoch=len(train_sequence),epochs=epochs,verbose=1,validation_data=validation_sequence, max_queue_size=10,shuffle=True) #微调,在实际工程中,激活函数也被算进层里,所以总共181层,微调是为了重新训练部分卷积层,同时训练最后的全连接层 layers=149 learning_rate=1e-4 for layer in model.layers[:layers]: layer.trainable = False for layer in model.layers[layers:]: layer.trainable = True Adam =adam(lr=learning_rate, decay=0.0005) model.compile(optimizer=Adam, loss='categorical_crossentropy', metrics=['accuracy']) model.fit_generator(train_sequence,steps_per_epoch=len(train_sequence),epochs=epochs * 2,verbose=1, callbacks=[ callbacks.ModelCheckpoint('./models/garclass.h5',monitor='val_loss', save_best_only=True, mode='min'), callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1,patience=10, mode='min'), callbacks.EarlyStopping(monitor='val_loss', patience=10),], validation_data=validation_sequence,max_queue_size=10,shuffle=True) print('finish train,look for garclass.h5')
训练结果如下:
"""
loss: 0.7949 - acc: 0.9494 - val_loss: 0.9900 - val_acc: 0.8797
训练用了9小时左右
"""
如果使用更好的显卡,可以更快完成训练
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍python实现绘制分类图,遥感影像分类图一般为特定数值对应一类地物,用Python绘制时,主要在颜色的映射和对应的图例生成。废话不多说,下面我们就来具体看看实现代码,感兴趣的朋友可以参考。
在python中求一个数的平方,可以使用内置模块math,或者使用表达式num**2,还可以使用python的内置函数pow()。
这篇文章主要为大家介绍了Python测试框架pytest高阶用法全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要介绍了python中的单下划线与双下划线以及绝对导入与相对导入说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
这篇文章主要介绍了Python中schedule模块定时任务的使用方法,文章基于上一篇文章的内容展开的后续,需要的朋友可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008