從零基礎入門Tensorflow2.0 ----六、31 kaggle 10 monkeys模型微調

every blog every motto:

0. 前言

10 monkeys 模型微調

1. 代碼部分

1. 導入模塊

%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
import os,sys
import tensorflow as tf
import time
from tensorflow import keras

print(tf.__version__)
print(sys.version_info)
for module in mpl,pd,sklearn,tf,keras:
    print(module.__name__,module.__version__)

2. 文件讀取

# 文件路徑
train_dir = '../input/10-monkey-species/training/training'
valid_dir = "../input/10-monkey-species/validation/validation"
label_file = '../input/10-monkey-species/monkey_labels.txt'
print(os.path.exists(train_dir))
print(os.path.exists(valid_dir))
print(os.path.exists(label_file))
print(os.listdir(train_dir))
print(os.listdir(valid_dir))
# 讀取數據
labels = pd.read_csv(label_file,header=0)
print(labels)
# 讀取圖片
height = 224
width = 224
channels = 3
batch_size = 24
num_classes = 10

train_datagen = keras.preprocessing.image.ImageDataGenerator(
    preprocessing_function=keras.applications.resnet50.preprocess_input, # 歸一化
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range = 0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip = True,
    fill_mode = 'nearest',
)
train_generator = train_datagen.flow_from_directory(train_dir,target_size=(height,width),batch_size=batch_size,seed=7,shuffle=True,class_mode="categorical")

valid_datagen = keras.preprocessing.image.ImageDataGenerator(    preprocessing_function=keras.applications.resnet50.preprocess_input)
valid_generator = valid_datagen.flow_from_directory(valid_dir,target_size=(height,width),batch_size=batch_size,seed=7,shuffle=False,class_mode="categorical")

train_num = train_generator.samples
valid_num = valid_generator.samples
print(train_num,valid_num)
# 讀取數據
for i in range(2):
    x,y = train_generator.next()
    print(x.shape,y.shape)
    print(y)

3. 構建模型

resnet50_fine_tune = keras.models.Sequential()
resnet50_fine_tune.add(keras.applications.ResNet50(include_top=False,pooling='avg',weights='imagenet'))
resnet50_fine_tune.add(keras.layers.Dense(num_classes,activation='softmax'))
resnet50_fine_tune.layers[0].trainable=False


resnet50_fine_tune.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
resnet50_fine_tune.summary()

4. 訓練

epochs = 10
history = resnet50_fine_tune.fit_generator(train_generator,steps_per_epoch = train_num // batch_size,epochs=epochs,
                            validation_data = valid_generator,validation_steps=valid_num // batch_size)
print(history.history.keys())

5. 學習曲線

# 學習曲線
def plot_learning_curves(hsitory,label,epochs,min_value,max_value):
    data = {}
    data[label] = history.history[label]
    data['val_' + label] = hsitory.history['val_' + label]
    pd.DataFrame(data).plot(figsize=(8,5))
    plt.grid(True)
    plt.axis([0,epochs,min_value,max_value])
    plt.show()

plot_learning_curves(history,'accuracy',epochs,0,1)
plot_learning_curves(history,'loss',epochs,0,2)

6. 另一種方法

訓練後幾層

# 另一種方法
resnet50 = keras.applications.ResNet50(include_top=False,pooling='avg',weights='imagenet')
resnet50.summary()

6.2 模型搭建

for layer in resnet50[0:-5]:
    layers.trainable = False

resnet50_new = keras.models.Sequential([
    resnet50,
    keras.layers.Dense(num_classes,activation='softmax'),
])
resnet50_new.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
resnet50_new.summary()

6.3 訓練

epochs = 10
history = resnet50_new.fit_generator(train_generator,steps_per_epoch = train_num // batch_size,epochs=epochs,
                            validation_data = valid_generator,validation_steps=valid_num // batch_size)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章