如何重塑我的输入以将其输入1D卷积层以进行序列分类?

时间:2017-06-22 17:29:08

标签: deep-learning classification keras conv-neural-network convolution

我有一个包含339732行和两列的csv文件:

  • 第一个是29个特征值,即X
  • 第二个是二进制标签值,即Y

    dataframe = pd.read_csv(“features.csv”,header = None)         dataset = dataframe.values

    X = dataset[:, 0:29].astype(float)
    Y = dataset[:,29]
    X_train, y_train, X_test, y_test = train_test_split(X,Y, random_state = 42)
    

我正在尝试在一维卷积层上训练它:

model = Sequential()
model.add(Conv1D(64, 3, activation='relu', input_shape=(X_train.shape[0], 29)))
model.add(Conv1D(64, 3, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(128, 3, activation='relu'))
model.add(Conv1D(128, 3, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

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

model.fit(X_train, y_train, batch_size=16, epochs=2)
score = model.evaluate(X_test, y_test, batch_size=16)

因为,Conv1D层需要3-D输入,我按如下方式转换输入:

X_train = np.reshape(X_train, (1, X_train.shape[0], X_train.shape[1]))
X_test = np.reshape(X_test, (1, X_test.shape[0], X_test.shape[1]))

然而,这仍然会引发错误:

  

ValueError:通过输入形状为'conv1d_1 / convolution / Conv2D'(op:'Conv2D')从1减1而导致的负尺寸大小:[?,1,1,29],[1,3,29, 64]。

有没有办法正确输入我的输入?

2 个答案:

答案 0 :(得分:0)

据我所知,1D卷积层接受Batchsize x Width x Channels形式的输入。你正在重塑

X_train = np.reshape(X_train, (1, X_train.shape[0], X_train.shape[1]))

但是X_train.shape[0]是你的 batchsize 我想。我认为问题出在这里。你可以在重塑之前告诉我X_train的形状是什么吗?

答案 1 :(得分:0)

您必须考虑您的数据是否在339732条目或29个要素之间存在某种进展关系,这意味着订单是否重要。如果不是,我认为CNN不适合这种情况。

如果29个功能“表示某事的进展”:

  

X_train = X_train.reshape((X_train.shape [0],X_train.shape [1],1))

如果29个特征是独立的,那么就像图像上的通道一样,但只有1个就没有意义。

  

X_train = X_train.reshape((X_train.shape [0],1,X_train.shape [1]))

如果你想选择339732条目,比如顺序重要的区块(剪辑339732或添加零填充以便可以被时间步长整除):

  

X_train = X_train.reshape((int(X_train.shape [0] / timesteps),timesteps,X_train.shape [1],1))