如何在 Keras 中重塑 Conv1D 的输入层?
How do I reshape input layer for Conv1D in Keras?
我已经查看了各种回复,但我不明白为什么我总是得到 (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())
我收到这个错误:
分层打印
您正在使用 Conv1D
,但尝试通过重塑以 2D 形式表示您的数据 - 这会产生问题。尝试跳过整形部分,因此您的输入将是具有 49 个值的 1 行:
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))
你被 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。
我已经查看了各种回复,但我不明白为什么我总是得到 (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())
我收到这个错误:
您正在使用 Conv1D
,但尝试通过重塑以 2D 形式表示您的数据 - 这会产生问题。尝试跳过整形部分,因此您的输入将是具有 49 个值的 1 行:
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))
你被 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。