研修23日目


1.勉強の内容


犬と猫の分類モデル


import keras
from datasets import cats_and_dogs
import os, shutil
#元のデータセットのディレクトリパスの解凍
original_dataset_dir = './datasets/cats_and_dogs/train'
#スモールデータセットを格納するディレクトリ
base_dir = './cats_and_dogs_small'
if os.path.exists(base_dir):
shutil.rmtree(base_dir)
os.mkdir(base_dir)
#分割のトレーニング、検証、テストに使用するディレクトリ
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)
#訓練用猫の写真カタログ
train_cats_dir = os.path.join(train_dir, 'cats')
os.mkdir(train_cats_dir)
#トレーニング用子犬の写真リスト
train_dogs_dir = os.path.join(train_dir, 'dogs')
os.mkdir(train_dogs_dir)
#検証用猫の写真リスト
validation_cats_dir = os.path.join(validation_dir, 'cats')
os.mkdir(validation_cats_dir)
#検証用の犬の写真リスト
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
os.mkdir(validation_dogs_dir)
#テスト用の猫の写真リスト
test_cats_dir = os.path.join(test_dir, 'cats')
os.mkdir(test_cats_dir)
#テスト用犬写真カタログ
test_dogs_dir = os.path.join(test_dir, 'dogs')
os.mkdir(test_dogs_dir)
最初の1000個の猫の画像をtrain cats dirにコピー
print('Copy files....')
print('---training file (cat)....')
fnames = ['cat.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
src = os.path.join(original_dataset_dir, fname)
dst = os.path.join(train_cats_dir, fname)
shutil.copyfile(src, dst)
#次の500個の猫の画像validation cats dirをコピーします.
print('---validation file(s) (cat).... ')
fnames = ['cat.{}.jpg'.format(i) for i in range(1000, 1500)]
for fname in fnames:
src = os.path.join(original_dataset_dir, fname)
dst = os.path.join(validation_cats_dir, fname)
shutil.copyfile(src, dst)
#次の500個の猫の画像test cats dirをコピーします.
print('---test file(s) (cat).... ')
fnames = ['cat.{}.jpg'.format(i) for i in range(1500, 2000)]
for fname in fnames:
src = os.path.join(original_dataset_dir, fname)
dst = os.path.join(test_cats_dir, fname)
shutil.copyfile(src, dst)
最初の1000個の犬の画像をtrain dogs dirにコピー
print('---training file (dog)....')
fnames = ['dog.{}.jpg'.format(i) for i in range(1000)]
for fname in fnames:
src = os.path.join(original_dataset_dir, fname)
dst = os.path.join(train_dogs_dir, fname)
shutil.copyfile(src, dst)
#次の500個の犬の画像をvalidation dogs dirにコピー
print('---validation file(s) (dog)....')
fnames = ['dog.{}.jpg'.format(i) for i in range(1000, 1500)]
for fname in fnames:
src = os.path.join(original_dataset_dir, fname)
dst = os.path.join(validation_dogs_dir, fname)
shutil.copyfile(src, dst)
#次の500個の犬の画像をtest dogs dirにコピー
print('---test file(s) (dog)....')
fnames = ['dog.{}.jpg'.format(i) for i in range(1500, 2000)]
for fname in fnames:
src = os.path.join(original_dataset_dir, fname)
dst = os.path.join(test_dogs_dir, fname)
shutil.copyfile(src, dst)
print(「訓練用猫イメージ総数:」,len(os.listdir(train cats dir))
print(「訓練用猫イメージ総数:」,len(os.listdir(validation cats dir))
print(「訓練用猫画像総数:」,len(os.listdir(test cats dir))
print(「訓練用子犬イメージ総数:」,len(os.listdir(train doges dir))
print(「訓練用子犬画像総数:」,len(os.listdir(validation doges dir))
print(「トレーニング用子犬画像総数:」,len(os.listdir(test doges dir))
トレーニング用猫のイメージ総数:1000
トレーニング用猫のイメージ総数:500
トレーニング用猫のイメージ総数:500
トレーニング用子犬のイメージ総数:1000
トレーニング用子犬のイメージ総数:500
トレーニング用子犬のイメージ総数:500
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation = 'relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Conv2D(64, (3,3), activation ='relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Conv2D(128, (3,3), activation = 'relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Conv2D(128, (3,3), activation = 'relu'))
model.add(layers.MaxPooling2D(2,2))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation = 'relu'))
model.add(layers.Dense(1, activation = 'sigmoid'))
from tensorflow.keras import optimizers
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
#ニューラルネットワーク設定完了
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
validation_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 = validation_datagen.flow_from_directory(
validation_dir,
target_size=(150,150),
batch_size=20,
class_mode='binary'
)
Found 2000 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.
model.fit_generator(
train_generator,
epochs=30,
steps_per_epoch=100,
validation_data=validation_generator,
validation_steps=50
)
#モジュール化学習、多くの時間を要する
#ローカル環境での切り替えを試みるため、配線は容易ではありません.
model.save('cats_and_dogs_small_1.h5')
history = model.history
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, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
datagen = ImageDataGenerator(
rotation_range=40,
width shift range=0.2,#程度
height shift range=0.2,#上下
shear_range=0.2,
zoom range=0.2,#縮小拡大
水平flip=True,#水平切り替え
fill mode="最近")#空の値を入力する方法を指定
#画像プリプロセッシングユーティリティモジュール
from keras.preprocessing import image
fnames = sorted([os.path.join(train_cats_dir, fname) for fname in os.listdir(train_cats_dir)])
#増殖する画像を選択
img_path = fnames[3]
#画像を読み込み、サイズを変更
img = image.load_img(img_path, target_size=(150, 150))
#(150、150、3)サイズに変換されたオーバーフローアレイ
x = image.img_to_array(img)
#(1、150、150、3)サイズに変換
x = x.reshape((1,) + x.shape)
#flow()メソッドは、ランダム変換画像の配置を作成します.
無限ループなので、あるポイントで停止しなければなりません!
i = 0
for batch in datagen.flow(x, batch_size=1):
plt.figure(i)
imgplot = plt.imshow(image.array_to_img(batch[0]))
i += 1
if i % 4 == 0:
break




#増殖した画像で猫と犬を分類するモジュール
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(learning_rate=1e-4),
metrics=['acc'])
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,)
#データを増加させるべきではありません.
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
    # 타깃 디렉터리
    train_dir,
    # 모든 이미지를 150 × 150 크기로 바꿉니다
    target_size=(150, 150),
    batch_size=20,
    # binary_crossentropy 손실을 사용하기 때문에 이진 레이블을 만들어야 합니다
    class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary')
history = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=100,
validation_data=validation_generator,
validation_steps=50)
model.save('cats_and_dogs_small_2.h5')
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, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

2.学習内容の難点


-データがたくさんあるモジュールを作成してデータを返すのは初めてですが、時間的にも方法的にも初めてなので難しいし、時間もかかりました.

3.解決方法


-モジュールの回転コードをより詳細に理解し、他の条件に適用する必要があります.

4.勉強の心得


-コードを作成し、データをコピーして再構成するのは不思議です.時間がかかりましたが、私のパソコンでモジュールを回転させることは不思議です.今のモジュールがどこまで発展しているのか知りたいです.