Machine learning 带有Keras的嵌入式RNN-带有连接的问题

Machine learning 带有Keras的嵌入式RNN-带有连接的问题,machine-learning,neural-network,keras,recurrent-neural-network,Machine Learning,Neural Network,Keras,Recurrent Neural Network,对于音频分类,我想尝试一种嵌入式RNN。基于30秒样本的MFCC或FFT,我想为每个1s子样本创建第一个输出,然后使用30个输出将其发送到另一个RNN以获得最终预测。这个想法是通过将问题分成多个部分来解决消失梯度问题(你的观点也很受欢迎,它来自于我在Wavenet中看到的可视化) 这是一个模型的表示,每个级别只有4个时间步和1层LSTM: 在下面的代码中,我对Concatenate的维度有一个问题。输入为(无,30,84),输出为(无,32)。在轴0上连接之后,我想要一个(无、30、32) i

对于音频分类,我想尝试一种嵌入式RNN。基于30秒样本的MFCC或FFT,我想为每个1s子样本创建第一个输出,然后使用30个输出将其发送到另一个RNN以获得最终预测。这个想法是通过将问题分成多个部分来解决消失梯度问题(你的观点也很受欢迎,它来自于我在Wavenet中看到的可视化)

这是一个模型的表示,每个级别只有4个时间步和1层LSTM:

在下面的代码中,我对Concatenate的维度有一个问题。输入为(无,30,84),输出为(无,32)。在轴0上连接之后,我想要一个(无、30、32)

i1=输入((30,84))
l1=CuDNNLSTM(单位=32,返回序列=False)(i1)
i2=输入((30,84))
l2=CuDNNLSTM(单位=32,返回序列=False)(i2)
i3=输入((30,84))
l3=CuDNNLSTM(单位=32,返回序列=False)(i3)
i4=输入((30,84))
l4=CuDNNLSTM(单位=32,返回序列=False)(i4)
i5=输入((30,84))
l5=CuDNNLSTM(单位=32,返回序列=False)(i5)
i6=输入((30,84))
l6=CuDNNLSTM(单位=32,返回序列=False)(i6)
i7=输入((30,84))
l7=CuDNNLSTM(单位=32,返回序列=False)(i7)
i8=输入((30,84))
l8=CuDNNLSTM(单位=32,返回序列=False)(i8)
i9=输入((30,84))
l9=CuDNNLSTM(单位=32,返回序列=False)(i9)
i10=输入((30,84))
l10=CuDNNLSTM(单位=32,返回序列=False)(i10)
i11=输入((30,84))
l11=CuDNNLSTM(单位=32,返回序列=False)(i11)
i12=输入((30,84))
l12=CuDNNLSTM(单位=32,返回序列=False)(i12)
# ... 最多30
输入层=[i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12]
第一层=[l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12]
#f=串联(轴=0)(第一层)#顺序格式
f=连接(第一层,轴=0)#功能API版本
o1=CuDNNLSTM(单位=32,返回序列=False)(f)
输出=密集(16,激活='softmax')(o1)
模型=模型(输入=输入\层,输出=输出)
model.summary()
该错误符合逻辑,因为(None,32)的形状与LSTM不兼容

ValueError:输入0与层cu_dnnlstm_13不兼容:预期ndim=3,发现ndim=2

第二件事,是否有一种方法可以训练第一层具有相同“单元”的模型。例如,在图像中,我希望在细胞状态方面有红细胞=蓝细胞=黄细胞=绿细胞。这是因为我想要一个给定声音的时不变输出。0秒时的特定声音在10秒时的相同声音应具有相同的输出。但正如现在一样,输出将根据每个单元状态而有所不同

如果这在Keras中是不可能的,那么有没有办法用tensorflow实现呢

非常感谢您的支持


Nicolas

关于您的错误,您似乎想要堆叠张量(沿新维度串联/堆叠张量),而不是串联张量(沿现有维度串联张量)

使用:

将keras.backend导入为K
从keras.models导入模型
从keras.layers导入Lambda、输入、CuDNNLSTM、稠密
将numpy作为np导入
#在简单张量上演示K.stack():
list_l=[K.变量(np.random.rand(32)),用于范围(30)内的i]
f=K.堆栈(列表,轴=0)
印刷品(f)
#>张量(“堆栈:0”,形状=(30,32),数据类型=浮点32)
#实际使用情况,在您的型号中:
input_layer=[input(shape=(30,84))表示范围(30)内的n]
第一个_层=[CuDNNLSTM(units=32,return_sequences=False)(i)表示输入_层中的i]
f=Lambda(Lambda张量:K.stack(张量,轴=1))(第一层)
印刷品(f)
#>张量(“lambda_1/stack:0”,shape=(?,30,32),dtype=float32)
o1=CuDNNLSTM(单位=32,返回序列=False)(f)
输出=密集(16,激活='softmax')(o1)
模型=模型(输入=输入\层,输出=输出)
model.summary()
我不太清楚你的sup是什么意思。问题。。。您的第一个
CuDNNLSTM
层的重量共享可能(请参阅上的文档)

如果是这样,您可以将第一层定义为:

cudnn_lstm_first = CuDNNLSTM(units=32, return_sequences=False)
first_layer = [cudnn_lstm_first(i) for i in input_layer]
太棒了:)非常感谢!此外,共享LSTM大大减少了需要微调的参数数量,从30 x 15104减少到只有15104(我事先没有想到这一点)。