Python 将千层面转换为Keras代码(CNN->;LSTM)
我想转换此千层面代码:Python 将千层面转换为Keras代码(CNN->;LSTM),python,keras,lstm,lasagne,Python,Keras,Lstm,Lasagne,我想转换此千层面代码: et = {} net['input'] = lasagne.layers.InputLayer((100, 1, 24, 113)) net['conv1/5x1'] = lasagne.layers.Conv2DLayer(net['input'], 64, (5, 1)) net['shuff'] = lasagne.layers.DimshuffleLayer(net['conv1/5x1'], (0, 2, 1, 3)) net['lstm1'] = lasag
et = {}
net['input'] = lasagne.layers.InputLayer((100, 1, 24, 113))
net['conv1/5x1'] = lasagne.layers.Conv2DLayer(net['input'], 64, (5, 1))
net['shuff'] = lasagne.layers.DimshuffleLayer(net['conv1/5x1'], (0, 2, 1, 3))
net['lstm1'] = lasagne.layers.LSTMLayer(net['shuff'], 128)
在Keras代码中。现在我想到了这个:
multi_input = Input(shape=(1, 24, 113), name='multi_input')
y = Conv2D(64, (5, 1), activation='relu', data_format='channels_first')(multi_input)
y = LSTM(128)(y)
但我得到了错误:输入0与层lstm_1不兼容:预期ndim=3,发现ndim=4
解决方案
解释
我将千层面和干酪的文件放在这里,以便您可以进行交叉参考:
递归层可以类似于前馈层使用,除了
输入形状应为(批大小、序列长度、输入数量)
输入形状
具有形状的三维张量(批量大小、时间步长、输入尺寸)
基本上API是相同的,但千层面可能会为您重新塑造(我需要稍后检查源代码)。这就是为什么会出现此错误:
Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=4
,因为Conv2D
之后的张量形状是(?,64,20,113)
的ndim=4
因此,解决方案是将其重塑为(?,207232)
编辑
与千层面一起确认,它为您提供了窍门:
num_inputs = np.prod(input_shape[2:])
因此,作为LSTM输入的正确张量形状是(?,20,64*113)
=(?,207232)
注
Permute
在Keras中是多余的,因为您无论如何都必须重塑。我之所以把它放在这里,是为了将千层面“完整地翻译”成Keras,它做的和DimshuffleLaye
在千层面中做的一样
然而,由于我在《编辑》中提到的原因,
DimshuffleLaye
在千层面中是必需的,千层面LSTM创建的新维度是“最后两个”维度的乘法。即批次大小,我不是千层面的专家,但我认为使用与否无关。非常感谢,这就是我一直在寻找的解决方案和答案。
num_inputs = np.prod(input_shape[2:])