kaggle猫狗分类的总结(AlexNet模型, keras框架),完整实验流程,源代码和详细解析

这篇博客总结了使用Keras框架和AlexNet模型在Kaggle猫狗分类任务上的实验流程。作者从数据集制作、预处理、模型定义、训练、预测和微调等方面进行了详细阐述,包括数据集的选择、模型编译训练、预测代码及权重文件的保存和加载。文章旨在帮助读者理解深度学习实践步骤。
摘要由CSDN通过智能技术生成

现在将已掌握的知识进行总结,方便以后自己写网络增加思路。

首先数据集下载:链接:https://pan.baidu.com/s/1U4N0PCNfyIP9iHLidVb9xA 提取码:vcvl
keras框架中文文档:https://keras.io/zh/  英文文档: https://keras.io/

  • 说一下这个数据集的构成:
    train文件夹下有25000张猫狗照片,猫和狗各12500张,命名方式分别为cat.x.jpg(x为索引0, 1, 2,… )(注意cat后边也有一个点!!),dog.x.jpg。
    test1文件夹下有12500张猫狗混合照片。

1、数据集制作:

  • 分类任务为例,制作好数据集包括图像和对应的标签。需要将数据和标签一一对应上。
    由于使用train中的照片实在是太多(不适合在CPU跑),我就选择了250张猫和250张狗的照片作为训练集,选100张猫和100张狗照片作为测试集。
    测试集和训练集我都在train文件夹中选择。(test1文件夹是混合猫狗,不方便打标签)
    在train文件夹选0-249的猫和0-249的狗作为训练集,选250-349的猫和250-349的狗作为测试集。
    所以重新制作的数据集如下图:
    在这里插入图片描述
    在这里插入图片描述
    所以文件路径就是:

    data
        train
         cats (250张猫,编号0-249)
         dogs (250张狗, 编号0-249)
        test
          cats (100张猫, 编号250-349)
         dogs (100张狗, 编号250-349)


放置一个train–cats文件夹详情给大家,方便看。
到现在,数据集已经制作完毕。

2、 数据预处理

  • 将数据重新定义成标准尺寸image.shape = (224, 224, 3),还可以根据图像生成器(ImageGenerator)增加图像数量,提高训练精度。(我没有用,这个数据集够多,没有必要,这个生成器也很简单,可以自行百度学习)
    代码段
IMG_CHANNELS=3 #PGB图像为三通道 R、G、B
#weight_decay = 0.0005 
IMG_ROWS=224  #图像的行像素
IMG_COLS=224  #图像的列像素
BATCH_SIZE=64 #batch大小
NB_EPOCH=10   #循环次数
NB_CLASSES=2  #分类  猫和狗两种
VERBOSE=1
#VALIDATION_SPLIT=0.2
#OPTIM=RMSprop()
x_test=np.empty((200,IMG_ROWS,IMG_COLS,3),np.float16)  #测试集两百张(200, 224, 224, 3)
x_train=np.empty((500,IMG_ROWS,IMG_COLS,3),np.float16)  #训练集五百张(500, 224, 224, 3)
train_data=np.zeros(500)  #训练集标签
test_data=np.zeros(200)  #测试集标签
#读入训练样本
for i in range(500):
    if i<250:
		#载入250张猫
        train_data[i]=1#猫的标签就是1
		#dog.8
        imagepath = "D:/python_pro/deep_learning_al/data/train/cats/cat." + str(i)+ ".jpg"#猫照片存储路径
        image1 = cv2.imread(imagepath)  #读入文件
        image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)  #转为RGB
        image1 = cv2.resize(image1,(IMG_ROWS,IMG_COLS))  #重新定义形状为(224, 224)
        #plt.imshow(image1)
        #plt.show()
        x_train[i,:,:,:]=image1   #训练集矩阵,四维(500, 224, 224, 3)

    else:
		#载入250张狗
        train_data[i]=0#狗的标签就是0
        imagepath = "D:/python_pro/deep_learning_al/data/train/dogs/dog." + str(i - 250)+ ".jpg" #狗照片路径
        image1 = cv2.imread(imagepath)  #读入文件
        image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)#转为RGB
        image1 = cv2.resize(image1, (IMG_ROWS, IMG_COLS))#重新定义形状为(224, 224)
        x_train[i, :, :, :] = image1 #训练集矩阵,四维(500, 224, 224, 3)
y_train=to_categorical(train_data) #训练集标签(500, 2)
x_train=np.array(x_train)  #完整训练集矩阵
#读入测试样本
for i in range(200):
    if i<100:
		#载入100张猫
        test_data[i]=1#猫的标签就是1
        imagepath =  "D:/python_pro/deep_learning_al/data/test/cats/cat."+str(i+250)+'.jpg'#猫照片存储路径
        image1 = cv2.imread(imagepath)#读入文件
        image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)#转为RGB
        image1 = cv2.resize(image1,(IMG_ROWS,IMG_COLS)) #重新定义形状为(224, 224)
        x_test[i,:,:,:]=image1

    else:
		#载入100张狗
        test_data[i]=0#狗的标签就是0
        imagepath=  "D:/python_pro/deep_learning_al/data/test/dogs/dog."+str(i+250-100)+'.jpg'#狗照片路径
        image1 = cv2.imread(imagepath)#读入文件
        image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)#转为RGB
        image1 = cv2.resize(image1, (IMG_ROWS, IMG_COLS))#重新定义形状为(224, 224)
        x_test[i, :, :, :] = image1
y_test=to_categorical(test_data) #测试集标签(200, 2)
#print(sys.getsizeof(x_test),sys.getsizeof(y_test))
x_test=np.array(x_test) #完整测试集矩阵(200, 224, 224, 3)
#归一化
#x_train.shape = (500, 224, 224, 3)
#x_test.shape = (200, 224, 224, 3)
x_train=x_train/255  #像素是8位的,所以0-255编程0-1除以255即可。
x_test = x_test/255

