keras中一维卷积网络的输入维度
input dimensions to a one dimensional convolutional network in keras
真的很难理解 keras 中卷积 1d layer 的输入维度:
输入形状
具有形状的 3D 张量:(样本,步骤,input_dim)。
输出形状
3D 张量,形状为:(样本,new_steps,nb_filter)。由于填充,步长值可能已更改。
我希望我的网络接受价格的时间序列(按顺序为 101)并输出 4 个概率。我当前的非卷积网络做得相当好(训练集为 28000)如下所示:
standardModel = Sequential()
standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation='sigmoid'))
standardModel.add(Dense(4, W_regularizer=l2(0.7), activation='softmax'))
为了改进这一点,我想从具有长度为 10 的局部感受野的输入层制作一个特征图。(因此有 10 个共享权重和 1 个共享偏置)。然后我想使用最大池化并将其馈送到一个包含 40 个左右神经元的隐藏层,然后在外层使用 4 个具有 softmax 的神经元输出它。
picture (it's quite awful sorry!)
理想情况下,卷积层采用二维张量:
(minibatch_size, 101)
并输出维度为
的 3d 张量
(minibatch_size, 91, no_of_featuremaps)
但是,keras 层似乎需要输入中的一个维度称为步骤。我试过理解这一点,但仍然不太明白。在我的例子中,步骤是否应该为 1,因为向量中的每一步都是时间增加 1?另外,什么是new_step?
此外,如何将池化层的输出(3d 张量)转换为适合标准隐藏层(即 Dense keras 层)的 2d 张量形式的输入?
更新:在给出非常有用的建议后,我尝试制作一个卷积网络,如下所示:
conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
conv.add(Dense(10))
conv.add(Activation('tanh'))
conv.add(Dense(4))
conv.add(Activation('softmax'))
conv.Add(Flatten()) 行抛出范围超出有效边界错误。有趣的是,这个错误 而不是 仅针对此代码抛出:
conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
正在做
print conv.input_shape
print conv.output_shape
结果
(None, 1, 101
(None, -256)
被退回
更新 2:
已更改
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
至
conv.add(Convolution1D(10, 10, input_shape=(101,1))
它开始工作了。但是,两者之间有什么重要的区别吗?
将 (None, 101, 1) 输入到 1d conv 层或 (None, 1, 101) 我应该知道吗?为什么 (None, 1, 101) 不起作用?
之所以会这样,是因为Keras的设计者打算将一维卷积框架解释为处理序列的框架。要完全理解差异 - 尝试想象您有一个包含多个特征向量的序列。那么您的输出将至少是二维的——其中第一个维度与时间相关,其他维度与特征相关。一维卷积框架旨在以某种方式加粗这个时间维度,并尝试在数据中找到重复出现的模式——而不是执行经典的多维卷积变换。
在您的情况下,您必须简单地重塑数据以使其具有形状 (dataset_size, 101, 1) - 因为您只有一个特征。使用 numpy.reshape
函数可以轻松完成。要了解新步骤的含义 - 您必须了解您正在随时间进行卷积 - 因此您更改了数据的时间结构 - 这导致了新的时间连接结构。为了使您的数据成为适合密集/静态层的格式,请使用 keras.layers.flatten
层 - 与经典卷积情况相同。
更新: 正如我之前提到的——输入的第一个维度与时间有关。所以 (1, 101)
和 (101, 1)
之间的区别在于,在第一种情况下,你有一个时间步长有 101 个特征,在第二种情况下有 101 个时间步长和 1 个特征。您在第一次更改后提到的问题源于在此类输入上进行大小为 2 的池化。只有一个时间步长 - 你不能在大小为 2 的时间 window 上汇集任何值 - 仅仅是因为没有足够的时间步长来做到这一点。
真的很难理解 keras 中卷积 1d layer 的输入维度:
输入形状
具有形状的 3D 张量:(样本,步骤,input_dim)。
输出形状
3D 张量,形状为:(样本,new_steps,nb_filter)。由于填充,步长值可能已更改。
我希望我的网络接受价格的时间序列(按顺序为 101)并输出 4 个概率。我当前的非卷积网络做得相当好(训练集为 28000)如下所示:
standardModel = Sequential()
standardModel.add(Dense(input_dim=101, output_dim=100, W_regularizer=l2(0.5), activation='sigmoid'))
standardModel.add(Dense(4, W_regularizer=l2(0.7), activation='softmax'))
为了改进这一点,我想从具有长度为 10 的局部感受野的输入层制作一个特征图。(因此有 10 个共享权重和 1 个共享偏置)。然后我想使用最大池化并将其馈送到一个包含 40 个左右神经元的隐藏层,然后在外层使用 4 个具有 softmax 的神经元输出它。
picture (it's quite awful sorry!)
理想情况下,卷积层采用二维张量:
(minibatch_size, 101)
并输出维度为
的 3d 张量(minibatch_size, 91, no_of_featuremaps)
但是,keras 层似乎需要输入中的一个维度称为步骤。我试过理解这一点,但仍然不太明白。在我的例子中,步骤是否应该为 1,因为向量中的每一步都是时间增加 1?另外,什么是new_step?
此外,如何将池化层的输出(3d 张量)转换为适合标准隐藏层(即 Dense keras 层)的 2d 张量形式的输入?
更新:在给出非常有用的建议后,我尝试制作一个卷积网络,如下所示:
conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
conv.add(Dense(10))
conv.add(Activation('tanh'))
conv.add(Dense(4))
conv.add(Activation('softmax'))
conv.Add(Flatten()) 行抛出范围超出有效边界错误。有趣的是,这个错误 而不是 仅针对此代码抛出:
conv = Sequential()
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
conv.add(Activation('relu'))
conv.add(MaxPooling1D(2))
conv.add(Flatten())
正在做
print conv.input_shape
print conv.output_shape
结果
(None, 1, 101
(None, -256)
被退回
更新 2:
已更改
conv.add(Convolution1D(64, 10, input_shape=(1,101)))
至
conv.add(Convolution1D(10, 10, input_shape=(101,1))
它开始工作了。但是,两者之间有什么重要的区别吗? 将 (None, 101, 1) 输入到 1d conv 层或 (None, 1, 101) 我应该知道吗?为什么 (None, 1, 101) 不起作用?
之所以会这样,是因为Keras的设计者打算将一维卷积框架解释为处理序列的框架。要完全理解差异 - 尝试想象您有一个包含多个特征向量的序列。那么您的输出将至少是二维的——其中第一个维度与时间相关,其他维度与特征相关。一维卷积框架旨在以某种方式加粗这个时间维度,并尝试在数据中找到重复出现的模式——而不是执行经典的多维卷积变换。
在您的情况下,您必须简单地重塑数据以使其具有形状 (dataset_size, 101, 1) - 因为您只有一个特征。使用 numpy.reshape
函数可以轻松完成。要了解新步骤的含义 - 您必须了解您正在随时间进行卷积 - 因此您更改了数据的时间结构 - 这导致了新的时间连接结构。为了使您的数据成为适合密集/静态层的格式,请使用 keras.layers.flatten
层 - 与经典卷积情况相同。
更新: 正如我之前提到的——输入的第一个维度与时间有关。所以 (1, 101)
和 (101, 1)
之间的区别在于,在第一种情况下,你有一个时间步长有 101 个特征,在第二种情况下有 101 个时间步长和 1 个特征。您在第一次更改后提到的问题源于在此类输入上进行大小为 2 的池化。只有一个时间步长 - 你不能在大小为 2 的时间 window 上汇集任何值 - 仅仅是因为没有足够的时间步长来做到这一点。