我知道当我们有几张按时间顺序排列的图像来检测运动、动作、方向等时,会使用“时间分布”层。但是,我使用频谱图进行语音分类。每个语音都被转换成一个频谱图,稍后将被馈送到神经网络进行分类。所以我的数据库是 2093 RGB 图像(100x100x3)的形式。现在我使用了一个 CNN,输入是
x_train = np.array(x_train).reshape(2093,100,100, 3)
每件事都很好。
但是现在,我想使用 CNN+BLSTM(类似于下图,取自本文),这意味着我将需要时间步长。所以,每个图像都应该被分成更小的帧。
问题是,如何准备数据来做这样的事情?
假设我想将每个图像分成 10 帧(时间步长)。我应该重塑数据吗
x_train = np.array(x_train).reshape(2093,10,10,100, 3)
哪个工作得很好,但我不确定这是否正确,或者还有其他方法可以做到这一点?
这是我正在使用的模型
model = tf.keras.Sequential([
tf.keras.layers.TimeDistributed(tf.keras.layers.Conv2D(filters=64, kernel_size=2, padding='same', activation='relu', input_shape=(100,100,3),name="conv1")),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.TimeDistributed(tf.keras.layers.MaxPooling2D(pool_size=2)),
tf.keras.layers.TimeDistributed(tf.keras.layers.Conv2D(filters=128, kernel_size=2, padding='same', activation='relu')),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.TimeDistributed(tf.keras.layers.MaxPooling2D(pool_size=2)),
tf.keras.layers.TimeDistributed(tf.keras.layers.Conv2D(filters=256, kernel_size=2, padding='same', activation='relu')),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.TimeDistributed(tf.keras.layers.MaxPooling2D(pool_size=2)),
tf.keras.layers.TimeDistributed(tf.keras.layers.Flatten()),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64)),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Dense(200, activation="relu"),
tf.keras.layers.Dense(10, activation= "softmax")
])
通过使用以前的模型,我得到了 47% 的训练准确率和 46% 的验证准确率,但是仅使用 CNN 我得到了 95% 的训练和 71% 的验证,谁能给我一个提示如何解决这个问题?