我试图使用一维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 |
... | .... | .... | .... | .... | .... |我的问题是如何重塑这个数据集以在Keras中应用convd1。以及如何将标签分配给一组向量。请注意,我的数据集由10,000个操作组成。我的假设是,我有4个通道(维度),每个通道的向量为100个,所以我的输入形状应该是(maxlen=100,dimension=4)。也许我完全错了。
模型应该如下所示:
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)有人能指点我哪种方法才能做到这一点吗?
发布于 2018-04-17 12:06:00
使用传感器的数量似乎是合乎逻辑的,不应该是一个问题,考虑多个测量的大小也似乎是正确的。所以,你可以试着训练这个模型并检查结果。
我推荐的另一种方法是对所有传感器使用不同的卷积。因此,您将有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的方法。
https://stackoverflow.com/questions/49877422
复制相似问题