Python keras conv1d输入数据整形

Python keras conv1d输入数据整形,python,tensorflow,keras,conv-neural-network,Python,Tensorflow,Keras,Conv Neural Network,我试图使用一维CNN对Keras进行二元分类。我有一台机器,它能连续执行一个动作,我的目标是分类这个动作是正常的还是异常的 为了监测每个动作的行为,有4个传感器收集100个测量值。因此,对于每个动作,我有4x100=400个数据点。在一个单独的文件中,我有对应于每个动作的标签。我的数据集如下所示: measurement ID | action ID | sensor 1 | sensor 2 | sensor 3 | sensor 4 | ---------------------------

我试图使用一维CNN对Keras进行二元分类。我有一台机器,它能连续执行一个动作,我的目标是分类这个动作是正常的还是异常的

为了监测每个动作的行为,有4个传感器收集100个测量值。因此,对于每个动作,我有4x100=400个数据点。在一个单独的文件中,我有对应于每个动作的标签。我的数据集如下所示:

measurement ID | action ID | sensor 1 | sensor 2 | sensor 3 | sensor 4 |
-----------------------------------------------------------------
       1       |     1     |   42.3   |   42.3   |   42.3   |   42.3   | 
       2       |     1     |   42.3   |   42.3   |   42.3   |   42.3   | 
       3       |     1     |   42.3   |   42.3   |   42.3   |   42.3   | 
      ...      |   ....    |   ....   |   ....   |   ....   |   ....   | 
      100      |     1     |   42.3   |   42.3   |   42.3   |   42.3   | 
       1       |     2     |   42.3   |   42.3   |   42.3   |   42.3   | 
       2       |     2     |   42.3   |   42.3   |   42.3   |   42.3   | 
       3       |     2     |   42.3   |   42.3   |   42.3   |   42.3   | 
      ...      |   ....    |   ....   |   ....   |   ....   |   ....   | 
      100      |     2     |   42.3   |   42.3   |   42.3   |   42.3   |
      ...      |   ....    |   ....   |   ....   |   ....   |   ....   |
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=5 activation='relu',input_shape=(100,4)))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
sgd = SGD(lr=0.1, momentum=0.9, decay=0, nesterov=False)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(trainX, trainY, validation_data=(testX, testY), epochs=100, batch_size=100)
我的问题是如何重塑此数据集以在Keras中应用convd1。以及如何将标签指定给一组向量。请注意,我的数据集由10000个操作组成。我的假设是,我有4个通道(维度),每个通道有100个值的向量,所以我的输入形状应该是(maxlen=100,维度=4)。也许我完全错了

模型应如下所示:

measurement ID | action ID | sensor 1 | sensor 2 | sensor 3 | sensor 4 |
-----------------------------------------------------------------
       1       |     1     |   42.3   |   42.3   |   42.3   |   42.3   | 
       2       |     1     |   42.3   |   42.3   |   42.3   |   42.3   | 
       3       |     1     |   42.3   |   42.3   |   42.3   |   42.3   | 
      ...      |   ....    |   ....   |   ....   |   ....   |   ....   | 
      100      |     1     |   42.3   |   42.3   |   42.3   |   42.3   | 
       1       |     2     |   42.3   |   42.3   |   42.3   |   42.3   | 
       2       |     2     |   42.3   |   42.3   |   42.3   |   42.3   | 
       3       |     2     |   42.3   |   42.3   |   42.3   |   42.3   | 
      ...      |   ....    |   ....   |   ....   |   ....   |   ....   | 
      100      |     2     |   42.3   |   42.3   |   42.3   |   42.3   |
      ...      |   ....    |   ....   |   ....   |   ....   |   ....   |
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=5 activation='relu',input_shape=(100,4)))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
sgd = SGD(lr=0.1, momentum=0.9, decay=0, nesterov=False)
model.compile(loss='binary_crossentropy', optimizer=sgd)
model.fit(trainX, trainY, validation_data=(testX, testY), epochs=100, batch_size=100)

有人能告诉我哪种方法是实现这一目标的正确方法吗?

使用多个传感器似乎是合乎逻辑的,不应该是一个问题,考虑到多个测量值的大小也似乎是正确的。因此,您可以尝试训练此模型并检查结果

我推荐的另一种方法是对所有传感器使用不同的卷积。因此,您将有4个卷积,每个卷积接受来自一个传感器的形状
(100,1)
输入。Keras代码将类似于

from keras.layers import Input, Conv1D, Dense, concatenate, Flatten
from keras.models import Model

s1_input = Input((100, 1))
s2_input = Input((100, 1))
s3_input = Input((100, 1))
s4_input = Input((100, 1))

conv1 = Conv1D(filters=64, kernel_size=5, activation='relu')(s1_input)
conv2 = Conv1D(filters=64, kernel_size=5, activation='relu')(s2_input)
conv3 = Conv1D(filters=64, kernel_size=5, activation='relu')(s3_input)
conv4 = Conv1D(filters=64, kernel_size=5, activation='relu')(s4_input)

f1 = Flatten()(conv1)
f2 = Flatten()(conv2)
f3 = Flatten()(conv3)
f4 = Flatten()(conv4)

dense_in = concatenate([f1, f2, f3, f4])
output = Dense(1, activation='sigmoid')(dense_in)

model = Model(inputs=[s1_input, s2_input, s3_input, s4_input], outputs=[output])

还有另一种RNN方法,在这里你把100次测量看作是时间步长,并在每一步输入4个传感器的数据。但是,我非常怀疑这种方法是否优于CNN方法。

谢谢你的回答,但是你能进一步解释一下如何在每个传感器上使用1个卷积吗?我知道输入应该是
(100,1)
,但我如何建模?复制此模型4次或如何复制。对不起,我有点困惑…在这种情况下,您需要使用Keras。我已经更新了我的答案,向大家展示了如何建模。谢谢你的代码,现在我可以更好地理解它了@layoug在这里将内核描述为形状(5x1)并沿100x1时间序列向下移动是否准确?