繁体   English   中英

当我们尝试拟合熊猫数据帧中的数据时,如何找到卷积神经网络的 input_shape?

[英]How to find input_shape of Convolutional Neural Network when we are trying to fit the data from pandas dataframe?

我有一个包含 321 个样本和 43 个特征的 Pandas 数据框 X_train。 此外,y_train 中有 18 个不同的类。

在此处输入图片说明

强文本我想在我的数据上训练一个 CNN,但我无法在 Pandas 数据帧的情况下提供输入形状。

X.shape, y.shape
((321, 43), (321,))

X = np.array(X)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0, stratify = y)

X_train.shape, X_test.shape
((256, 43), (65, 43))

inputs = np.concatenate((X_train, X_test), axis=0)
targets = np.concatenate((y_train, y_test), axis=0)

inputs.shape, targets.shape
((321, 43), (321,))

在我模型的第一层中,我在使用 input_shape 时遇到了问题。

我是 CNN 的新手,所有教程都使用了图像,它们只是将高度、宽度和通道作为 input_shape 的参数传入。

fold_no = 1
for train, test in kfold.split(inputs, targets):

    model = Sequential()
    **model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(???)))**
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
    model.add(MaxPooling1D(pool_size=2))
    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dense(18, activation='softmax'))

    model.compile(optimizer=Adam(learning_rate = 0.001), 
                                 loss = 'sparse_categorical_crossentropy', 
                                 metrics = ['accuracy'])

    history = model.fit(inputs[train], targets[train], batch_size=5, epochs=50, validation_split=0.2, verbose=1)

    scores = model.evaluate(inputs[test], targets[test], verbose=0)
    
    fold_no = fold_no + 1

我在第一层遇到 input_shape 问题:

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(???)))

我尝试将输入形状设置为以下格式:

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(None, train.shape[1])))

但我收到以下错误:

在此处输入图片说明

我也试过这种方式:

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(321, 43)))

然后我收到以下错误: 在此处输入图片说明

我还尝试了以下格式:

model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(None, 43)))

然后我收到以下错误: 在此处输入图片说明

Conv1D 将 3D 形状作为 input ,但第一个维度是批量大小,因此您可以将其忽略为input_shape 其他 2 个维度是 (steps, input_dim)。

在处理数字或文本数据时,两个维度通常是 (a) 您希望 CNN 层一次处理多少连续行,(b) 行中有多少特征。 如果您的数据自然地被分割成特定长度(可能是 24,一天中的几个小时,或三元组中的 3 个单词),您将需要专门设置steps维度。 它还会影响您的输出形状,即(steps-kernel_size+1, filters) 尝试使用一些不同的形状并查看模型摘要以了解它们是如何变化的。

但正如文档所说,您也可以使用None作为您的步骤,例如(None, 128) for variable-length sequences of 128-dimensional vectors

所以基本上,我建议这样做, inputs[train].shape[1]应该是43:

input_shape=(None, inputs[train].shape[1])

您还可以尝试完整长度的数据集,例如 (321, 43):

input_shape=inputs[train].shape

看看这个优秀的答案这篇文章,以获得关于 Conv1D 如何处理数字/文本输入的良好视觉直觉。

张量 =1D 样本或数据点有多少个数字或特征 = 和样本数。

在这种情况下

样本1或向量=[x0,x1,x2,...,yst​​ando],样本总数为:321,特征总数=31,将有张量的input_shape=(321,43)

暂无
暂无

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

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