keras中一维卷积网络的输入形状

keras中一维卷积网络的输入形状,keras,conv-neural-network,Keras,Conv Neural Network,我是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)))

我是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

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

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

这个问题的灵感来自于,但在我的例子中,我没有任何时间段,我的1个时间点有1个输出标签

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

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

 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:]
现在,您可以按自己的方式使用train test split。 您的输入形状是正确的


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

也许你应该在某处使用一个
双向层(LSTM(units,return_sequences=True))
来增强你的模型


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


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

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', padding='SAME', input_shape=(TIME_PERIODS, num_sensors)))
因此,由于您没有为卷积层设置
padding=“Same”
,这可能会产生不希望的效果,即当您深入模型时,输入变得越来越小。如果那是你需要的,没关系。否则,设置'padding=“SAME”


例如,如果没有相同的填充,当您到达
GlobalPooling
层时,将得到大约为
144
的宽度,如果使用相同的填充,则大致为
170
。这不是一个大问题,但很容易导致输入的深层尺寸为负值。

我认为形状不正确。我有4个输出类,我想找出511个点中每个点的预测类,类似于我的绘图。将511看作时间刻度。然后删除池,始终使用
padding='same'
。你能提供一个关于你所说的非常简单的模型吗。第一个1DConv层的输入形状是什么?就是这样,一个简单的模型混合了Conv和LSTMI,但它不认为形状是正确的。我有4个输出类,我想找出511个点中每个点的预测类,类似于我的绘图。将511视为时间刻度。@RoshanMehta那么您可能将其建模为一个时间序列问题(即使用LSTM)。你为什么首先使用卷积滤波器?因为我读到关于使用CNN的人类活动识别,它工作得很好,但在这些问题中,有一个时间段对应于一个标签,但在我的例子中,我实际上没有任何时间段。我有两个输入,想要一个输出。你能分享你在上面看到的文件/资源吗?根据我的经验,基于深度学习的活动识别总是使用一些LSTM/RNN组件(例如LSTM/CONVLSM)来完成
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)))