我有一个包含3个变量x、y、z的数据集,它们是3个不同传感器的读数。这些将作为输入。
当这些传感器发现特定对象时,它们的读数对应的输出应为1。否则,它们的读数对应的输出应为0。
我想做的是构建一个神经网络(可能是LSTM)或其他任何方法,接收传感器的读数,并判断它们是否找到了对象。请注意,传感器输出的值通常与图中不同,但我注意到读数之间的相关性和它们之间的距离。
实现这一点的最佳方法是什么?
回答:
“最佳”模型是“艺术”。你必须反复测试,直到找到一个适合你的数据的模型。
但基本上,你的输入形状将是 (examples, time_steps, features)
,其中:
examples
= 任何值,越多越好time_steps
= 每个示例的长度(读数数量)features = 3
。
然后你将创建一个以以下方式开始的模型:
inputs = Input((None, 3)) #变量time_steps,3个特征
你可能会从标准化这些值中受益,可能使用批量标准化层:
outputs = BatchNormalization()(inputs)outputs = Activation('tanh')(outputs)
然后开始模型的LSTM部分(层数取决于你的测试)
#任何数量的类似层(这也可以是0)outputs = LSTM(units, return_sequences=True, activation='tanh')(outputs)#最后的LSTM层outputs = LSTM(units, return_sequences=False, activation='tanh')(outputs)
你可以选择添加或不添加额外的分类层,例如:
#任何数量的分类层,包括0outputs = Dense(units)(outputs)outputs = BatchNormalization()(outputs)outputs = Activation('relu')(outputs)#最后的分类:outputs = Dense(1)(outputs)outputs = BatchNormalization()(outputs)outputs = Activatoin('sigmoid')(outputs)
最后,将所有部分组合起来:
model = Model(intpus, outputs)
请注意,这只是一个模型示例。这可能会有很大变化(包括分支、池化、注意力机制等,但你的问题似乎足够简单)。
这里的关键部分是:
- 理解输入形状
- 理解在最后的LSTM中你会丢弃“time_steps”维度。
- 现在你的问题是2D的 –
(examples, units_or_features)
- 现在你的问题是2D的 –
- 理解你的最后一层必须只有一个单元。(这样它可以为每个示例返回一个结果)
- 你的输出数据也必须匹配这个形状:
(examples, 1)
- 你的输出数据也必须匹配这个形状:
- 理解最后的激活函数应为’sigmoid’,这样结果在0和1之间。