我正在开发应预测10秒音频文件中有趣时刻的应用程序。我将音频分割为50ms的块并提取了音符,因此每个示例都有200个音符。当我添加卷积层时,它将返回错误:
ValueError:conv1d_1层的输入0与该层不兼容: 预期ndim = 3,找到的ndim = 2。收到完整的图形:[无,200]
这是我的代码:
library(ggplot2)
x <- c(1:70)
y <- c((1:70)^2)
df <- data.frame(x,y)
ggplot(df, aes(x = x, y = y)) +
ylab(expression(bold("Height"))) +
xlab(expression(bold("Width"))) +
geom_point(size=1, col="red") +
geom_hline(aes(yintercept=2000, linetype = "1st border of height"),col="green",size=1) +
geom_hline(aes(yintercept=4000, linetype = "2st border of height"), col="red", size=1) +
geom_vline(aes(xintercept=20, linetype = "1st border of width"), col="blue", size=1, linetype="dashed") +
geom_vline(aes(xintercept=40, linetype = "2st border of width"),col="darkblue", size=1, linetype="dashed") +
geom_smooth(lwd=1, col="blue", span = 0.8, se=F) +
scale_linetype_manual(name = "Legend", values = c(1,2,1,1),
guide = guide_legend(override.aes = list(color = c("green", "red", "blue", "darkblue")))) +
theme()
什么原因导致此问题,以及如何解决?
答案 0 :(得分:1)
序列上的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))
这会引发错误:
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)
这可以正常工作。因此,在您的情况下,对于每个音频文件,每一秒钟(取决于您对数据进行采样的方式),都将具有单个矢量。