猫狗大战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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值