猫狗分类实验总结.docx
- 文档编号:5899672
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:14
- 大小:119.98KB
猫狗分类实验总结.docx
《猫狗分类实验总结.docx》由会员分享,可在线阅读,更多相关《猫狗分类实验总结.docx(14页珍藏版)》请在冰豆网上搜索。
猫狗分类实验总结
猫狗分类
首先使用的猫狗分类图像一共25000张,猫狗分别有12500张,我们先来简单的瞅瞅都是一些什么图片。
我们从下载文件里可以看到有两个文件夹:
train和test,分别用于训练和测试。
以train为例,打开文件夹可以看到非常多的小猫图片,图片名字从0.jpg一直编码到9999.jpg,一共有10000张图片用于训练。
而test中的小猫只有2500张。
仔细看小猫,可以发现它们姿态不一,有的站着,有的眯着眼睛,有的甚至和其他可识别物体比如桶、人混在一起。
同时,小猫们的图片尺寸也不一致,有的是竖放的长方形,有的是横放的长方形,但我们最终需要是合理尺寸的正方形。
小狗的图片也类似,在这里就不重复了。
猫狗分类之后设置卷积神经网络处理大小为(28,28,1)的输入张量,我们向第一层传入参数input_shape=(28,28,1)来完成此设置。
可以看到,每个Conv2D层和MaxPooling2D层的输出都是一个形状为(height,width,channels)的3D张量。
宽度和高度两个维度的尺寸通常会随着网络加深而变小。
通道数量由传入Conv2D层的第一个参数所控制(32或64)。
下一步是将最后的输出张量[大小为(3,3,64)]输入到一个密集连接分类器网络中,即Dense层的堆叠,你已经很熟悉了。
这些分类器可以处理1D向量,而当前的输出是3D张量。
卷积神经网络具有以下两个性质:
卷积神经网络学到的模式具有平移不变性(translationinvariant)。
卷积神经网络在图像,它可以在任何地方识别这个模式,对于密集连接网络来说,如果模式出现在新的位置,它只能重新学习这个模式。
这使得卷积神经网
络在处理图像时可以高效利用数据(因为视觉世界从根本上具有平移不变性),它只需要更少的训练样本就可以学到具有泛化能力的数据表示。
卷积神经网络可以学到模式的空间层次结构(spatialhierarchiesofpatterns)第一个卷积层将学习较小的局部模式(比如边缘),第二个卷积层将学习由第一层特征组成的更大的模式,以此类推。
这使得卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念(因为视觉世界从根本上具有空间层次结构)。
对于包含两个空间轴(高度和宽度)和一个深度轴(也叫通道轴)的3D张量,其卷积也叫特征图(featuremap)。
对于RGB图像,深度轴的维度大小等于3,因为图像有3个颜色通道:
红色、绿色和蓝色。
对于黑白图像(比如MNIST数字图像),深度等于1(表示灰度等级)。
卷积运算从输入特征图中提取图块,并对所有这些图块应用相同的变换,生成输出特征图(outputfeaturemap)。
该输出特征图仍是一个3D张量,具有宽度和高度,其深度可以任意取值,因为
输出深度是层的参数,深度轴的不同通道不再像RGB输入那样代表特定颜色,而是代表过滤器(filter)。
从这些图像中都能看出过拟合的特征。
训练精度随着时间线性增加,直到接近100%,而验证精度则停留在70%~72%。
验证损失仅在5轮后就达到最小值,然后保持不变,而训练损失则一直线性下降,直到接近于0。
因为训练样本相对较少(2000个),所以过拟合是你最关心的问题。
前面已经介绍过几种降低过拟合的技巧,比如dropout和权重衰减(L2正则化)。
现在我们将使用一种针对于计算机视觉领域的新方法,在用深度学习模型处理图像时几乎都会用到这种方法,它就是数据增强(dataaugmentation)
在编译和训练模型之前,一定要“冻结”卷积基。
冻结(freeze)一个或多个层是指在训练过程中保持其权重不变。
如果不这么做,那么卷积基之前学到的表示将会在训练过程中被修改。
因为其上添加的Dense层是随机初始化的,所以非常大的权重更新将会在网络中传播,对之前学到的表示造成很大破坏。
项目属于计算机视觉领域中的图像分类问题。
图像分类的过程非常明确:
给定已经标记的数据集,提取特征,训练得到分类器。
任务是对给定的猫和狗的图片进行分类,因此是二分类问题 项目要解决的问题是使用12500张猫和12500张狗的图片作为测试集,训练一个合适的模型,能够在给定的12500张未见过的图像中分辨猫和狗。
验证精度约为96%。
这比从头开始训练的小型卷积神经网络要好得多。
最后,在多次调试中,好多错误也改正了,也对猫狗分类有了新的认识,猫狗分类只是起点,其实并不复杂,以后的路还有很长,遇到错误要赢难而上,只而不能才会能。
代码部分:
fromkerasimportlayers
fromkerasimportmodels
fromkeras.datasetsimportmnist
fromkeras.utilsimportto_categorical
model=models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)))
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(64,(3,3),activation='relu'))
print(model.summary())
model.add(layers.Flatten())
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(10,activation='relu'))
print(model.summary())
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
train_images=train_images.reshape((60000,28,28,1))
train_images=train_images.astype('float32')
test_images=test_images.reshape((10000,28,28,1))
test_images=test_images.astype('float32')
train_labels=to_categorical(train_labels)
test_labels=to_categorical(test_labels)
pile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images,train_labels,epochs=5,batch_size=64)
test_loss,test_acc=model.evaluate(test_images,test_labels)
test_acc
importos,shutil
original_dataset_dir="E:
/data/catsdogs"
base_dir="E:
/data/smallData"
#os.mkdir(base_dir)
train_dir=os.path.join(base_dir,'train')
#os.mkdir(train_dir)
validation_dir=os.path.join(base_dir,'validation')
#os.mkdir(validation_dir)
test_dir=os.path.join(base_dir,'test')
#os.mkdir(test_dir)
train_cats_dir=os.path.join(train_dir,'cats')
#os.mkdir(train_cats_dir)
train_dogs_dir=os.path.join(train_dir,'dogs')
#os.mkdir(train_dogs_dir)
validation_cats_dir=os.path.join(validation_dir,'cats')
#os.mkdir(validation_cats_dir)
validation_dogs_dir=os.path.join(validation_dir,'dogs')
#os.mkdir(validation_dogs_dir)
test_cats_dir=os.path.join(test_dir,'cats')
#os.mkdir(test_cats_dir)
test_dogs_dir=os.path.join(test_dir,'dogs')
#os.mkdir(test_dogs_dir)
fnames=['cat.{}.jpg'.format(i)foriinrange(1000)]
forfnameinfnames:
src=os.path.join(original_dataset_dir,fname)
dst=os.path.join(train_cats_dir,fname)
shutil.copyfile(src,dst)
fnames=['cat.{}.jpg'.format(i)foriinrange(1000,1500)]
forfnameinfnames:
src=os.path.join(original_dataset_dir,fname)
dst=os.path.join(validation_cats_dir,fname)
shutil.copyfile(src,dst)
fnames=['cat.{}.jpg'.format(i)foriinrange(1500,2000)]
forfnameinfnames:
src=os.path.join(original_dataset_dir,fname)
dst=os.path.join(test_cats_dir,fname)
shutil.copyfile(src,dst)
fnames=['dog.{}.jpg'.format(i)foriinrange(1000)]
forfnameinfnames:
src=os.path.join(original_dataset_dir,fname)
dst=os.path.join(train_dogs_dir,fname)
shutil.copyfile(src,dst)
fnames=['dog.{}.jpg'.format(i)foriinrange(1000,1500)]
forfnameinfnames:
src=os.path.join(original_dataset_dir,fname)
dst=os.path.join(validation_dogs_dir,fname)
shutil.copyfile(src,dst)
fnames=['dog.{}.jpg'.format(i)foriinrange(1500,2000)]
forfnameinfnames:
src=os.path.join(original_dataset_dir,fname)
dst=os.path.join(test_dogs_dir,fname)
shutil.copyfile(src,dst)
print('totaltrainingcatimages:
',len(os.listdir(train_cats_dir)))
print('totaltrainingdogimages:
',len(os.listdir(train_dogs_dir)))
print('totalvalidationcatimages:
',len(os.listdir(validation_cats_dir)))
print('totalvalidationdogimages:
',len(os.listdir(validation_dogs_dir)))
print('totaltestcatimages:
',len(os.listdir(test_cats_dir)))
print('totaltestdogimages:
',len(os.listdir(test_dogs_dir)))
fromkerasimportmodels
fromkerasimportlayers
model=models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(150,150,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(1,activation="sigmoid"))
model.summary()
fromkerasimportoptimizers
pile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
fromkeras.preprocessing.imageimportImageDataGenerator
train_datagen=ImageDataGenerator(rescale=1./255)
test_datagen=ImageDataGenerator(rescale=1./255)
train_generator=train_datagen.flow_from_directory(
train_dir,
target_size=(150,150),
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')
history=model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=30,
validation_data=validation_generator,
validation_steps=50)
model.save('smallData_1.h5')
importmatplotlib.pyplotasplt
acc=history.history['acc']
val_acc=history.history['val_acc']
loss=history.history['loss']
val_loss=history.history['val_loss']
epochs=range(1,len(acc)+1)
plt.plot(epochs,acc,'bo',label='Trainingacc')
plt.plot(epochs,val_acc,'b',label='Validationacc')
plt.title('trainingandvalidationaccuracy')
plt.legend()
plt.figure()
plt.plot(epochs,loss,'bo',label='Trainingloss')
plt.plot(epochs,val_loss,'b',label='Validationloss')
plt.title('trainingandvalidationloss')
plt.legend()
plt.show()
#
datagen=ImageDataGenerator(
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
fromkeras.preprocessingimportimage
fnames=[os.path.join(train_cats_dir,fname)for
fnameinos.listdir(train_cats_dir)]
img_path=fnames[3]
img=image.load_img(img_path,target_size=(150,150))
x=image.img_to_array(img)
x=x.reshape((1,)+x.shape)
i=0
forbatchindatagen.flow(x,batch_size=1):
plt.figure(i)
imgplot=plt.imshow(image.array_to_img(batch[0]))
i+=1
ifi%4==0:
break
plt.show()
model=models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation='relu',
input_shape=(150,150,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.Dropout(0.5))
model.add(layers.Dense(512,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))
pile(loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
train_datagen=ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,)
test_datagen=ImageDataGenerator(rescale=1./255)
train_generator=train_datagen.flow_from_directory(
train_dir,
target_size=(150,150),
batch_size=32,
class_mode='binary')
validation_generator=test_datagen.flow_from_directory(
validation_dir,
target_size=(150,150),
batch_size=32,
class_mode='binary')
history=model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=100,
validation_data=validation_generator,
validation_steps=50)
model.save('cats_and_dogs_small_2.h5')
importmatplotlib.pyplotasplt
acc=history.history['acc']
val_acc=history.history['val_acc']
loss=history.history['loss']
val_loss=history.history['val_loss']
epochs=range(1,len(acc)+1)
plt.plot(epochs,acc,'bo',label='Trainingacc')
plt.plot(epochs,val_acc,'b',label='Validationacc')
plt.title('trainingandvalidationaccuracy')
plt.legend(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分类 实验 总结