Python深さ学習読書ノート(四)(VGG 16を用いてkaggle猫犬分類を最適化)
5363 ワード
プリトレーニングネットワーク:大規模なデータセットでトレーニングし、保存したネットワーク.元のデータセットが十分に大きく,十分に汎用である場合,事前訓練ネットワーク学習特性の空間階層は汎用モデルとして有効である.
事前トレーニングネットワークを使用する2つの方法:特徴抽出:ボリュームニューラルネットワークにとって、特徴抽出は、以前にネットワークを訓練したボリューム基(プール化層とボリューム層部分)を取り出すことである.この部分で学んだ表現は、より汎用的で、再利用に適している. ボリューム層抽出表現の汎用性は層中のモデルの深さに依存し,より底部に近いのは局所的な高さ汎用の特徴図であり,上部に近いのはより抽象的な概念である.
密接続分類器を追加するには、次の2つの方法があります.
1)まずデータを実行し,出力結果をNumpy配列に変換して密接続分類器に入力する.データ拡張を使用できません.
2)抽出した畳み込みベースに直接密接続分類器を追加し,完全なネットワーク上で訓練する.コストはかかりますが、データの強化を設定できます.
2.モデル微調整:上部の数層を解凍し、解凍した数層と新しく増加したdense層を共同訓練し、彼は多重化モデルのより抽象的な表現をわずかに調整しただけだ.
ボリュームベースにおけるより下部に近い層符号化は、より汎用的な多重化可能な特徴であり、上部に近い層符号化は、より専門的な特徴である.
訓練のパラメータが多ければ多いほど、フィットしすぎるリスクが大きくなります.
予備訓練を用いたボリュームニューラルネットワーク
フィーチャー抽出
トレーニング済みベースネットワークにカスタムネットワークを追加
ベースネットワークのフリーズ
トレーニングに追加された部分
モデル微調整
解凍ベースネットワークの一部のレイヤ
解凍層と添加層の共同訓練
事前トレーニングネットワークを使用する2つの方法:
密接続分類器を追加するには、次の2つの方法があります.
1)まずデータを実行し,出力結果をNumpy配列に変換して密接続分類器に入力する.データ拡張を使用できません.
2)抽出した畳み込みベースに直接密接続分類器を追加し,完全なネットワーク上で訓練する.コストはかかりますが、データの強化を設定できます.
from keras.applications import VGG16
# VGG16
# ( , , ( ))
conv_base = VGG16(weights='imagenet',include_top=False,input_shape=(150,150,3))
#
import os
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
# ( )
base_dir='D:\\jupyter_code\\kaggle\\train1'
train_dir=os.path.join(base_dir,'train')
validation_dir=os.path.join(base_dir,'validation')
test_dir=os.path.join(base_dir,'test')
datagen=ImageDataGenerator(rescale=1./255)
batch_size=20
def extract_features(directory,sample_count):
features=np.zeros(shape=(sample_count,4,4,512))
labels=np.zeros(shape=sample_count)
generator=datagen.flow_from_directory(
directory,
target_size=(150,150),
batch_size=batch_size,
class_mode='binary'
)
i=0
for inputs_batch,labels_batch in generator:
features_batch=conv_base.predict(inputs_batch)
features[i*batch_size:(i+1)*batch_size]=features_batch
labels[i*batch_size:(i+1)*batch_size]=labels_batch
i+=1
if i*batch_size>=sample_count:
break
return features,labels
train_features,train_labels=extract_features(train_dir,2000)
validation_features,validation_labels=extract_features(validation_dir,1000)
test_features,test_labels=extract_features(test_dir,1000)
# ,
train_features=np.reshape(train_features,(2000,4*4*512))
validation_features=np.reshape(validation_features,(1000,4*4*512))
test_features=np.reshape(test_features,(1000,4*4*512))
#
from keras import models
from keras import layers
from keras import optimizers
# ,
model=models.Sequential()
model.add(layers.Dense(256,activation='relu',input_dim=4*4*512))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1,activation='sigmoid'))
#
model.compile(optimizer=optimizers.RMSprop(lr=2e-5),
loss='binary_crossentropy',
metrics=['acc'])
history=model.fit(train_features,train_labels,
epochs=30,batch_size=20,
validation_data=(validation_features,validation_labels))
# 。 conv_base
from keras import models
from keras import layers
model=models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))
# , 。
conv_base.trainable=False
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
# ImageDataGenerator
train_datagen=ImageDataGenerator(
rescale=1./255,
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'
)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator=train_datagen.flow_from_directory(
train_dir,
target_size=(150,150),
batch_size=20,
class_mode='binary'
)
validation_generator=test_datagen.flow_from_directory(
validation_dir,
target_size=(150,150),
batch_size=20,
class_mode='binary'
)
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=2e-5),
metrics=['acc'])
history=model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=30,
validation_data=validation_generator,
validation_steps=50
)
2.モデル微調整:上部の数層を解凍し、解凍した数層と新しく増加したdense層を共同訓練し、彼は多重化モデルのより抽象的な表現をわずかに調整しただけだ.
ボリュームベースにおけるより下部に近い層符号化は、より汎用的な多重化可能な特徴であり、上部に近い層符号化は、より専門的な特徴である.
訓練のパラメータが多ければ多いほど、フィットしすぎるリスクが大きくなります.
予備訓練を用いたボリュームニューラルネットワーク
フィーチャー抽出
トレーニング済みベースネットワークにカスタムネットワークを追加
ベースネットワークのフリーズ
トレーニングに追加された部分
モデル微調整
解凍ベースネットワークの一部のレイヤ
解凍層と添加層の共同訓練
#
#
# conv_base.summary()
conv_base.trainable=True
set_trainable=False
for layer in conv_base.layers:
if layer.name=='block_conv1':
set_trainable=True
if set_trainable:
layer.trainable=True
else:
layers.trainable=False
#
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-5),
metrics=['acc'])
history=model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=100,
validation_data=validation_generator,
validation_steps=50
)
#
test_generator=test_datagen.flow_from_directory(
test_dir,
target_size=(150,150),
batch_size=20,
class_mode='binary'
)
test_loss,test_acc=model.evaluate_generator(test_generator,steps=50)
print('test acc':test_acc)