【问题标题】:How do I reshape input layer for Conv1D in Keras?如何在 Keras 中重塑 Conv1D 的输入层?
【发布时间】:2020-06-30 08:12:33
【问题描述】:

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

为什么要求 (10,5) 的形状?它甚至从哪里得到这个数字? 我的印象是输入数据的形状应该是 ("sample_size", "steps or time_len", "channels or feat_size") => (3809, 49, 5)。

我也觉得 Conv1D 层的输入形状应该是(“steps or time_len”,“channels or feat_size”)。

我是不是误会了什么?

我的输入数据如下所示:

总共有 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())

我收到此错误: 打印出层

【问题讨论】:

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


【解决方案1】:

你被 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)

相反!注意,因为这个形状是在reshape之后调用的,所以它已经引用了正确的形状,时间维度除以5。

【讨论】:

  • 哇,我真是个白痴。你说的对。我以为我要疯了
【解决方案2】:

您正在使用Conv1D,但尝试通过重塑以二维形式表示您的数据 - 这会产生问题。尝试通过重塑跳过部分,因此您的输入将是 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))

【讨论】:

  • 这是不正确的。他们正在将数据重塑为 3D、批次 x 时间 x 特征,这是Conv1D 所需的格式。
  • @xdurch0 我也有这种印象(conv1d 必须用“2d”表示,conv2d 必须用“3d”表示)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2017-12-12
  • 1970-01-01
  • 2018-09-12
  • 2021-12-31
  • 2019-12-28
  • 1970-01-01
相关资源
最近更新 更多