【问题标题】:How does a 1D multi-channel convolutional layer (Keras) train?一维多通道卷积层 (Keras) 如何训练?
【发布时间】:2018-04-09 09:15:26
【问题描述】:

我正在处理从身体 10 个单独位置记录的时间序列 EEG 数据,以根据增加的心脏活动对未来行为进行分类。我想更好地了解我的标记数据如何对应于训练输入。

到目前为止,几种 RNN 配置以及无数香草密集网络组合都没有给我带来很好的结果,我认为一维卷积网络值得一试。

我无法理解的事情是:

1.) 将数据输入模型。

orig shape         = (30000 timesteps, 10 channels)  
array fed to layer = (300 slices, 100 timesteps, 10 channels) 

这些切片是由 1 个时间步长分开,在原始数组的任一端给我 300 个时间步长切片,还是它们是端到端分开的?如果第二个是真的,我怎么能创建一个由一个 ts 分隔的(30000 - 100)个切片数组,并且还与 1D CNN 层兼容?

2) 将标签与训练和测试数据匹配

我的理解是,当您输入一系列train_x_shape = (30000, 10) 时,有30000 个标签与train_y_shape = (30000, 2)(2 个类)与train_x 数据相关联。

所以,当(300 片)100 个时间步的train_x 数据和shape = (300, 100, 10) 被输入到模型中时,标签值是否对应于整个 100 ts(每 100 ts 一个标签,此标签等于到最后一个时间步的标签),或者切片中的每 100 行/向量是否标记为每个 ts 一个?

训练输入:

train_x = train_x.reshape(train_x.shape[0], 1, train_x.shape[1])  
n_timesteps = 100 
n_channels  = 10
layer : model.add(Convolution1D(filters = n_channels * 2, padding = 'same', kernel_size = 3, input_shape = (n_timesteps, n_channels))) 
final layer : model.add(Dense(2, activation = 'softmax'))  

我使用categorical_crossentropy 表示损失。

【问题讨论】:

  • 请提供代码。到目前为止,您尝试过什么?
  • 我已经编辑了上面的帖子

标签: tensorflow keras conv-neural-network


【解决方案1】:

回答 1

这真的取决于“你是如何得到这些切片的”?
答案完全取决于“你在做什么”。那么,你想要什么?

如果您只是简单地将原始数组从形状 (30000,10) 重新整形 (array.reshape(...)) 到形状 (300,100,10),模型将看到:

  • 300 个单独(且未连接)序列
  • 每个序列有 100 个时间步长

序列1从步骤0到299; 序列 2 从步骤 300 到 599 等等。

创建重叠切片 - 滑动窗口

如果您想创建仅移动一个时间步长的序列,请为此创建一个循环。

import numpy as np

originalSequence = someArrayWithShape((30000,10))  
newSlices = [] #empty list

start = 0
end = start + 300

while end <= 30000:
    newSlices.append(originalSequence[start:end])
    start+=1
    end+=1

newSlices = np.asarray(newSlices)

注意:如果您在输入数据中执行此操作,您也必须在输出数据中执行类似操作。

答案2

同样,这完全取决于您。你想达到什么目标?

卷积层将使用这些选项保持时间步长:

  • 如果使用padding='same',最终长度会和输入一样
  • 如果不这样做,最终长度将根据您选择的内核大小而减少

循环层是否保持时间步长取决于:

  • 无论你使用return_sequences=True - 输出都有时间步长
  • 或者你使用return_sequences=False - 输出没有时间步长

如果您只想为每个序列(而不是每个时间步)输出一个输出:

循环模型:

  • 使用LSTM(...., return_sequences=True) 直到最后一个 LSTM
  • 最后一个 LSTM 将是LSTM(..., return_sequences=False)

卷积模型

在卷积之后的某个时间点,选择其中一个进行添加:

  • GlobalMaxPooling1D
  • GlobalAveragePooling1D
  • Flatten(但稍后使用 Dense(2) 处理通道数
  • Reshape((2,))

如果使用卷积,我想我会选择 GlobalMaxPooling2D,但循环模型似乎更适合这个。 (虽然不是规则)。

您可以选择使用中间的MaxPooling1D 层,将长度从 100 逐渐减少到 50,然后再减少到 25,依此类推。这可能会达到更好的输出。


记得保持 X 和 Y 配对:

import numpy as np

train_x = someArrayWithShape((30000,10))  
train_y = someArrayWithShape((30000,2))
newXSlices = [] #empty list
newYSlices = [] #empty list

start = 0
end = start + 300

while end <= 30000:
    newXSlices.append(train_x[start:end])
    newYSlices.append(train_y[end-1:end])
    start+=1
    end+=1

newXSlices = np.asarray(newXSlices)
newYSlices = np.asarray(newYSlices)

【讨论】:

  • 感谢您的回复,我意识到我的帖子不太清楚,需要一些格式,所以如果您想再看一遍,我编辑了它
  • 您完美地回答了第一个问题,但对于第二个问题,我仍然不确定切片中的每个时间步如何对 CNN 的学习过程做出贡献
  • 由您选择。你希望他们参加还是不参加?如果您将它们留在输出中,它们将做出贡献,如果您不这样做(可能通过使用展平或重塑层),则只有最终结果将参与。这完全是您的选择。
  • 目前,我不希望输出中包含切片中的任何时间步,只希望整个时间步序列,并且我只希望将切片的最终 ts 的标签指定给整片。本质上,我期望网络在几个 100 ts 的序列上进行训练,并将一个标签(在最后一句中定义)与每个切片的网络的计算和其他内部工作相关联。我的输入设置是否正确,以便网络输出我描述的内容?
  • 像魅力一样工作,谢谢!形状是 train_x.shape = (30000, 300, 10) 和 train_y.shape = (30000, 1, 2) 只是彻底-我当前的层设置是: Input > Conv1D + MaxPool1D + BatchNorm + LeakyReLU + Dropout > Conv1D + MaxPool1D + BatchNorm + LeakyReLU + Dropout > Dense(2) + SoftMax > Cat_Cross_Ent > Fit 。我将在未来测试 TimeDistributed CNN 层以及 LSTM 和 GRU,但对于这个 Conv1D 示例,您建议我在最后(在最后的 Dense(2) 层之前)加入 GlobalMaxPooling2D 或扁平层处理中间时间步?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
相关资源
最近更新 更多