1.数据集介绍:(需要数据集可以在下面留言)
数据集一共有猫图片:6000张,有狗图片:6000张。图片已经被命名为:0.1.jpg-0.6000.jpg(猫);1.0.jpg-1.6000.jpg(狗)
照片读取代码如下:
import numpy as np
import tensorflow as tf
#定义图片读取函数:把图片读取为64*64*3
def load_and_preprocess_from_path_label(path):
image = tf.io.read_file(path)
image = tf.image.decode_jpeg(image)
image = tf.image.resize(image, [64, 64])
image /= 255.0
return image
#循环读取猫类图片(从img文件夹读取)并生成[6000,150,150,3]数组
x1=[]
for i in range(1,6001):
img_path ='./img' + '\\0.%s.jpeg'%(i)
img=load_and_preprocess_from_path_label(img_path)
x1.append(img)
x1=np.array(x1)
#循环读取狗类图片并生成[6000,150,150,3]数组
x2=[]
for i in range(1,6001):
img_path ='./img' + '\\1.%s.jpeg'%(i)
img=load_and_preprocess_from_path_label(img_path)
x2.append(img)
x2=np.array(x2)
x_total=np.append(x1,x2,axis=0)
2.标签生成程序如下:
#生成标签代码,并转化为独热码形式
from keras.utils import np_utils
counter=0
data_y_list=[]
for i in range(2):
label = np.ones((6000,)) * counter
data_y = tf.expand_dims(label, axis=-1)
data_y_list.append(data_y)
counter+=1
data_y_array = np.concatenate(data_y_list, axis=0)
y_total=np_utils.to_categorical(data_y_array,2)
3.同时打乱图片数据集和标签数据集
#打乱数据集
np.random.seed(116)
np.random.shuffle(x_total)
np.random.seed(116)
np.random.shuffle(y_total)
np.random.seed(116)
tf.random.set_seed(116)
#分割训练样本集和测试样本集
x_train=x_total[0:5000,]
y_train=y_total[0:5000,]
x_test=x_total[5000:6000,]
y_test=y_total[5000:6000,]
4.搭建卷积神经网络(models.Sequential()结构)
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(64,64, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(2, activation='sigmoid'))
5.定义优化器,学习率,损失函数(model.compile()结构)
from keras import optimizers
model.compile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
6.定义epoch大小,batch大小
history=model.fit(x_train,y_train,epochs=100,batch_size=64,validation_data=(x_test,y_test)
,validation_freq=1)
7.如果要调用轻量级网络MobileNetV2、MobileNet、SqueezeNet、Xception等已经被嵌入到keras.applications文件里面的,代码如下
model = models.Sequential()
mobile = tf.keras.applications.MobileNet(include_top=False, weights='imagenet', input_shape=(150, 150, 3))
#Xception= tf.keras.applications.Xception(include_top=False, weights='imagenet', #input_shape=(150, 150, 3))
mobile.trainable = False
model = tf.keras.Sequential([
mobile,
tf.keras.layers.Dropout(0.5),
tf.keras.layers.GlobalAveragePooling2D(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(2, activation='sigmoid')
])