1. 程式人生 > >貓狗大戰V2

貓狗大戰V2

%matplotlib inline
import numpy as np
import os
import matplotlib.pyplot as plt
fnames = np.array([f'train/{f}' for f in sorted(os.listdir('train/'))])
labels = np.array([(0 if 'cat' in fname else 1) for fname in fnames])
from keras.applications.resnet50 import ResNet50
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
ResNet50_model = ResNet50(weights='imagenet',include_top = False,input_shape=(224,224,3))
x=ResNet50_model.output
x=GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
changed_model = Model(inputs=ResNet50_model.input, outputs=Dense(1, activation='sigmoid')(x))
changed_model.summary()
changed_model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
X_train,X_valid, y_t, y_v =train_test_split(fnames,labels,test_size=0.2, random_state=1)
y_train=to_categorical(y_t)
y_valid=to_categorical(y_v)
print(X_train[0:2])
print(y_train[0:2])
y_valid[2].shape
from keras.preprocessing import image                  
from tqdm import tqdm

def path_to_tensor(img_path):
    # 用PIL載入RGB影象為PIL.Image.Image型別
    img = image.load_img(img_path, target_size=(224, 224))
    # 將PIL.Image.Image型別轉化為格式為(224, 224, 3)的3維張量
    x = image.img_to_array(img)
    # 將3維張量轉化為格式為(1, 224, 224, 3)的4維張量並返回
    return np.expand_dims(x, axis=0)

def paths_to_tensor(img_paths):
    list_of_tensors = [path_to_tensor(img_path) for img_path in tqdm(img_paths)]
    return np.vstack(list_of_tensors)
from PIL import ImageFile                            
ImageFile.LOAD_TRUNCATED_IMAGES = True                 

# Keras中的資料預處理過程
train_tensors = paths_to_tensor(X_train[0:2001]).astype('float32')/255
valid_tensors = paths_to_tensor(X_valid[0:1001]).astype('float32')/255
y_train_tensors=y_train[0:2001]
y_valid_tensors=y_valid[0:1001]
#test_tensors = paths_to_tensor(test_files).astype('float32')/255
from keras.callbacks import ModelCheckpoint

checkpointer = ModelCheckpoint(filepath='saved_models/weights.best.changed_resnet50.hdf5', 
                               verbose=1, save_best_only=True)

history = changed_model.fit(train_tensors,y_train_tensors, 
          validation_data=(valid_tensors, y_valid_tensors),
          epochs=20, batch_size=20, callbacks=[checkpointer], verbose=1)
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'valid'], loc='upper left')
plt.show()
import gc
for i in range(5):
    train_tensors = paths_to_tensor(X_train[4000*i:4000*(i+1)]).astype('float32')/255
    valid_tensors = paths_to_tensor(X_valid[1000*i:1000*(i+1)]).astype('float32')/255
    y_train_tensors=y_train[4000*i:4000*(i+1)]
    y_valid_tensors=y_valid[1000*i:1000*(i+1)]
    history = changed_model.fit(train_tensors,y_train_tensors, 
                                validation_data=(valid_tensors, y_valid_tensors),
                                epochs=20, batch_size=20, callbacks=[checkpointer], verbose=0)
    plt.plot(history.history['acc'])
    plt.plot(history.history['val_acc'])
    plt.title('model accuracy')
    plt.ylabel('accuracy')
    plt.xlabel('epoch')
    plt.legend(['train', 'valid'], loc='upper left')
    plt.show()
    del train_tensors,valid_tensors,y_train_tensors,y_valid_tensors
    gc.collect()
valid_tensors = paths_to_tensor(X_valid[0:1000]).astype('float32')/255
y_valid_tensors=y_valid[0:1000]
checkpointer = ModelCheckpoint(filepath='saved_models/weights.best.changed_resnet50v2.hdf5', 
                               verbose=1, save_best_only=True)
for i in range(5):
    train_tensors = paths_to_tensor(X_train[4000*i:4000*(i+1)]).astype('float32')/255    
    y_train_tensors=y_train[4000*i:4000*(i+1)]    
    history = changed_model.fit(train_tensors,y_train_tensors, 
                                validation_data=(valid_tensors, y_valid_tensors),
                                epochs=20, batch_size=20, callbacks=[checkpointer], verbose=0)
    plt.plot(history.history['acc'])
    plt.plot(history.history['val_acc'])
    plt.title('model accuracy')
    plt.ylabel('accuracy')
    plt.xlabel('epoch')
    plt.legend(['train', 'valid'], loc='upper left')
    plt.show()
    del train_tensors,y_train_tensors
    gc.collect()
from keras.callbacks import ModelCheckpoint
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
checkpointer = ModelCheckpoint(filepath='saved_models/weights.best.changed_resnet50v3.hdf5', 
                               verbose=1, save_best_only=True)

train_generator = train_datagen.flow_from_directory(
        'train/train',
        target_size=(224, 224),
        batch_size=32,        
        class_mode='binary')

validation_generator = train_datagen.flow_from_directory(
        'train/valid',
        target_size=(224, 224),
        batch_size=32,
        
        class_mode='binary')

history=changed_model.fit_generator(
    train_generator,
    steps_per_epoch=1000,
    epochs=20,
    verbose=2,
    callbacks=[checkpointer],
    validation_data=validation_generator,
    validation_steps=50    
    )
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'valid'], loc='upper left')
plt.show()