
[英]Making Keras regression model with time series data with Deep Neural Network
[英]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_train
, X_test
, y_train
和y_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.