卷积网络项目:实现识别鲜花四分类对比LeNet5、VGG16、ResNet18、ResNet34分类网络

卷积四分类项目

Gitee传送门

分类目标选取

鲜花

  • 杏花 apricot_blossom
  • 桃花 peach_blossom
  • 梨花 pear_blossom
  • 梅花 plum_blossom

模型选择

卷积

  • LeNet5
  • VGG16
  • ResNet18
  • ResNet34

以图搜图

获取相似度前10的搜图结果

数据清洗

鲜花四分类

删除非图片文件

image.png

删除重复图片

image.png
image.png
image.png
image.png
image.png

整理数据集

鲜花四分类

每种类别数据:训练500、测试50、预测10
总训练集:2500
总测试集:250
总预测集:40

训练模型

报错

ValueError: num_samples should be a positive integer value, but got num_samples=0

换了电脑后,数据集的存储位置不同,更换路径后解决

RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

原因:错误内容就在类型不匹配,根据报错内容可以看出Input type为torch.FloatTensor(CPU数据类型),而weight type(即网络权重参数这些)为torch.cuda.FloatTensor(GPU数据类型)
方案:将输入类型转变为GPU类型
输入数据和网络都切换到cuda,但问题仍存在
检查网络,修改模型隐藏层初始化方式后,解决了问题

鲜花

v1:LeNet5:bn

输出4分类

image.png
image.png
image.png

v2:VGG16:bn

数据太差,提前中断了训练
image.png
image.png
image.png

v3:ResNet18:bn

输出4分类
f4_v3:32x32

image.png
image.png
image.png
准确率仍上不去,预估增大迭代次数,准确率能慢慢提升

f4_v3.3:224x224

image.png
image.png
过拟合前最佳:
image.png
测试数据出现过拟合现象,考虑减小数据大小

f4_v3.4:112x112

image.png
image.png
过拟合前最佳:
image.png
再次出现过拟合,提前中断了训练

f4_v3.5:56x56

image.png
image.png
过拟合前最佳:
image.png
再次出现过拟合,提前中断了训练
结论:图片缩放大小无法解决过拟合问题

f4_v3.6:32x32,减4个残差块

image.png
image.png
测试集过拟合前
image.png
最佳
image.png

f4_v3.6:32x32,减4个残差块,transforms减Norm

image.png
image.png
测试集过拟合前
image.png
最佳
image.png

v4:ResNet34:bn

输出4分类

image.png
image.png
image.png
预估:增加迭代次数,可能能缓慢提升准确率

以图搜图

报错

ValueError: Expected more than 1 value per channel when training, got input size torch.Size([1, 512, 1, 1])

image.png
LeNet5模型能正常运行,ResNet18和ResNet34模型报错
image.png正常运行
image.png报错
image.png报错
原因:模型中含有nn.BatchNorm层,训练时需要batch_size大于1,来计算当前batch的running mean and std。自定义数据数量除以batch_size后刚好余1,就发生了上述报错
方案1:在pytorch的Dataloader中设置drop_last=True即可,这样会忽略最后一个batch
尝试在数据集增加drop_last=True,再次训练,尚未解决这个问题
方案2:在添加数据前增加model.eval()
代码原本就有这个语句,仍存在这个问题
方案3:修改训练模型数据预处理中Resize大小32–>224,问题解决

搜图结果

v1:LeNet5:bn

image.png
image.png
没有一个是正确分类

v3:ResNet18:bn

f4_v3:32x32

image.png
image.png
没有一个是正确分类,且相似度差距很大

f4_v3.3:224x224

过拟合前最佳:
image.png
image.png
预测最佳类别中top10图片和原图类别相同,但与top1图片与原图相似度不是0
原因:检索库图片根据特征处理、带参数的模型生成对应的特征文件,更换特征处理方式或参数后,生成的特征文件有所不同,所以计算相似度,哪怕是原图也不为0
解决方案:更换特征处理方式或参数后,重新初始化特征文件,再进行预测,解决了这个问题

v4:ResNet34:bn

f4_v4:32x32

image.png
image.png
没有一个是正确分类,且相似度差距很大

f4_v4.3:224x224

image.png
image.png
出现了一个正确分类,由于时间问题,v4.3版没有完成足够的训练,不确定迭代后的数据能否达到预期效果

特征处理

feat_v3.3.0:tensor

image.png

feat_v3.3.1:tensor+Resize56

image.png

feat_v3.3.2:tensor+Resize56+Norm

image.png

feat_v3.3.3:tensor+crop+Resize56

image.png

feat_v3.3.4:tensor+Resize+crop+Resize56

