图像识别(九)| 彻底搞懂SoftMax分类的底层逻辑

大家好啊,我是董董灿。

很多同学在做深度学习时,都会遇到难以理解的算法,SoftMax肯定是其中一个。初学者大都对它一知半解,只知道SoftMax可以用来做分类,输出属于某个类别的概率。

但是,为什么要用SoftMax呢?这个算法又是如何将神经网络推理的数值,转换为一个类别的分类的呢?

应用场景

假设要使用神经网络做图片分类。

现在有3个类别:猫,狗,人。给你下面一张图片,神经网络需要在这3个类别中选出一个。

▲猫咪

上图人眼一看就知道是猫咪,但是神经网络需要通过计算才知道。

好,我们使用Resnet50这一分类网络进行推理运算。算到最后面的全连接层时,全连接输出了3个数值,分别为2,1,0.1。

看过前面文章的同学可能知道,全连接输出的数值,代表了这一分类的得分。关于全连接可以翻看图像识别(八)| 还对全连接层迷迷糊糊?背会一首诗就行了

现在我们假设这三个分类的得分分别为:

分类得分
2
1
0.1

猫得了2分,狗得了1分,人得了0.1分。单看这个结果,我们大概知道,因为猫的得分最高,那最终神经网络会认为这张图片是一只猫

错了!

错在哪?至少两点。

第一,神经网络最终选择某一分类,依据的不是得分,而是概率

也就是说,最终神经网络会选择一个概率最高的分类作为它识别的结果。为什么要把得分转为概率呢?因为多分类模型中,输出值为概率更利于反向推导和模型的迭代,概率之间更好的计算距离,而数值之间的计算的距离是无含义的。

所以,我们需要一种方法,将上面的得分转换为概率。

| 第二,得分是神经网络经过了几十层卷积运算计算出来的

例子中猫的得分是2,狗的得分是1,人的得分是0.1,我们可以比较肯定的说,因为猫的得分最高,而且比狗和人都高很多,肯定就是猫。

但实际中,有很大的可能算出的猫的得分是2.1,狗的得分是1.9,人的得分是0.1。这个时候,我们可能就没有像刚才那么肯定了。

因为猫的得分和狗的得分相差很少,而且两者都很高!

这也是为什么,很多神经网络最终都会以TOP1 和 TOP5的识别准确度来衡量神经网络的精度。

由于上述两个原因的存在,人们想到了SoftMax算法。而这个算法,也几乎完美地解决了这两个问题。

为什么叫SoftMax以及它的实现原理

不知你有没有想过,为什么这个算法叫SoftMax呢?

Soft 是软的意思,与之对应肯定有 HardMax。

而 HardMax,可以理解为我们平时认知的Max。比如给你两个数(3, 4), 那么这两个数的 HardMax(3,4) 结果就是4。

这个逻辑,小学生学会了10以内的加减法都知道。

但正如上面所说,SoftMax不一样,它是要处理多个类别分类的问题。

并且,需要把每个分类的得分值换算成概率,同时解决两个分类得分值接近的问题。先从公式上看,SoftMmax是怎么做到的。

公式中,每个 z 就对应了多个分类的得分值。SoftMax对得分值进行了如下处理:

  • 以e为底数进行了指数运算,算出每个分类的 eZi,作为公式的分子

  • 分母为各分类得分指数运算的加和。

  • 根据公式很自然可以想到,各个分类的SoftMax值加在一起是1,也就是100%。所以,每个分类的SoftMax的值,就是将得分转化为了概率,所有分类的概率加在一起是100%。 

这个公式很自然的就解决了从得分映射到概率的问题。

那,它又是怎么解决两个得分相近的问题的呢?

其实也很简单,重点在选择的指数操作上。我们知道指数的曲线是下面的样子。

▲指数曲线,恒大于零,并且在正半轴,离零越远,增长越快(指数增长)

指数增长的特性就是,横轴变化很小的量,纵轴就会有很大的变化。

所以,从1.9变化到2.1,经过指数的运算,两者的差距立马被的拉大了。从而,我们可以更加明确的知道,图片的分类应该属于最大的那个。

下面是将猫、狗、人三个分类经过SoftMax计算之后得到的概率。

分类得分softmax
270%
120%
0.110%

可以看到,分类是猫的概率遥遥领先。所以,神经网络在经过softmax层之后,会以70%的概率,认为这张图片是一张猫

这就是SoftMax的底层原理。

指数让得分大的分类最终的概率更大,得分小的分类最终的概率更小,而得分为负数的分类,几乎可以忽略。

One More Thing

SoftMax 其实也是一种激活函数,它广泛的应用于多分类任务中。在二分类任务重,其实有个函数也被广泛的使用,它就是 Sigmoid,可以查看图像识别(六)|  激活函数 这一章了解Sigmoid函数。

比如,有个朋友告诉我,在一些互联网的广告或者商品推荐(比如某宝的猜你喜欢)中,曾经广泛的使用Sigmod函数来预测点击的可能性,如果Sigmoid函数的输出值越大,那么说明这个内容被用户点击的可能性就越大。

想想吧,我们逛淘宝的每次点击,背后都有一个函数在分析你的行为,你还会点击么?


 往期文章推荐:

图像识别(一)| 从像素说起_董董灿是个攻城狮的博客-优快云博客

图像识别(二)| 图像的色彩空间_董董灿是个攻城狮的博客-优快云博客

