注意:首次发布。我已经尽全力描述
我一直在尝试通过遵循本教程来设置我认为非常简单的CNN: https://machinelearningmastery.com/cnn-models-for-human-activity-recognition-time-series-classification/
我的Xtrain数据集是一个时间序列,是一个numpy数组,具有34396行(样本)和600列(时间步长)。我的Ytrain数据集只是一个包含标签0、1或2(以整数为单位)的数组。我只是想使用CNN进行多分类。
我遇到了类似这样的错误
输入0与层conv1d_39不兼容:找到预期的ndim = 3 ndim = 4
input_shape=(n_timesteps,n_features,n_outputs)
时
或
检查输入时出错:预期conv1d_40_input具有3 尺寸,但数组的形状为(34396,600)
input_shape=(n_timesteps,n_features)
时
我已经在网上搜索了几个小时,但似乎找不到解决我问题的方法。我认为这与我的数据格式和input_shape值有关,是一个简单的问题,但我无法对其进行修复。
我尝试将input_shape设置为
(None, 600, 1)
(34396,600, 1)
(34396,600)
(None,600)
在其他各种组合中。
train_df = pd.read_csv('training.csv')
test_df = pd.read_csv('test.csv')
x_train=train_df.iloc[:,2:].values
y_train=train_df.iloc[:,1].values
x_test=train_df.iloc[:,2:].values
y_test=train_df.iloc[:,1].values
n_rows=len(x_train)
n_cols=len(x_train[0])
def evaluate_model(trainX, trainy, testX, testy):
verbose, epochs, batch_size = 0, 10, 32
n_timesteps, n_features, n_outputs = trainX.shape[0], trainX.shape[1], 3
print(n_timesteps, n_features, n_outputs)
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features,n_outputs)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit network
model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose)
# evaluate model
_, accuracy = model.evaluate(testX, testy, batch_size=batch_size, verbose=0)
return accuracy
evaluate_model(x_train,y_train,x_test,y_test)
答案 0 :(得分:0)
对于角逐doc,对于Conv1D
,例如input_shape=(10, 128)
,对于10个时间步长的时间序列,每步128个特征。
因此对于您的情况,由于您有600个时间步长,因此每个功能均应为input_shape=(600,1)
。
此外,您还必须将标签y
进行一次热编码。
从keras.utils导入to_categorical
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(600,1)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'])
x = np.random.randn(100,600)
y = np.random.randint(0,10, size=(100))
# Reshape to no:of sample, time_steps, 1 and convert y to one hot encoding
model.fit(x.reshape(100,600,1), to_categorical(y))
# Same as model.fit(np.expand_dims(x, 2), to_categorical(y))
Epoch 1/1
100/100 [===========================] - 0s 382us/step - loss: 2.3245 - acc: 0.0800