image.png

feat_v3.3.5:tensor+Resize+crop+Resize224

image.png

feat_v3.3.6:tensor+Resize+crop+Resize112

image.png

feat_v3.3.7:tensor+Resize+crop+Resize32

image.png

总结

feat_v3.3.4.txt版本的特征处理效果最好
特征处理方式:tensor+Resize600+crop400+Resize56

搜图效果

相似度前10的结果,top1是原图,6张正确类别花,3张错误类别花
原因:这四类花本身比较相似,不便于学习;也可能是数据量不够多,训练效果不够好;也可能迭代的次数不够多,模型没有训练到足够好的效果
20240227002214_rec_.gif

  • 30
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我选择ResNet网络模型,这是一种非常经典的深度卷神经网络模型。 首先,我们需要导入必要的库和数据集。以下是代码: ```python import tensorflow as tf from tensorflow.keras import layers, models, datasets # 加载Mnist数据集和Fashion Mnist数据集 (train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data() (fashion_train_images, fashion_train_labels), (fashion_test_images, fashion_test_labels) = datasets.fashion_mnist.load_data() # 将像素值缩放到0到1之间 train_images, test_images = train_images / 255.0, test_images / 255.0 fashion_train_images, fashion_test_images = fashion_train_images / 255.0, fashion_test_images / 255.0 ``` 接下来,我们可以构建ResNet模型。以下是代码: ```python def resnet_block(input_data, filters, kernel_size, stride): x = layers.Conv2D(filters, kernel_size=kernel_size, strides=stride, padding='same', activation='relu')(input_data) x = layers.BatchNormalization()(x) x = layers.Conv2D(filters, kernel_size=kernel_size, strides=1, padding='same', activation=None)(x) x = layers.BatchNormalization()(x) x = layers.add([x, input_data]) x = layers.Activation('relu')(x) return x def resnet(input_shape, num_classes): inputs = layers.Input(shape=input_shape) x = layers.Conv2D(64, kernel_size=7, strides=2, padding='same', activation='relu')(inputs) x = layers.BatchNormalization()(x) x = layers.MaxPooling2D(pool_size=(3, 3), strides=2, padding='same')(x) # ResNet blocks x = resnet_block(x, 64, 3, 1) x = resnet_block(x, 64, 3, 1) x = resnet_block(x, 128, 3, 2) x = resnet_block(x, 128, 3, 1) x = resnet_block(x, 256, 3, 2) x = resnet_block(x, 256, 3, 1) x = layers.GlobalAveragePooling2D()(x) # 输出层 outputs = layers.Dense(num_classes, activation='softmax')(x) model = models.Model(inputs=inputs, outputs=outputs) return model # 构建模型 model = resnet((28,28,1), 10) model.summary() ``` 在上述代码中,我们定义了一个ResNet块函数和一个ResNet模型函数。在ResNet模型函数中,我们首先定义了模型的输入层,然后添加一个卷层和一个批量归一化层。接下来,我们添加了一些ResNet块,以增加模型的深度。最后,我们添加了一个全局平均池化层和一个输出层。 现在我们可以编译和训练模型。以下是代码: ```python # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 history = model.fit(train_images[..., tf.newaxis], train_labels, epochs=10, validation_data=(test_images[..., tf.newaxis], test_labels)) ``` 在上述代码中,我们使用了Adam优化器和稀疏分类交叉熵损失函数来编译模型。然后,我们使用Mnist数据集来训练模型,并在测试集上进行验证。 我们还可以使用Fashion Mnist数据集来验证模型的泛化能力。以下是代码: ```python # 在Fashion Mnist数据集上进行测试 fashion_loss, fashion_acc = model.evaluate(fashion_test_images[..., tf.newaxis], fashion_test_labels) print('Fashion Mnist accuracy:', fashion_acc) ``` 最后,我们可以绘制训练和验证的准确率和损失函数图表,以便更好地了解模型的性能。以下是代码: ```python import matplotlib.pyplot as plt # 绘制准确率图表 plt.plot(history.history['accuracy'], label='accuracy') plt.plot(history.history['val_accuracy'], label='val_accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.ylim([0.5, 1]) plt.legend(loc='lower right') plt.show() # 绘制损失函数图表 plt.plot(history.history['loss'], label='loss') plt.plot(history.history['val_loss'], label='val_loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend(loc='upper right') plt.show() ``` 这样,我们就成功地在Mnist数据集和Fashion Mnist数据集上使用ResNet模型进行了训练和验证。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饭碗、碗碗香

感谢壮士的慷概解囊!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值