print(x_train.shape,x_test.shape,y_train.shape,y_test.shape)

到这里数据预处理完毕(详细的注释已经给出。)

3、定义训练模型

  • 可以完全自己写,也可以直接在框架中调用add,来增加层(卷积层,drop out 层,全连接层等)。

  • 我使用的是书中的alexnet模型

  • AlexNet模型简单介绍:
    网络架构一共有5个卷积层,3个Maxpooling层、2个全连接层(值得注意的是三、四卷积层后没有Pooling层),其输入矩阵为3x224×224大小的三通道彩色图像。
    下面为AlexNet网络模型架构详情。
    输入层(Input):输入为3×224×224大小图像矩阵。
    卷积层(Conv1):96个11*11大小的卷积核(每个GPU上48个卷积核)。
    Pooling层(Pool1):Max Pooling窗口大小为2×2,stride=2。
    卷积层(Conv2):256个5×5大小的卷积核(每个GPU上128个卷积核)。
    Pooling层(Pool2):Max Pooling窗口大小为2×2,stride=2。
    卷积层(Conv3):384个3×3大小的卷积核(每个GPU上各192个卷积核)。
    卷积层(Conv4)384个3x3大小的卷积核(每个GPU上各192个卷积核)。
    卷积层(Conv5):256个3x3大小的卷积核(每个GPU上各128个卷积核)。
    Pooling层(Pool5):Max Pooling窗口大小为2×2,stride=2。
    全连接层(FC1):第一个全连接层,将第五层Pooling层的输出连接成为一个一维向量作为该层的输入,输出4096个神经节点。
    全连接层(FC2):第二个全连接层,输入输出均为4096个神经节点。
    Sofmax输出层:输出为1000个神经节点,输出的每个神经节点单独对应图像所属分类的概率。因为在ImageNet数据集中有1000个分类,因此设定输出维度为1000。们用于二分类,所以输出为2个神经节点)

代码段:

def alex_net(w_path = None):
	#输入图像为(3, 224, 224)
	input_shape = (224, 224, 3)
	#输入层
	inputs = Input(shape = input_shape, name = 'input')

	#第一层:两个卷积操作和两个pooling操作

	conv1_1 = Convolution2D(48, (11, 11), strides = (4, 4), activation = 'relu', name = 'conv1_1')(inputs)
	conv1_2 = Convolution2D(48, (11, 11), strides = (4, 4), activation = 'relu', name = 'conv1_2')(inputs)

	pool1_1 = MaxPooling2D((3, 3), strides = (2, 2), name = 'pool1_1')(conv1_1)
	pool1_2 = MaxPooling2D((3, 3), strides = (2, 2), name = 'pool1_2')(conv1_2)

	#layer2:两个卷积,将前边的池化得到的数据,进行卷积,再继续池化

	conv2_1 = Convolution2D(128, (5, 5), activation = 'relu', padding = 'same')(pool1_1)
	conv2_2 = Convolution2D(128, (5, 5), activation = 'relu', padding = 'same')(pool1_2)

	pool2_1 = MaxPooling2D((3, 3), strides = (2, 2), name = 'pool2_1')(conv2_1)
	pool2_2 = MaxPooling2D((3, 3), strides = (2, 2), name = 'pool2_2')(conv2_2)

	#merge合并层:第二层进入第三层,将数据混合合并
	merge1 = concatenate([pool2_2, pool2_1], axis = 1)

	#layer3:两个卷积操作

	conv3_1 = Convolution2D(192, (3, 3), activation = 'relu', name = 'conv3_1', padding = 'same')(merge1)
	conv3_2 = Convolution2D(193, (3, 3), activation = 'relu', name = 'conv3_2', padding = 'same')(merge1)

	#latyer4:两个卷积操作
	conv4_1 = Convolution2D(192, (3, 3), activation = 'relu', name = 'conv4_1', padding = 'same')(conv3_1)
	conv4_2 = Convolution2D(192, (3, 3), activation = 'relu', name = 'conv4_2', padding = 'same')(conv3_2)

	#layer5:两个卷积操作和两个pooling操作
	conv5_1 = Convolution2D(128, (3, 3), activation = 'relu', name = 'conv5_1', padding = 'same')(conv4_1)
	conv5_2 = Convolution2D(128, (3, 3), activation = 'relu', name = 'conv5_2', padding = 'same')(conv4_2)

	pool5_1 = MaxPooling2D((3, 3), strides = (2, 2), name = 'pool5_1')(conv5_1)
	pool5_2 = MaxPooling2D((3, 3), strides = (2, 2), name = 'pool5_2')(conv5_2)

	#merge合并层:第五层进入全连接之前,要将分开的合并
	merge2 = concatenate([pool5_1, pool5_2], axis = 1)

	#通过flatten将多维输入一维化
	dense1 = Flatten(name = 'flatten')(merge2)

	#layer6, layer7 第六,七层, 进行两次4096维的全连接,中间加dropout避免过拟合
	dense2_1 = Dense(4096, activation = 'relu', name = 'dense2_1')(dense1)
	dense2_2 = Dropout(0.5)(dense2_1)

	dense3_1 = Dense(4096, activation = 'relu', name = 'dense3_1')(dense2_2)
	dense3_2 = Dropout(0.5)(dense3_1)

	#输出层:输出类别,分类函数使用softmax

	dense3_3 = Dense(nb_classes, name = 'dense3_3')(dense3_2)
	prediction = Activation('softmax', name = 'softmax')(dense3_3)
	

	#最后定义模型输出
	AlexNet = Model(
  • 30
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值