繁体   English   中英

我对keras conv1D图层的输入应该是什么?input_shape应该是什么?

[英]What should my input to a keras conv1D layer be and what should the input_shape be?

注意:第一次发帖。 我试图在我的描述中彻底

我一直在尝试按照本教程设置我认为非常简单的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)

如keras doc中给出的,对于Conv1D ,例如input_shape=(10, 128)用于10个时间步长的时间序列序列,每步具有128个特征。

因此,对于您的情况,因为您有1个特征的600个时间步长,它应该是input_shape=(600,1)

你也需要养活你的标签y的为独热编码。

工作代码

来自keras.utils import 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM