我有一个包含339732行和两列的csv文件:
第二个是二进制标签值,即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]。
有没有办法正确输入我的输入?
答案 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))