层 conv1d_1 的输入 0 与该层不兼容:预期 ndim=3,发现 ndim=2。收到完整形状:[无,200]

Ale*_*sev 2 python neural-network conv-neural-network keras tensorflow

我正在开发能够预测 10 秒音频文件中有趣时刻的应用程序。我将音频分成 50 毫秒的块并提取音符,因此每个示例有 200 个音符。当我添加卷积层时,它返回一个错误:

ValueError:层 conv1d_1 的输入 0 与该层不兼容:预期 ndim=3,发现 ndim=2。收到完整形状:[无,200]

这是我的代码:

def get_dataset(file_path):
  dataset = tf.data.experimental.make_csv_dataset(
      file_path,
      batch_size=12,
      label_name='label',
      na_value='?',
      num_epochs=1,
      ignore_errors=False)
  return dataset

train = get_dataset('/content/gdrive/My Drive/MyProject/train.csv')
test = get_dataset('/content/gdrive/My Drive/MyProject/TestData/manual.csv')
feature_columns = []

for number in range(200):
  feature_columns.append(tf.feature_column.numeric_column('note' + str(number + 1) ))

preprocessing_layer = tf.keras.layers.DenseFeatures(feature_columns)

model = tf.keras.Sequential([
    preprocessing_layer,
    tf.keras.layers.Conv1D(32, 3, padding='same', activation=tf.nn.relu, input_shape=[None, 200]),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(50, activation=tf.nn.relu),
    tf.keras.layers.Dense(1, activation=tf.nn.sigmoid)
])
model.compile(
    loss='binary_crossentropy',
    optimizer='adam',
    metrics=['accuracy'])
model.fit(train, epochs=20)
Run Code Online (Sandbox Code Playgroud)

是什么原因导致此问题以及如何解决?

gor*_*jan 5

序列上的 1D 卷积需要 3D 输入。换句话说,对于批次中的每个元素,对于每个时间步,都有一个向量。考虑以下:

X = tf.random.normal([10, 200])
convolved = tf.keras.layers.Conv1D(32, 3, padding='same', activation=tf.nn.relu, input_shape=[None, 200])
print(convolved(X))
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

ValueError:层 conv1d_3 的输入 0 与该层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[10, 200]

然而,如果我们为 10 个批次样本中的每一个、5 个时间步中的每一个提供一个 200 维向量:

X = tf.random.normal([10, 5, 200])
convolved = tf.keras.layers.Conv1D(32, 3, padding='same', activation=tf.nn.relu, input_shape=[None, 200])
print(convolved(X)
Run Code Online (Sandbox Code Playgroud)

这按其应该的方式工作。因此,在您的情况下,对于每个音频文件,每秒(取决于您对数据进行采样的方式),您将拥有一个向量。