我有一个数据集,我需要在其中对某组已标记的图像进行分类。目前这是由人类Maven完成的,因此可用的数据集质量很好。图像具有一些非常相似的特征。为了说明一个示例,我们可以假设苹果或番茄的腐烂量被分类为非常低、低、中、高和非常高(5类),并且非常相似的图像存在于相邻类对即:(极低和低、低和中、中和高、高和极高)有没有办法克服这一点?似乎具有挑战性,因为相邻类别之间的区分非常复杂和混乱,因为非常相似的图像存在于不止一个类别中。
umuewwlo1#
我建议您仅使用一个评分值(如0.0~1.0)作为“不合格评分”,并根据不合格评分结果对该值进行分组。例如:0.0~0.2:极低腐烂度0.2~0.4:低腐型0.4~0.6:中腐0.6~0.8:高腐型0.8~1.0:极高腐烂
vs91vp4v2#
CNN正在学习琐碎的特征,而FC层正在深入学习。在这种情况下,需要添加更深的层以获得更好的准确性
j8ag8udp3#
视觉相似性并不一定是个问题。一般来说,如果人类无法分类,那么CNNs也可能失败。作为难度的粗略指示,你可以让朋友分类一些困难的样本,如果她/他很吃力的话我不认为你举的这个例子是非常困难的,但我可以看到人类也有困难很好地分离类,看看数据和它的标签可能会揭示这一点。
wvyml7n54#
您可以通过使用卷积神经网络轻松地完成此操作。使用一些Conv2D块从图像中提取特征,然后在最后使用完全连接的Dense层。由于您有5个类需要预测,因此在最后一层使用softmax激活函数就足够了。并且通过除以255. 0来归一化图像像素值,以更快地训练。标签应该是整数编码的。
Conv2D
Dense
model = Sequential() model.add(Conv2D(32,(3,3),activation='relu',padding='same')) model.add(Conv2D(32,(3,3),activation='relu',padding='same')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Conv2D(64,(3,3),activation='relu',padding='same')) model.add(Conv2D(64,(3,3),activation='relu',padding='same')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Flatten()) model.add(Dropout(0.15)) model.add(Dense(100, activation='relu')) model.add(Dropout(0.15)) model.add(Dense(50,activation='relu')) model.add(Dense(5,activation='softmax'))
然后用sparse_categorical_crossentropy损失函数编译模型
sparse_categorical_crossentropy
model.compile(optimizer=Adam(0.001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
尝试使用学习速率或模型超参数来获得良好的结果
4条答案
按热度按时间umuewwlo1#
我建议您仅使用一个评分值(如0.0~1.0)作为“不合格评分”,并根据不合格评分结果对该值进行分组。
例如:0.0~0.2:极低腐烂度0.2~0.4:低腐型0.4~0.6:中腐0.6~0.8:高腐型0.8~1.0:极高腐烂
vs91vp4v2#
CNN正在学习琐碎的特征,而FC层正在深入学习。在这种情况下,需要添加更深的层以获得更好的准确性
j8ag8udp3#
视觉相似性并不一定是个问题。一般来说,如果人类无法分类,那么CNNs也可能失败。作为难度的粗略指示,你可以让朋友分类一些困难的样本,如果她/他很吃力的话我不认为你举的这个例子是非常困难的,但我可以看到人类也有困难很好地分离类,看看数据和它的标签可能会揭示这一点。
wvyml7n54#
您可以通过使用卷积神经网络轻松地完成此操作。
使用一些
Conv2D
块从图像中提取特征,然后在最后使用完全连接的Dense
层。由于您有5个类需要预测,因此在最后一层使用softmax激活函数就足够了。
并且通过除以255. 0来归一化图像像素值,以更快地训练。
标签应该是整数编码的。
然后用
sparse_categorical_crossentropy
损失函数编译模型尝试使用学习速率或模型超参数来获得良好的结果