繁体   English   中英

用于3D张量时间序列输入的二进制分类的Keras神经网络模型

[英]Keras Neural Network model for binary classification with 3D tensor time series as input

我正在使用keras和tensorflow构建神经网络模型以进行时间序列二进制分类。 这是我的输入的样子,形状为(124,4,591):

      |      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_trainy_test 我还使用LabelEncoder()OneHotEncoder()标签从['True', 'False']编码为[0, 1]

x = np.stack((np.vstack(x[:,0]),np.vstack(x[:,1]),np.vstack(x[:,2]),np.vstack(x[:,3])))
x = x.reshape((124,4,591))
y = table_raw_ptpt['Binding Known']
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)

X_train.shape返回 X_train.shape 标签编码:

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返回 onehot_encoded_y_train.shape

这是我的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_train时,出现错误:

检查目标时出错:预期density_227的形状为(1,),但数组的形状为(2,)

提到的层是输出层。 据我了解,输出形状不正确。 我尝试在层之间使用Flattern() ,甚至尝试了Reshape(1,) 但是由于我是初学者,所以我不完全了解为获得所需的输出而必须添加哪些内容以控制NN中的数据形状。

我设法使其与softmax ,但我也需要sigmoid softmax ,以便以后可以进行最终预测(True或False / 1或0)。

谢谢。

问题在于您如何处理地面真实数据y 下面的模型与您的真实数据的随机数据的工作,你必须编码y作为一个热带4点的值,并指定这一个热码的地面实况矢量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编码,模型可以像

from random import randint
from random import seed
import math
import numpy as np
from keras.models import Sequential
from keras.layers import Dense


# generating random data, replace this with your data

X = np.random.rand(124,4,591)

y = np.random.randint(2,size=(124,4)) # replace this with your ground truth feature vector

y=y.reshape(124,4,1)



# https://stackoverflow.com/questions/44704435/error-when-checking-model-input-expected-lstm-1-input-to-have-3-dimensions-but


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()

model.fit(X, y, epochs=1, batch_size=10)

关键是y具有与X相同的第二维,此处为4,这可以通过像上面这样编码基本事实的逻辑值来实现

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM