基于PHP wrapper for FANN,如何为神经网络特定输出忽略指定输入?
解决FANN神经网络指定输出仅使用部分输入的问题
针对你想用PHP FANN库实现“特定输出仅依赖部分输入”的需求,有三种实用方案:
方案1:拆分独立神经网络(最推荐)
直接搭建多个独立的神经网络,每个网络对应一组输出任务,输入仅保留该任务需要的传感器数据:
- 针对“房间是否有人”的输出,搭建一个输入层为9个节点(去掉温度传感器数据)、输出层为1个节点的网络
- 针对剩下的4种状态(如是否过热等),搭建一个输入层为10个节点、输出层为4个节点的网络
对应修改训练数据
原训练数据格式:
1 10 5 57 740.02 25.9 95 0.09 747 21.1 5.4 0 42.17 1 0 1 1 0
拆分后,第一个网络的训练数据(判断是否有人):
1 9 1 57 740.02 95 0.09 747 21.1 5.4 0 42.17 # 去掉了温度值25.9 1 # 对应原输出的第一个值
第二个网络的训练数据(处理剩余4种状态):
1 10 4 57 740.02 25.9 95 0.09 747 21.1 5.4 0 42.17 0 1 1 0 # 对应原输出的后4个值
这种方式逻辑清晰,训练和推理时互不干扰,后期维护也简单。
方案2:固定特定连接权重为0
通过手动设置并固定温度输入节点与“房间是否有人”输出节点(含隐藏层对应连接)的权重为0,让该输入无法影响目标输出:
- 创建好10输入5输出的网络后,找到温度输入节点到目标输出节点、以及到所有隐藏层节点的连接
- 使用
fann_set_weight()将这些连接的权重设为0 - 训练时通过FANN的参数设置,禁止这些权重被更新(比如自定义权重更新函数,跳过这些权重的修改)
这种方法适合不想拆分网络的场景,但需要熟悉FANN的权重操作细节,处理隐藏层连接时比较繁琐。
方案3:预处理输入数据
在喂入网络前,针对不同输出任务动态修改输入:
- 当计算“房间是否有人”的概率时,将温度输入固定为一个常数(比如所有训练样本的温度均值),让该输入不再提供有效信息
- 训练阶段也要同步处理:训练“是否有人”的输出时,所有样本的温度值都替换为这个常数
这种方法不用修改网络结构,但本质是让网络学习时忽略该输入,效果略逊于拆分网络,适合快速验证需求的场景。
内容的提问来源于stack exchange,提问作者BArtWell
相关产品推荐
相关产品推荐

