【问题标题】:Input shape for 1D convolution network in keraskeras 中一维卷积网络的输入形状
【发布时间】:2020-02-14 22:26:10
【问题描述】:

我对 keras 很陌生,我在理解形状方面有问题。

我想按如下方式创建 1D Conv Keras 模型,我不知道这是否正确:

TIME_PERIODS = 511
num_sensors = 2
num_classes = 4
BATCH_SIZE = 400
EPOCHS = 50
model_m = Sequential()
model_m.add(Conv1D(100, 10, activation='relu', input_shape=(TIME_PERIODS, num_sensors)))
model_m.add(Conv1D(100, 10, activation='relu'))
model_m.add(MaxPooling1D(3))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(Conv1D(160, 10, activation='relu'))
model_m.add(GlobalAveragePooling1D())
model_m.add(Dropout(0.5))
model_m.add(Dense(num_classes, activation='softmax'))

我拥有的输入数据是 888 个不同的熊猫数据帧,其中每个帧的形状为 (511, 3),其中 511 是信号点的数量,第 0 列是传感器 1 值,第 1 列是传感器 2 值,第 2 列是标记的信号.

现在我应该如何组合我所有的 888 个不同的熊猫数据框,以便我使用 Sklearn train_test_split 从 X 和 Y 获得 x_train 和 y_train。

另外,我认为我为模型定义的输入形状是错误的,我认为我实际上没有 TIME_PERIODS,因为对于 1 个时间点,我有 2 个传感器输入(橙色、蓝色 行)值和 1 个输出标签(green 行)。

我试图解决的问题的背景,例如 输入:基于时间的 2 个传感器值表示用户从凌晨 1 点到凌晨 2 点,输出:时间范围,例如用户在 1:10-1:15 进行活动 1、活动 2、活动 X 的时间范围、1 :15-1:30, 1:30-2:00, 上图显示了训练输入和输出的示例。

这个问题的灵感来自here,但就我而言,我没有任何时间段,我的 1 时间点有 1 个输出标签。

更新 1: 我几乎可以肯定我的 TIME_PERIODS=1 对于预测我将给出 511 个输入并期望得到 511 个输出值。

【问题讨论】:

    标签: keras conv-neural-network


    【解决方案1】:

    每个数据帧都是一个独立的序列?

     fileNames = get a list of filenames here, you can maybe os.listdir for that
     allFrames = [pandas.read_csv(filename,... other_things...).values for filename in fileNames]
    
    
     allData = np.stack(allFrames, axis=0)
     inputData = allData[:,:num_sensors]
     outputData = allData[:, -1:]
    

    您现在可以按照自己的方式使用训练测试拆分。 您输入的形状是正确的。


    如果要预测整个序列,则必须删除池。每个卷积都应该使用padding='same'

    也许您应该在某处使用Biridectional(LSTM(units, return_sequences=True)) 层以使您的模型更强大。


    以一个简单的模型为例。 (请注意,模型对创造力完全开放)

    from keras.layers import *
    
    inputs = Input((TIME_PERIODS,num_sensors)) #Should be called "time_steps" to be precise
    outputs = Conv1D(any, 3, padding='same', activation = 'tanh')(inputs)
    outputs = Bidirectional(LSTM(any, return_sequences=True))(outputs)
    outputs = Conv1D(num_classes, activation='softmax', padding='same')(outputs)
    
    model = keras.models.Model(inputs, outputs)
    

    【讨论】:

    • 我认为形状不正确。我有 4 个输出类,我想找出与我的情节图片相似的 511 个点中的每一个的预测类。将 511 视为时间滴答。
    • 然后删除池,始终使用padding='same'。并且可能切换到循环网络。
    • 你能否提供一个关于你所说的非常简单的模型。第一个 1DConv 层的输入形状是什么?
    • 就是这样,一个混合 Conv 和 LSTM 的简单模型
    【解决方案2】:

    至少可以说,您走的是正确的道路。完整的解决方案是,

    df = pd.concat([pd.read_csv(fname, index_col=<int>, header=<int>) for f filenames], ignore_index=True, axis=0)
    
    inputs = df.loc[:,:-1]
    labels = df.loc[:,0]
    
    X_train, X_test, y_train, y_test = train_test_split(inputs, labels, test_size=<float>)
    

    要添加更多信息,请注意您的操作方式,

    model_m.add(Conv1D(100, 10, activation='relu', input_shape=(TIME_PERIODS, num_sensors)))
    

    而不是

    model_m.add(Conv1D(100, 10, activation='relu', padding='SAME', input_shape=(TIME_PERIODS, num_sensors)))
    

    因此,由于您没有为卷积层设置 padding="Same",这可能会产生不良影响,即随着您对模型的深入研究,输入会变得越来越小。如果这是你需要的,那没关系。否则,设置 `padding="SAME"。

    例如,如果没有相同的填充,当你到达GlobalPooling 层时,你会得到一个大约144 的宽度,如果你使用相同的填充,它大约是170。这不是一个主要问题,但很容易导致输入中为更深层次的负大小。

    【讨论】:

    • 我认为形状不正确。我有 4 个输出类,我想找出与我的情节图片相似的 511 个点中的每一个的预测类。将 511 视为时间滴答。
    • @RoshanMehta 那么您可能将其建模为时间序列问题(即使用 LSTM)。你为什么首先使用卷积过滤器?
    • 因为我读到了关于使用 CNN 进行人类活动识别的文章,它工作得很好,但在这些问题中,有一个时间段对应一个标签,但在我的情况下,我实际上没有任何时间段。我有 2 个输入,想要一个输出。
    • 你能分享你看到这个的论文/资源吗?根据我的经验,基于深度学习的活动识别总是使用一些 LSTM/RNN 组件(例如 LSTM / ConvLSTM)
    猜你喜欢
    • 2016-12-04
    • 2019-09-09
    • 1970-01-01
    • 2018-01-24
    • 2017-07-30
    • 2017-08-31
    • 2020-05-26
    • 2018-02-28
    • 2018-06-16
    相关资源
    最近更新 更多