我正在处理身体上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
作为损失。
答案 0 :(得分:1)
这真的取决于“你是怎么得到这些切片的”? 答案完全取决于“你在做什么”。所以你想要什么?
如果您只是将原始数组从形状array.reshape(...)
重新整形((30000,10)
)到形状(300,100,10)
,模型将会看到:
序列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)
注意:如果您在输入数据中执行此操作,则还必须在输出数据中执行类似的操作。
同样,这完全取决于你。你想要达到什么目标?
卷积层将使用这些选项保持时间步长:
padding='same'
,则最终长度将与输入循环图层将保持时间步长与否:取决于:
return_sequences=True
- 输出具有时间步长return_sequences=False
- 输出没有时间步骤经常性模特:
LSTM(...., return_sequences=True)
直到最后一个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)