项目来自唐老师猫狗识别项目及数据集。
项目具体实施步骤:
1.读取猫狗数据训练集500+500。
2.对读取的图片进行处理,处理成统一大小格式,分好标签。
3.shuffle一下,将猫狗数据掺杂混合,尽可能随机。
4.采用CNN网络训练测试。
具体代码如下:
1.读取训练集。
import pandas as pd import numpy as np import os import glob import matplotlib.pyplot as plt import cv2 as cv2
images = [] labels = [] img_names = [] cls = [] train_path="training_data" classes = ['dogs','cats'] num_classes = len(classes) image_size=128 print('Going to read training images') for fields in classes: index = classes.index(fields) print('Now going to read {} files (Index: {})'.format(fields, index)) path = os.path.join(train_path, fields, '*g') files = glob.glob(path) print(len(files)) for fl in files: image = cv2.imread(fl) image = cv2.resize(image, (image_size, image_size),0,0, cv2.INTER_LINEAR) image = image.astype(np.float32) image = np.multiply(image, 1.0 / 255.0) images.append(image) label = np.zeros(len(classes)) label[index] = 1.0 labels.append(label) flbase = os.path.basename(fl) img_names.append(flbase) cls.append(fields) images = np.array(images) labels = np.array(labels) img_names = np.array(img_names) cls = np.array(cls)
2.训练数据集。
from tensorflow import keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Dropout,Flatten,Conv2D,MaxPool2D from tensorflow.keras import Input from sklearn.model_selection import train_test_split from sklearn.utils import shuffle from tensorflow.keras.regularizers import l1
#数据集处理 images,labels=shuffle(images,labels) X_train, X_test, y_train, y_test=train_test_split(images,labels)
model = Sequential() # 第一个卷积层,32个卷积核,大小5x5,卷积模式SAME,激活函数relu,输入张量的大小 model.add(Conv2D(filters= 6, kernel_size=(3,3), padding='valid',kernel_regularizer=l1(0.1),activation='tanh',input_shape=(128,128,3))) # model.add(Conv2D(filters= 32, kernel_size=(3,3), padding='valid', activation='relu')) # 池化层,池化核大小2x2 model.add(MaxPool2D(pool_size=(2,2))) # 随机丢弃四分之一的网络连接,防止过拟合 model.add(Dropout(0.5)) model.add(Conv2D(filters= 6, kernel_size=(3,3), padding='Same', activation='tanh')) # model.add(Conv2D(filters= 6, kernel_size=(3,3), padding='Same', activation='tanh')) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Dropout(0.5)) # 全连接层,展开操作, model.add(Flatten()) # 添加隐藏层神经元的数量和激活函数 # model.add(Dense(120, activation='tanh')) model.add(Dropout(0.5)) # model.add(Dense(84, activation='tanh')) # 输出层 model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(images,labels,validation_split=0.2,batch_size=128,epochs=50,c)
#模型存储 mp = "model_3_1625.h5" model.save(mp)
#模型评价 model.evaluate(X_test,y_test)
训练过程反馈如下: