喀拉拉邦一维卷积网络的输入形状

时间:2020-02-14 22:26:10

标签: keras conv-neural-network

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

我想按如下方式创建一维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列是sensor1的值,第1列是sensor2的值,第二列是标记的信号

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

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

enter image description here

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

该问题是由here引起的,但就我而言,我没有任何时间段,我的1时间点有1个输出标签。

更新1: 我几乎可以肯定的是,我的TIME_PERIODS = 1表示我将给出511个输入,并期望获得511个输出值。

2 个答案:

答案 0 :(得分:0)

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

 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)

答案 1 :(得分:0)

至少可以说,您所走的路正确。完整的解决方案就像

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”。

例如,如果没有相同的填充,则到达144层时将得到GlobalPooling左右的宽度,如果使用相同的填充,则大约为{{1} }。在这里这不是主要问题,但是对于较深的图层,很容易导致输入中的值为负数。