您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > “猫狗分类实验”总结
猫狗分类首先使用的猫狗分类图像一共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%。这比从头开始训练的小型卷积神经网络要好得多。最后,在多次调试中,好多错误也改正了,也对猫狗分类有了新的认识,猫狗分类只是起点,其实并不复杂,以后的路还有很长,遇到错误要赢难而上,只而不能才会能。代码部分:fromkerasimportlayersfromkerasimportmodelsfromkeras.datasetsimportmnistfromkeras.utilsimportto_categoricalmodel=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)model.compile(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_accimportos,shutiloriginal_dataset_dir=E:/data/catsdogsbase_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('to
本文标题:“猫狗分类实验”总结
链接地址:https://www.777doc.com/doc-5917887 .html