Deep learning 如何重塑我的输入,将其送入一维卷积层进行序列分类?

Deep learning 如何重塑我的输入,将其送入一维卷积层进行序列分类?,deep-learning,classification,keras,conv-neural-network,convolution,Deep Learning,Classification,Keras,Conv Neural Network,Convolution,我有一个包含339732行和两列的csv文件: 第一个是29个特征值,即X 第二个是二进制标签值,即Y dataframe=pd.read\u 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_sta

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

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

    dataframe=pd.read\u 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:输入形状为[1,1,1,29],[1,3,29,64]的'conv1d_1/卷积/Conv2D'(op:'Conv2D')从1中减去3导致负维度大小


有什么方法可以正确输入吗?

据我所知,1D卷积层接受Batchsize x Width x Channel形式的输入。您正在使用

X\u-train=np.重塑(X\u-train,(1,X\u-train.shape[0],X\u-train.shape[1])


但是
X\u train.shape[0]
是你的批量大小我想。我想问题就在这里。在重塑之前,你能告诉我X_系列的形状是什么吗?

你必须考虑你的数据在339732个条目或29个特征之间是否存在某种累进关系,这意味着顺序是否重要。如果不是,我认为CNN不适合这个案子

如果29个特征“表明某事的进展”:

X_train=X_train.重塑((X_train.形状[0],X_train.形状[1],1))

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

X_-train=X_-train.reformate((X_-train.shape[0],1,X_-train.shape[1]))

如果要在顺序重要的块中选择339732项(剪裁339732或添加零填充以使其可被时间步整除),请执行以下操作:

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


重塑前,X_列车的形状为(339732,29)。此外,在序列情况下,信道的可能值是多少?(这仅仅对图像来说是有意义的吗?)好的,那么你要做的就是给CNN提供一个长度为29的向量。339732这样的向量存在。你可以把它们想象成一幅高1、宽29、通道1的图像。CNN2D输入形状将为(1,29,1)as(行、列、通道)。CNN1D输入形状应为(29,1)。请将CNN1D的X_列车重塑为(339732 X 29 X 1),如果您使用的是CNN2D,请将其重塑为(339732 X 1 X 29 X 1)。这应该行得通。这样做了,给出了错误:
ValueError:检查模型输入时出错:预期conv1d_1_输入具有形状(无,339732,29),但获得了具有形状(339732,29,1)的数组。
My bad。将输入形状调整为
(29,1)
就可以了!