我对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个输出标签(绿色行)。
我要解决的问题的背景,例如 输入:基于时间的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个输出值。
答案 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} }。在这里这不是主要问题,但是对于较深的图层,很容易导致输入中的值为负数。