我有一个数据集,其中包含900个视频,长度在1s-30s之间,用于情感分类。使用OpenFace库,我从每个帧中提取了一组功能(总共714个功能,其中我使用了49个),并将这些值存储在.csv文件中。样本视频的.csv文件如下所示:
我要做的是,如果一个文件包含30多个帧,则将其分为多个.csv文件,以便每个文件最多包含30帧,并将该文件的路径存储在单独的位置.csv文件称为train_data.csv,并根据显示的情感对其进行了标记。看起来像这样:
因此,上图中看到的11个文件实际上是从主文件1-1-1.csv中分离出来的,该文件共有323帧,我根据视频中显示的情感将它们全部标记为
我已经对数据集中的所有视频进行了此过程,现在我最初拥有的900个视频中有2615个样本。我已将此数据加载到名为x_train
的变量中,该变量的形状为(2615, 30, 49)
,y_train
的形状为(2615, 6)
(因为我有6种情绪需要分类) 。 x_val
的形状为(738, 30, 49)
,y_val
的形状为(738, 6)
。
当我在以下模型上训练此数据时,我似乎只获得了34%的准确性。我觉得这是由于数据集的结构以及将数据传递给模型的方式所致。我还感到另一个原因可能是由于我的模型的结构无法像我一样处理时间序列数据。
model5 = Sequential(name='model 5')
model5.add(Conv1D(32, 2, padding='same', strides=1, activation='tanh', input_shape=(no_ts, no_fs)))
model5.add(Dropout(0.3))
model5.add(Conv1D(16, 2, padding='same', strides=1, activation='tanh'))
model5.add(Dropout(0.3))
# model5.add(Conv1D(24, 3, strides=2, activation='relu'))
# model5.add(Dropout(0.3))
model5.add(Dense(8, activation='relu'))
model5.add(CuDNNLSTM(64, return_sequences=True))
model5.add(CuDNNLSTM(64, return_sequences=True))
model5.add(Conv1D(16, 2, padding='same', strides=1, activation='tanh'))
model5.add(Conv1D(32, 2, padding='same', strides=1, activation='tanh'))
model5.add(AveragePooling1D(16))
model5.add(Flatten())
model5.add(Dense(5, activation=tf.nn.softmax, name='result'))
model5.compile(optimizer='adam', loss=tf.keras.losses.CategoricalCrossentropy(), metrics = ["accuracy"])
model5.fit(x_train, y_train, batch_size=10, epochs=50, validation_data=(x_val, y_val))
no_ts
表示帧数,在这种情况下为30
。 no_fs
代表特征数49
。总而言之,我想知道数据集的结构方式是否正确,将数据传递给模型的方式是否正确以及建议的模型是否可以使用我拥有的数据。