keras-迁移学习-resnet101-踩过的坑

使用迁移学习时采过的坑

接下来,将依次讲述才过的坑及解决办法

先附上完整代码

import os
from keras.preprocessing import image
import random
import time
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np
from keras.models import Model
from keras.layers import Input, Dense, Dropout, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D, concatenate, Activation, ZeroPadding2D
from keras.layers import add, Flatten
from keras.layers import Dense,Flatten,GlobalAveragePooling2D,BatchNormalization,GlobalMaxPooling2D
from keras.utils import plot_model
from keras.metrics import top_k_categorical_accuracy
from keras.preprocessing.image import ImageDataGenerator
from keras import backend as K 
from keras.regularizers import l2
from keras_applications import resnet
import os
import keras
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping
NB_CLASS=17
IM_WIDTH=224
IM_HEIGHT=224
train_root='/home/train/'
vaildation_root='/home/test/'
test_root='/home/test/'
batch_size=16
EPOCH=40

# train data
train_datagen = ImageDataGenerator(
    rotation_range=40,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True,
    rescale=1./255
)
train_generator = train_datagen.flow_from_directory(
    train_root,
    target_size=(IM_WIDTH, IM_HEIGHT),
    batch_size=batch_size,
    shuffle=True
)

# vaild data
vaild_datagen = ImageDataGenerator(
    #rotation_range=40,
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True,
    rescale=1./255
)
vaild_generator = train_datagen.flow_from_directory(
    vaildation_root,
    target_size=(IM_WIDTH, IM_HEIGHT),
    batch_size=batch_size,
)

# test data
test_datagen = ImageDataGenerator(
    rescale=1./255
)
test_generator = train_datagen.flow_from_directory(
    test_root,
    target_size=(IM_WIDTH, IM_HEIGHT),
    batch_size=batch_size,
)

def acc_top2(y_true, y_pred):
    return top_k_categorical_accuracy(y_true, y_pred, k=2)

def get_filename_for_saving(save_dir):
    return os.path.join(save_dir,
            "{val_loss:.3f}-{epoch:03d}-{acc:.3f}.hdf5")

def make_save_dir(dirname, experiment_name):
    start_time = str(int(time.time())) + '-' + str(random.randrange(1000))
    save_dir = os.path.join(dirname, experiment_name, start_time)
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    return save_dir

def check_print():
    base_model = resnet.ResNet101(include_top=False,weights='imagenet',input_shape=(224, 224, 3),classes=17,backend=keras.backend,
                                   layers=keras.layers,models=keras.models,utils=keras.utils)
    base_model.trainable=False
    x = base_model.output
    x = GlobalMaxPooling2D()(x)
    x = Dense(2048,activation='relu',kernel_regularizer=l2(0.0003))(x)
    predictions = Dense(NB_CLASS, activation='softmax')(x)
    model = Model(inputs=base_model.input, outputs=predictions)
    model.summary()
    model.compile(optimizer=Adam(lr=0.00005, beta_1=0.9,beta_2=0.99,epsilon=1e-08,decay=1e-6),
                      loss='categorical_crossentropy',
                      metrics=['accuracy'])
    return model
    
if __name__ == '__main__':
    
    model=check_print()
    save_dir = make_save_dir('/home/model/', 'resnet101')
    checkpointer = keras.callbacks.ModelCheckpoint(
        filepath=get_filename_for_saving(save_dir),
        save_best_only=False)
    early_stopping = EarlyStopping(monitor='acc', patience=5, verbose=2)
    	  model.fit_generator(train_generator,validation_data=vaild_generator,epochs=EPOCH,steps_per_epoch=train_generator.n/batch_size,validation_steps=vaild_generator.n/batch_size,callbacks=[checkpointer,early_stopping])
    model.save('/home/resnet_101_.h5')
    loss,acc,top_acc=model.evaluate_generator(test_generator, steps=test_generator.n/batch_size)
    print ('Test result:loss:%f,acc:%f,top_acc:%f' % (loss, acc, top_acc))

*接下来对踩过的坑进行描述:

问题1:用代码下载模型权重出错?
解决:直接网站下载,或百度网盘点击这里,密码 0805,下载完成后放到指定文件夹即可。
问题2:如何修改模型训练自己的数据集?
解决:只需将最后一层改为自己数据集的类别数即可。

 predictions = Dense(NB_CLASS, activation='softmax')(x)

问题三:训练集和验证集的精度差距很大?
解决:参数没有冻结

    base_model = resnet.ResNet101(include_top=False,weights='imagenet',input_shape=(224, 224, 3),classes=17,backend=keras.backend,
                                   layers=keras.layers,models=keras.models,utils=keras.utils)
    **base_model.trainable=False**//冻结参数
    x = base_model.output
    x = GlobalMaxPooling2D()(x)
    x = Dense(2048,activation='relu',kernel_regularizer=l2(0.0003))(x)
    predictions = Dense(NB_CLASS, activation='softmax')(x)
    model = Model(inputs=base_model.input, outputs=predictions)
    model.summary()
    model.compile(optimizer=Adam(lr=0.00005, beta_1=0.9,beta_2=0.99,epsilon=1e-08,decay=1e-6),
                      loss='categorical_crossentropy',
                      metrics=['accuracy'])
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值