图像识别(三)| 初识卷积_董董灿是个攻城狮的博客-优快云博客

图像识别(四)| 卷积的核心,特征提取_董董灿是个攻城狮的博客-优快云博客_卷积图像特征提取

图像识别(五)| 春天花开却不识?打开百度识图,残差和卷积带你识遍路边野花_董董灿是个攻城狮的博客-优快云博客

图像识别(六)| 激活函数_董董灿是个攻城狮的博客-优快云博客

图像识别(七)| 池化层是什么?有什么作用?_董董灿是个攻城狮的博客-优快云博客

图像识别(八)| 还对全连接层迷迷糊糊?背会一首诗就行了_董董灿是个攻城狮的博客-优快云博客

更多信息,请查看专栏

https://blog.youkuaiyun.com/dongtuoc/category_11863193.htmlhttps://blog.youkuaiyun.com/dongtuoc/category_11863193.html

码字不易,如果你喜欢,请关注 董董灿是个攻城狮的博客_优快云博客 或点赞。
近期开通个人微信公众号:图像识别(九)| 彻底搞懂SoftMax分类的底层逻辑分享人工智能科技文章,欢迎关注。



v v v v v v

**本文为作者原创,请勿转载,转载请联系作者。**
**点击下方卡片,关注我的公众号,有最新的文章和项目动态。**

v v v v v v

### 自动化测试框架集成深度学习图像分类模型 为了将自动化测试框架与深度学习图像分类技术相结合,可以采用多种方式来简化开发过程并提高效率。以下是具体的技术细节: #### 1. **使用 PyCaret 进行快速建模** PyCaret 提供了一个低代码环境,允许开发者通过几行代码完成整个机器学习生命周期的任务,包括数据预处理、特征工程、模型训练和评估等[^4]。对于图像分类任务,虽然 PyCaret 主要针对结构化数据,但它可以通过封装其他库(如 TensorFlow 或 PyTorch)间接支持深度学习。 ```python from pycaret.classification import * # 初始化设置 clf = setup(data, target='label') # 训练模型 best_model = compare_models() # 调整超参数 tuned_model = tune_model(best_model) # 可视化性能 plot_model(tuned_model) ``` 尽管上述代码适用于传统机器学习模型,但对于深度学习模型,可以扩展此逻辑以适应 CNN 和贝叶斯网络的组合[^1]。 --- #### 2. **结合 Keras 实现模型微调** Keras 的灵活性使其成为构建复杂神经网络的理想选择。特别是在迁移学习场景下,通过对预训练模型进行微调,可以获得更高的精度和更快的收敛速度[^3]。以下是一个简单的示例,展示如何加载预训练模型并对特定层进行解冻以便进一步训练。 ```python import tensorflow as tf from tensorflow.keras.applications import ResNet50 from tensorflow.keras.layers import Dense, GlobalAveragePooling2D from tensorflow.keras.models import Model base_model = ResNet50(weights='imagenet', include_top=False) x = base_model.output x = GlobalAveragePooling2D()(x) predictions = Dense(10, activation='softmax')(x) # 假设有10类目标 model = Model(inputs=base_model.input, outputs=predictions) for layer in base_model.layers[:150]: layer.trainable = False model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` 这种策略不仅提高了模型泛化能力,还减少了计算资源的需求。 --- #### 3. **利用自动化工具优化工作流** 由于深度学习项目的部署涉及多个阶段,因此需要一套完整的解决方案来协调这些环节。例如,在实际应用中可能需要用到数据标注平台(LabelImg)、模型训练框架(TensorFlow/PyTorch),以及最终的服务接口设计(Flask/Django)。然而,手动操作往往耗时且容易出错。此时引入像 PyCaret 这样的工具可以帮助统一管理流程。 另外,考虑到不同开源库之间的兼容性和配置差异较大[^2],建议优先选用标准化较高的框架作为基础架构,并在此基础上逐步叠加功能模块。 --- #### 4. **案例分析:自动化测试框架中的图像识别插件** 假设我们正在开发一款软件产品,其中包含一项核心需求——自动检测屏幕截图内的异常区域。为此可以选择 Selenium 结合 OpenCV 完成初步定位;随后借助已训练好的 CNN 模型判断该位置是否存在错误提示信息。 ##### 测试脚本片段 ```python from selenium import webdriver import cv2 import numpy as np def capture_screenshot(driver_path): driver = webdriver.Chrome(executable_path=driver_path) driver.get('http://example.com') screenshot = driver.get_screenshot_as_png() image_np = np.frombuffer(screenshot, dtype=np.uint8) img_cv = cv2.imdecode(image_np, cv2.IMREAD_COLOR) return img_cv if __name__ == "__main__": screen_img = capture_screenshot('/path/to/chromedriver') # 加载预先训练的模型 model = tf.keras.models.load_model('image_classifier.h5') # 对图片进行预测 resized_image = cv2.resize(screen_img, (224, 224)) prediction = model.predict(np.expand_dims(resized_image / 255., axis=0)) print(f'Prediction result: {prediction}') ``` 以上代码展示了如何无缝衔接浏览器控制与 AI 推理引擎的功能点。 --- ### 总结 综上所述,通过合理运用现有技术和工具链,完全可以搭建起高效的自动化测试体系。无论是依赖于高阶 API 抽象还是深入底层定制实现方案,都需权衡项目规模和技术栈特点做出最佳决策。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值