我有 3 个类的时间序列数据(每个类为 35 秒),因为我每 1 秒提取 95 个特征,因此我的最终数据具有形状(105,95)(时间行和特征列)。
我目前正在为分类 3 类构建 1D-CNN 模型。但我被困在 Conv1D 的第一层。我了解到 Convd1D 的 input_shape 是 (batch_size, new_step, input_dim) 但老实说我不知道每个元素的确切含义以及如何将输入数据修改(重塑)为 Conv1D 图层形状?
还有一个问题,我知道 CNN 需要固定的输入大小。但是我将数据拆分为训练数据和验证数据,因为 k 参数 = 5,这意味着我的数据将变为:训练 = (84,95) 和验证 = (21,95)。那么使用相同的模型,我们如何训练和验证不同大小的数据呢?
我刚开始学习CNN,但还不知道Conv1D是如何运作的?
我很感激你的帮助。
非常感谢你。
听到是我的代码(由于第一个 Conv1D input_shape 仍然会出错):
X = dataset[:, 0:95].astype(float)
Y = dataset[:, 95].astype(int)
# Encode class values as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoder_Y = encoder.transform(Y)
y = np_utils.to_categorical(encoder_Y)
acc_per_fold = []
loss_per_fold = []
fold_no = 1
kfold = KFold(n_splits = 5, shuffle = True)
for train, test in kfold.split(X,y):
model = Sequential()
model.add(Conv1D(100, 3, activation = 'relu', input_shape = (I really dont know what to put in here??))
model.add(Conv1D(100, 3, activation = 'relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(150, 3, activation = 'relu'))
model.add(Conv1D(150, 3, activation = 'relu'))
model.add(GlobalAveragePooling1D())
model.add(Dense(3, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
#model.summary()
print('------------------------------------------------------------------------------')
print(f'Training for {fold_no}...')
history = model.fit(X[train], y[train], batch_size = 7, epochs = 150, verbose = 1)
scores = model.evaluate(X[test], y[test], verbose = 0)
print(f'Score for fold {fold_no}: {model.metrics_names[0]} of {scores[0]}; {model.metrics_names[1]} of {scores[1]*100}%')
acc_per_fold.append(scores[1] * 100)
loss_per_fold.append(scores[0])
# Increase fold number
fold_no = fold_no + 1