1. 数据准备
在文件夹下分别建立训练目录train,验证目录validation,测试目录test,每个目录下建立dogs和cats两个目录,在dogs和cats目录下分别放入拍摄的狗和猫的图片,图片的大小可以不一样。
2. 数据读取
# 存储数据集的目录 base_dir = 'E:/python learn/dog_and_cat/data/' # 训练、验证数据集的目录 train_dir = os.path.join(base_dir, 'train') validation_dir = os.path.join(base_dir, 'validation') test_dir = os.path.join(base_dir, 'test') # 猫训练图片所在目录 train_cats_dir = os.path.join(train_dir, 'cats') # 狗训练图片所在目录 train_dogs_dir = os.path.join(train_dir, 'dogs') # 猫验证图片所在目录 validation_cats_dir = os.path.join(validation_dir, 'cats') # 狗验证数据集所在目录 validation_dogs_dir = os.path.join(validation_dir, 'dogs') print('total training cat images:', len(os.listdir(train_cats_dir))) print('total training dog images:', len(os.listdir(train_dogs_dir))) print('total validation cat images:', len(os.listdir(validation_cats_dir))) print('total validation dog images:', len(os.listdir(validation_dogs_dir)))
3. 模型建立
# 搭建模型 model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3))) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(128, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Conv2D(128, (3, 3), activation='relu')) model.add(MaxPooling2D((2, 2))) model.add(Flatten()) model.add(Dense(512, activation='relu')) model.add(Dense(1, activation='sigmoid')) print(model.summary()) model.compile(loss='binary_crossentropy', optimizer=RMSprop(lr=1e-4), metrics=['acc'])
4. 模型训练
train_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( train_dir, # target directory target_size=(150, 150), # resize图片 batch_size=20, class_mode='binary' ) validation_generator = test_datagen.flow_from_directory( validation_dir, target_size=(150, 150), batch_size=20, class_mode='binary' ) for data_batch, labels_batch in train_generator: print('data batch shape:', data_batch.shape) print('labels batch shape:', labels_batch.shape) break hist = model.fit_generator( train_generator, steps_per_epoch=100, epochs=10, validation_data=validation_generator, validation_steps=50 ) model.save('cats_and_dogs_small_1.h5')
5. 模型评估
acc = hist.history['acc'] val_acc = hist.history['val_acc'] loss = hist.history['loss'] val_loss = hist.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.figure() plt.plot(epochs, loss, 'bo', label='Training loss') plt.plot(epochs, val_loss, 'b', label='Validation loss') plt.legend() plt.show()
6. 预测
imagename = 'E:/python learn/dog_and_cat/data/validation/dogs/dog.2026.jpg' test_image = image.load_img(imagename, target_size = (150, 150)) test_image = image.img_to_array(test_image) test_image = np.expand_dims(test_image, axis=0) result = model.predict(test_image) if result[0][0] == 1: prediction ='dog' else: prediction ='cat' print(prediction)
代码在spyder下运行正常,一般情况下,可以将文件分为两个部分,一部分为Train.py,包含深度学习模型建立、训练和模型的存储,另一部分Predict.py,包含模型的读取,评价和预测
补充知识:keras 猫狗大战自搭网络以及vgg16应用
导入模块
import os import numpy as np import tensorflow as tf import random import seaborn as sns import matplotlib.pyplot as plt import keras from keras.models import Sequential, Model from keras.layers import Dense, Dropout, Activation, Flatten, Input,BatchNormalization from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.optimizers import RMSprop, Adam, SGD from keras.preprocessing import image from keras.preprocessing.image import ImageDataGenerator from keras.applications.vgg16 import VGG16, preprocess_input from sklearn.model_selection import train_test_split
加载数据集
def read_and_process_image(data_dir,width=64, height=64, channels=3, preprocess=False): train_images= [data_dir + i for i in os.listdir(data_dir)] random.shuffle(train_images) def read_image(file_path, preprocess): img = image.load_img(file_path, target_size=(height, width)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) # if preprocess: # x = preprocess_input(x) return x def prep_data(images, proprocess): count = len(images) data = np.ndarray((count, height, width, channels), dtype = np.float32) for i, image_file in enumerate(images): image = read_image(image_file, preprocess) data[i] = image return data def read_labels(file_path): labels = [] for i in file_path: label = 1 if 'dog' in i else 0 labels.append(label) return labels X = prep_data(train_images, preprocess) labels = read_labels(train_images) assert X.shape[0] == len(labels) print("Train shape: {}".format(X.shape)) return X, labels
读取数据集
# 读取图片 WIDTH = 150 HEIGHT = 150 CHANNELS = 3 X, y = read_and_process_image('D:\\Python_Project\\train\\',width=WIDTH, height=HEIGHT, channels=CHANNELS)
查看数据集信息
# 统计y sns.countplot(y) # 显示图片 def show_cats_and_dogs(X, idx): plt.figure(figsize=(10,5), frameon=True) img = X[idx,:,:,::-1] img = img/255 plt.imshow(img) plt.show() for idx in range(0,3): show_cats_and_dogs(X, idx) train_X = X[0:17500,:,:,:] train_y = y[0:17500] test_X = X[17500:25000,:,:,:] test_y = y[17500:25000] train_X.shape test_X.shape
自定义神经网络层数
input_layer = Input((WIDTH, HEIGHT, CHANNELS)) # 第一层 z = input_layer z = Conv2D(64, (3,3))(z) z = BatchNormalization()(z) z = Activation('relu')(z) z = MaxPooling2D(pool_size = (2,2))(z) z = Conv2D(64, (3,3))(z) z = BatchNormalization()(z) z = Activation('relu')(z) z = MaxPooling2D(pool_size = (2,2))(z) z = Conv2D(128, (3,3))(z) z = BatchNormalization()(z) z = Activation('relu')(z) z = MaxPooling2D(pool_size = (2,2))(z) z = Conv2D(128, (3,3))(z) z = BatchNormalization()(z) z = Activation('relu')(z) z = MaxPooling2D(pool_size = (2,2))(z) z = Flatten()(z) z = Dense(64)(z) z = BatchNormalization()(z) z = Activation('relu')(z) z = Dropout(0.5)(z) z = Dense(1)(z) z = Activation('sigmoid')(z) model = Model(input_layer, z) model.compile( optimizer = keras.optimizers.RMSprop(), loss = keras.losses.binary_crossentropy, metrics = [keras.metrics.binary_accuracy] ) model.summary()
训练模型
history = model.fit(train_X,train_y, validation_data=(test_X, test_y),epochs=10,batch_size=128,verbose=True) score = model.evaluate(test_X, test_y, verbose=0) print("Large CNN Error: %.2f%%" %(100-score[1]*100))
复用vgg16模型
def vgg16_model(input_shape= (HEIGHT,WIDTH,CHANNELS)): vgg16 = VGG16(include_top=False, weights='imagenet',input_shape=input_shape) for layer in vgg16.layers: layer.trainable = False last = vgg16.output # 后面加入自己的模型 x = Flatten()(last) x = Dense(256, activation='relu')(x) x = Dropout(0.5)(x) x = Dense(256, activation='relu')(x) x = Dropout(0.5)(x) x = Dense(1, activation='sigmoid')(x) model = Model(inputs=vgg16.input, outputs=x) return model
编译模型
model_vgg16 = vgg16_model() model_vgg16.summary() model_vgg16.compile(loss='binary_crossentropy',optimizer = Adam(0.0001), metrics = ['accuracy'])
训练模型
# 训练模型 history = model_vgg16.fit(train_X,train_y, validation_data=(test_X, test_y),epochs=5,batch_size=128,verbose=True) score = model_vgg16.evaluate(test_X, test_y, verbose=0) print("Large CNN Error: %.2f%%" %(100-score[1]*100))
以上这篇keras分类之二分类实例(Cat and dog)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年11月14日
2024年11月14日
- 魔兽世界wlk敏锐贼一键输出宏是什么 wlk敏锐贼一键输出宏介绍
- 李逸朗2007-李威乐[英皇娱乐][WAV+CUE]
- DavidVersace-EyetoEye(2024)[24-44,1]
- SimoneLamsma,RobertKulek-Mendelssohn,Janacek,Schumann-SonatasforViolinandPiano【SAC
- 《街头篮球》大动作:新增五大服务器节点 优化玩家体验
- 任天堂宣布推出音乐APP!仅面向NSO订阅用户
- 《马路RPG:兄弟齐航》新预告!兄弟携手海岛冒险
- 王子鸣.2009-永远【九洲】【WAV分轨】
- 杭天琪.2002-水与火的缠绵【泰达】【WAV+CUE】
- 邱锋泽.2024-COlOR.Free【发现梦想】【FLAC分轨】
- 群星 《10年朋友Vol.8》滚石台湾版[WAV+CUE][1.G]
- 群星《2024好听新歌31》十倍音质 U盘音乐 [WAV分轨][1.1G]
- 群星《全天后》华纳[WAV+CUE][1.1G]
- 许乐《声愿HQCD》[正版原抓WAV+CUE]
- 黄凯芹《给你留念》头版限量编号MQA-UHQCD2024[低速原抓WAV+CUE]