基于inception_v3的迁移学习

迁移学习

当我们自己的训练数据不够时,我们可以借助别人已经训练好的模型,在别人模型的基础上进行二次训练。预训练好的模型一般是基于大量数据训练出来的,已经提取了一些特征。我们无需训练那些层,只需利用即可。然后加上我们自己的层以及输出层训练。做了一个小测试,基于inception模型,搭建自己的图片识别
自己的训练图片只有300张左右。

下载inception权重数据

!wget --no-check-certificate \
    https://storage.googleapis.com/mledu-datasets/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5 \
    -O inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5
import os
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import Model
from tensorflow.keras.applications.inception_v3 import InceptionV3

加载InceptionV3模型

local_weights_file = "model/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5"
pre_trained_model=InceptionV3(input_shape =(200,200,3),
                             include_top=False,
                             weights=None)

#加载权重
pre_trained_model.load_weights(local_weights_file)

# 因为是使用预训练好的模型,无需训练,所以将每一层设置为不可训练
for layer in pre_trained_model.layers:
    layer.trainable=False

#pre_trained_model.summary()
#获取某一层的输出当做我们的输入,即我们从选定的一层开始,之前的层次都无需训练
last_layer = pre_trained_model.get_layer("mixed7")
last_output = last_layer.output
print(f"last output shape is {last_output.shape}")

Callback

class myCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self,epoch,logs={}):
        if(logs.get("acc") > 0.99):
            print("\n Reached 99% accuracy,so cancelling training")
            self.model.stop_training=True

加入我们自己的层,构建模型

from tensorflow.keras.optimizers import Adam
#将Inception模型选择的输出层变成1维数据
x = layers.Flatten()(last_output)
#加全连接层
x = layers.Dense(1024,activation="relu")(x)
x = layers.Dropout(0.2)(x)
#输出层
x = layers.Dense(1,activation="sigmoid")(x)

model = Model(pre_trained_model.input,x)

model.compile(optimizer=Adam(lr=0.0001),
            loss = "binary_crossentropy",
             metrics=['acc'])
#model.summary()

加载数据,训练

train_dir = "images/trainning/"
validation_dir = "images/validation/"
train_dogs_dir = os.path.join(train_dir,"dogs")
train_humans_dir = os.path.join(train_dir,"humans")

validation_dogs_dir = os.path.join(validation_dir,"dogs")
validation_humans_dir = os.path.join(validation_dir,"humans")

print(f"size of training dogs:{len(os.listdir(train_dogs_dir))}")
print(f"size of training humans:{len(os.listdir(train_humans_dir))}")
print(f"size of validation dogs:{len(os.listdir(validation_dogs_dir))}")
print(f"size of validation humans:{len(os.listdir(validation_humans_dir))}")
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255.,
                                  rotation_range=40,
                                  shear_range=0.2,
                                  zoom_range=0.3,
                                  horizontal_flip=True)

validation_datagen = ImageDataGenerator(rescale=1./255.)

train_generator = train_datagen.flow_from_directory(train_dir,
                                                   batch_size=20,
                                                   target_size=(200,200),
                                                   class_mode="binary")

validation_generator = validation_datagen.flow_from_directory(validation_dir,
                                                   batch_size=20,
                                                   target_size=(200,200),
                                                   class_mode="binary")
history = model.fit_generator(train_generator,
                   steps_per_epoch=10,
                   epochs=10,
                   validation_data=validation_generator,
                    validation_steps=2,
                    verbose=2,
                    callbacks=[myCallback()]
               )
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history["val_acc"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
epochs = range(len(acc))
plt.plot(epochs,acc,"r",label="Training accuracy")
plt.plot(epochs,val_acc,"b",label="validation_accuracy")
#plt.legend(loc=0)
plt.show()

预测

使用predict_generator进行预测。需要注意的是,预测的图片文件和训练时一样,放在文件夹下。
test_dir指向文件夹,文件夹下有子文件夹,然后再是图片。

使用filenames可以获取所有预测的图片。如果这样,则在predict_generator时需要设置几个参数,
才能使预测的结果和图片对应
1.shuffle:设置为False
2.batch_size:设置大小与测试图片大小一致
3.class_mode:None

test_datagen = ImageDataGenerator(rescale=1/255.)
test_dir = "images/test/"
test_size = len(os.listdir("images/test/all"))
test_generator = test_datagen.flow_from_directory(test_dir,
                                                 batch_size=test_size,
                                                 target_size=(200,200),
                                                 shuffle=False,
                                                 class_mode=None)
pred_y = model.predict_generator(test_generator,steps=1,verbose=1)

import numpy as np
logits = np.where(pred_y > 0.5,1,0)
pred_y = np.squeeze(pred_y)
import matplotlib.image as mpimg
columns = 5
test_size = len(test_generator.filenames)
test_dir = os.path.join('images/test/')
rows = int(test_size/5)
if test_size%5 != 0:
    rows = rows+1
f,ax = plt.subplots(rows,columns,figsize=(10,10))
for i in range(0,test_size):
    # predicting image
    filename = test_generator.filenames[i]
    path = test_dir + filename
    if(pred_y[i] == 1):
        label="human"
    else:
        label = "dog"
        
    ax_idx_row = int(i/columns)
    ax_idx_col = int(i%columns)
    img_data = mpimg.imread(path)
    ax[ax_idx_row][ax_idx_col].imshow(img_data)
    ax[ax_idx_row][ax_idx_col].set_title(label,color="red")
    ax[ax_idx_row][ax_idx_col].axis("off")
plt.show()

总结:
1.下载权重数据
2.加载预训练模型
3.选择输出层次
4.在3的基础上加载自己的layer。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容