VGG16をやってみます。
オックスフォード大学のVisual Geometry Groupが作った、畳み込み13層+全結合3層の 合計16層のニューラルネットワークです。
VGG16用の入力データを作成
VGG16の入力データの画像サイズは 224 x 224 である必要がありますので generate_inputdata.pyを改造して224×224のnpyデータを生成するgenerate_inputdata_224.pyを作りましょう。
また、それだと元々150角サイズが224角サイズになるわけですから、容量が増えてしまいます。(実際に600MBから1300MBに増えました。)
そこで、このスクリプトでは正規化するのをやめて、浮動小数点が発生するのを防ぎ容量を落とします。
代わりに、VGG16をやる直前に正規化を行う方針でいきます。
スクリプト:generate_inputdata_224.py
変更した部分は
- 入力サイズ変更:image_size = 224
-
保存名を変更:np.save(‘./image_files_224.npy’, xy)
-
標準化中止 :data = data / 255.0 の行をコメントアウト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
from PIL import Image # image operation import os # get file list import glob # image treatment import numpy as np # culculation from sklearn.model_selection import train_test_split # split data # initialize parameters classes = ['car', 'motorbike'] # define 2 classses num_classes = len(classes) # the number of classes image_size = 224 # pixels of width or height # read images and cnvert numpy array X = [] # ready to make list Y = [] # ready to make list # numbering and for index, class_label in enumerate(classes): # create class_label directories (car or motorbike) photos_dir ='./' + class_label # search jpeg fileb and create files object files = glob.glob(photos_dir + '/*.jpg') for i, file in enumerate(files): # open image files as instance image = Image.open(file) # convert image into RGB value data image = image.convert('RGB') # align to the same size (just in case) image = image.resize((image_size, image_size)) # convert RGB value into numpy array data = np.asarray(image) # do not normalize # so, data object nees to be normalize other script later #data = data / 255.0 # append value to list X.append(data) Y.append(index) # convert list into numpy array X = np.array(X) Y = np.array(Y) # split data (training and test) X_train, X_test, y_train, y_test = train_test_split(X, Y) # replace 1 variable xy =(X_train, X_test, y_train, y_test) # save values as npy file np.save('./image_files_224.npy', xy) |
転移学習のモデル作成
では、データができたところでVGG16モデルを作成しましょう。
モジュール追加:from keras.applications import VGG16
ロードデータ名変更;
- X_train, X_test, y_train, y_test = np.load(‘./image_files_224.npy’, allow_pickle=True)
正規化操作の追加:
- X_train = X_train.astype(‘float’) / 255.0
- X_test = X_train.astype(‘float’) / 255.0
モデル定義の変更
- model = VGG16( weights=’imagenet’, include_top=False, input_shape=(image_size,image_size, 3) )
- print(‘Model loaded’)
- model.summary()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import numpy as np import tensorflow as tf import keras import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras.optimizers import SGD, Adam from keras.utils import np_utils from keras.applications import VGG16 # initialize parameters classes = ['car', 'motorbike'] # define 2 classses num_classes = len(classes) # the number of classes image_size = 224 # pixels of width or height # load npy file # need 'allow_pickle=True' X_train, X_test, y_train, y_test = np.load('./image_files_224.npy', allow_pickle=True) # one hot encording y_train = np_utils.to_categorical(y_train, num_classes) y_test = np_utils.to_categorical(y_test, num_classes) # normalize X_train = X_train.astype('float') / 255.0 X_test = X_train.astype('float') / 255.0 # define model model = VGG16( weights='imagenet', include_top=False, input_shape=(image_size,image_size, 3) ) print('Model loaded') model.summary() |
結果
input_1 (InputLayer) (None, 224, 224, 3)について
1枚の224 x 224 サイズの画像データにつき、 RGBの3枚に分解されたデータが入力データとし入ります。
まだ何枚のデータが入ってくるかわかりませんのでNoneになっています。
畳み込み2回 プーリング1回 畳み込み2回 プーリング1回 畳み込み3回・・・、で 16層あるのだそうですがどういう数え方をしたら16になるかは理解できていません・・・。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
Model loaded Model: "vgg16" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 ================================================================= Total params: 14,714,688 Trainable params: 14,714,688 Non-trainable params: 0 _________________________________________________________________ |
ひとまず、できていました。このあと、全結合層を後ろに追加していくことになります。それは次回!
次回
Web Application: 第7回 VGG16を使った転移学習