我有一个3D输入(示例,步骤,特征)。因此,每个样本都有一系列具有不同功能的步骤。现在,我想要一个2D输出(样本,步骤),其中有样本,并且在样本的每个步骤中都有从模型计算出的0或1。
所以我认为这是一个顺序二进制分类问题。我很难定义模型,尤其是输出层。
以下是numpy数组的形状:
x_train.shape
# (200, 1657, 669)
x_test.shape
# (41, 1657, 669)
y_train.shape
# (200, 1657)
y_test.shape
# (41, 1657)
我尝试了这种模型,但是输出结果不是我期望的
n_residues, n_features, n_outputs = trainX.shape[1], trainX.shape[2], trainy.shape[1]
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_residues,n_features)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.1))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit network
model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose)
m_classes = model.predict_classes(x_test, verbose=0)
print(m_classes)
[ 36 36 59 32 16 32 36 804 1047 16 16 36 32 36
36 36 16 16 16 16 16 16 36 16 36 36 36 16
59 36 36 36 16 16 16 804 16 16 16 36 36]
对于假定为0 -1657类的测试集中的41个样本,输出是41个长向量。
我期望的测试集输出为41个二进制矢量,长度为1657。
谢谢!
答案 0 :(得分:0)
在处理Conv1D,RNN或序列模型时,输出可以是一对一,多对一,(或)多对多。在这种情况下,模型是多对一的行为。通常,在Keras中,有一个return_sequence
或stateful
参数。如果这些参数为 False ,则您的模型的行为类似于一对多。 (即,输出形状为(batch_size,unit_length)。在这种情况下,单位长度为输出)。要制作模型many to many
,则输出应类似于(批量大小,时间步长,单位长度)。只需初始化stateful==True
即可帮助您解决此问题。
了解序列输出数据的一些有用链接
Understanding LSTM
Feeding one prediction after another
检查conv1D初始化官方文档并设置参数 stateful = True 。这是LSTM或Conv1D背后的理论思想。此链接将帮助您使LSTM背后的体系结构想法。