下载的训练集中有2.5W张猫猫狗狗的图片,我这里只用训练集压缩包就行了,验证集和测试集都可以从中切分。
观察图片可得知命名方式,猫图片为cat.数字.jpg,狗图片为dog.数字.jpg,各有12500张。
数据需要分成三份:训练集、验证集和测试集。
我打算使用1.9W张图片作为训练集,4000张图片作为验证集,2000张图片作为测试集。
img_width=350img_height=350img_channel=3model=keras.models.Sequential([keras.layers.Conv2D(32,(3,3),activation='relu',input_shape=(img_width,img_height,img_channel)),keras.layers.MaxPool2D((2,2)),keras.layers.Conv2D(64,(3,3),activation='relu'),keras.layers.MaxPool2D((2,2)),keras.layers.Conv2D(128,(3,3),activation='relu'),keras.layers.MaxPool2D((2,2)),keras.layers.Conv2D(128,(3,3),activation='relu'),keras.layers.MaxPool2D((2,2)),keras.layers.Flatten(),keras.layers.Dropout(0.3),keras.layers.Dense(512,activation='relu',kernel_regularizer=keras.regularizers.l2()),keras.layers.Dropout(0.3),keras.layers.Dense(1,activation='sigmoid')])四层卷积+两层全连接,上了Dropout和正则化抑制过拟合。
优化器使用adam,损失函数使用二元交叉熵。
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
由于数据量过大,先读取后训练会导致内存溢出,因此使用生成器的方式去训练。
batch_size=32epochs=25train_datagen=keras.preprocessing.image.ImageDataGenerator(rescale=1./255)validation_datagen=keras.preprocessing.image.ImageDataGenerator(rescale=1./255)test_datagen=keras.preprocessing.image.ImageDataGenerator(rescale=1./255)train_generator=train_datagen.flow_from_directory(train_dir,target_size=(img_width,img_height),batch_size=batch_size,class_mode='binary')validation_generator=validation_datagen.flow_from_directory(validation_dir,target_size=(img_width,img_height),batch_size=batch_size,class_mode='binary')test_generator=test_datagen.flow_from_directory(test_dir,target_size=(img_width,img_height),batch_size=batch_size,class_mode='binary')
history=model.fit(train_generator,steps_per_epoch=train_generator.n//batch_size,epochs=epochs,validation_data=validation_generator,validation_steps=validation_generator.n//batch_size,verbose=1)
score=model.evaluate(test_generator,steps=test_generator.n//batch_size)print('测试准确率:{},测试loss值:{}'.format(score[1],score[0]))
由于海量数据导致训练的速度超慢,我跑一次程序大概要花费近两小时,可想而知调参的过程会有多恶心,调了三天把准确率怼到90%左右,不想再怼了。