貓狗大戰V2
阿新 • • 發佈:2018-12-20
%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()