以三维张量时间序列为输入的Keras神经网络二值分类模型

2024-10-03 17:19:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用keras和tensorflow建立一个用于时间序列二元分类的NN模型。以下是我的输入的外观,形状为(124,4591):

      |      Col 1      |    Col 2        |    Col 3        |    Col 4        |
Row 1 | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] |
Row 2 | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] |
Row 3 | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] | [x1, ..., x591] |

我将数据分成X_trainX_testy_train和{}。我还使用LabelEncoder()OneHotEncoder()将我的标签从['True', 'False']编码到[0, 1]。在

^{pr2}$

X_train.shape返回(86,4591)。 标签编码:

label_encoder = LabelEncoder()
integer_encoded_train = label_encoder.fit_transform(array(y_train))
integer_encoded_test = label_encoder.fit_transform(array(y_test))

onehot_encoded_y_train = OneHotEncoder(sparse=False)
integer_encoded_train = integer_encoded_train.reshape(len(integer_encoded_train), 1)
onehot_encoded_y_train = onehot_encoded_y_train.fit_transform(integer_encoded_train)

onehot_encoded_y_test = OneHotEncoder(sparse=False)
integer_encoded_test = integer_encoded_test.reshape(len(integer_encoded_test), 1)
onehot_encoded_y_test = onehot_encoded_y_test.fit_transform(integer_encoded_test)

onehot_encoded_y_train.shape返回(86,2)。在

这是我的NN:

model = Sequential()
model.add(Dense(86, activation='relu', input_shape=(4,591)))
model.add(Dense(43, activation='relu'))
model.add(Dense(20, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss = 'binary_crossentropy',
              optimizer = 'adam',
              metrics = ['accuracy'])
model.summary()

它起作用了。但当我试着安装X峎u列车时,却出现了一个错误:

Error when checking target: expected dense_227 to have shape (1,) but got array with shape (2,)

上面提到的层是输出层。据我所知,输出形状是不正确的。我尝试在层之间使用Flattern(),甚至尝试了Reshape(1,)。但由于我是一个初学者,我不完全理解我必须添加什么来控制NN中的数据形状,以获得我需要的输出。在

我设法使它与softmax一起工作,但我也需要sigmoid来工作,这样我就可以在之后有一个最终的预测(True或False/1或0)。在

谢谢。在


Tags: testaddfalsemodeltransformtraincolinteger
1条回答
网友
1楼 · 发布于 2024-10-03 17:19:35

问题是你如何处理你的真实数据y。下面的模型使用的是随机数据,你必须用4个值将y编码为one hot,并为这个热编码指定一个基本真值向量y,它必须具有形状(124,4,1)注意4(我在这里使用124个示例)

因此y必须有4个维度y1, y2, y3, y4。下面展示了如何对基本真理逻辑值00, 01, 10,11进行编码并将其分配给4维目标向量y

0 0 ->      0001  -> y1=0, y2=0, y3=0, y4=1
0 1 ->      0010  -> y1=0, y2=0, y3=1, y4=0
1 0 ->      0100  -> y1=0, y2=1, y3=0, y4=0
1 1 ->      1000  -> y1=1, y2=0, y3=0, y4=0

这种逻辑值的处理可以用一个Karnaugh-Veitch图https://en.wikipedia.org/wiki/Karnaugh_map)来说明,图中的每个方块都相当于一个热编码的逻辑值。在

您必须编写一个函数,将逻辑值的组合00,01,10,11转换成上面所示的维度4的一个热编码特征向量

使用这样的y编码,模型可以像这样构建

^{pr2}$

关键的是y有相同的第二维度,比如X,这可以通过编码你的基本真理的逻辑值来实现

在上面的代码中没有这样做,因为我不知道你的数据,在代码中使用了正确维数的随机数据

相关问题 更多 >