一维多通道卷积层(Keras)如何训练?

时间:2018-04-09 09:15:26

标签: tensorflow keras conv-neural-network

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

到目前为止,一些RNN配置以及无数香草密集网络的组合并没有给我带来很好的结果,而且我认为1D的网络是值得一试的。

我理解困难的事情是:

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作为损失。

1 个答案:

答案 0 :(得分:1)

答案1

这真的取决于“你是怎么得到这些切片的”? 答案完全取决于“你在做什么”。所以你想要什么?

如果您只是将原始数组从形状array.reshape(...)重新整形((30000,10))到形状(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)

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

ANSWER2

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

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

  • 如果您使用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,))

我认为如果使用convoltions我会使用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)