如何在Keras中为Conv1D重塑输入层?

时间:2020-06-30 08:12:33

标签: tensorflow machine-learning keras conv-neural-network tf.keras

我已经查看了各种回复,但是我不明白为什么我会不断得到(10,5)。

为什么要求形状为(10,5)?从哪儿得到那个号码? 我的印象是输入数据的形状应为(“ sample_size”,“ steps或time_len”,“ channels或feat_size”)=>(3809、49、5)。

我也给Conv1D图层输入形状(“ steps or time_len”,“ channels or feat_size”)印象。

我误会了吗?

我的输入数据如下所示: enter image description here

共有49天,每天5个数据点。样本总数为5079。 75%的数据用于培训,25%的数据用于验证。 10个可能的预测输出答案。

x_train, x_test, y_train, y_test = train_test_split(np_train_data, np_train_target, random_state=0)
print(x_train.shape)
x_train = x_train.reshape(x_train.shape[0], round(x_train.shape[1]/5), 5)
x_test = x_test.reshape(x_test.shape[0], round(x_test.shape[1]/5), 5)
print(x_train.shape)
input_shape = (round(x_test.shape[1]/5), 5)

model = Sequential()
model.add(Conv1D(100, 2, activation='relu', input_shape=input_shape))
model.add(MaxPooling1D(3))
model.add(Conv1D(100, 2, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(49, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    
model.fit(x_train, y_train, batch_size=64, epochs=2, validation_data=(x_test, y_test))
print(model.summary())

我收到此错误: enter image description here 打印出图层 enter image description here

2 个答案:

答案 0 :(得分:0)

您正在使用Conv1D,但是尝试通过重塑以2D形式表示数据-这会造成问题。尝试通过重塑跳过该部分,因此您的输入将是1行,具有49个值:

x_train, x_test, y_train, y_test = train_test_split(np_train_data, np_train_target, random_state=0)
print(x_train.shape)
input_shape = (x_test.shape[1], 1)

model = Sequential()
model.add(Conv1D(100, 2, activation='relu', input_shape=input_shape))
model.add(MaxPooling1D(3))
model.add(Conv1D(100, 2, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(49, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(x_train, y_train, batch_size=64, epochs=2, validation_data=(x_test, y_test))

答案 1 :(得分:0)

您被5除以两次。在这里,您正在重塑数据,与其他答案相反,这是必需的

x_train = x_train.reshape(x_train.shape[0], round(x_train.shape[1]/5), 5)
x_test = x_test.reshape(x_test.shape[0], round(x_test.shape[1]/5), 5)

这已经解决了“将时间除以5”的问题。但是在这里,您要定义模型的输入形状,然后再除以5:

input_shape = (round(x_test.shape[1]/5), 5)

只需使用

input_shape = (x_test.shape[1], 5)

相反!请注意,由于此形状是在重塑之后调用的,因此它已经指向正确的形状,时间维度除以5。