keras conv1d 层权重计数未按预期生成
keras conv1d layer weight count is not produced as expected
我正在尝试将 python 中训练有素的手语分类解决方案转换为 C 语言 headers,以便我可以部署在 M4-cortex CPU 板上。
在 Python,我能够构建模型并对其进行训练,我可以看到它的预测准确率为 90%。
但是我发现卷积层
中的权重数量 used/generated 存在问题
**Conv_1d configuration**
print(x_train.shape)
model = Sequential()
model.add(Conv1D(32,kernel_size=5, padding='same',
input_shape=x_train.shape[1:], name='conv1d_1'))
print(model.layers[0].kernel.numpy().shape)
**output:**
(1742, 45, 45)
**(5, 45, 32)**
According to above configuration
input dimension = 45x45x1 pixels of image(gray scale)
input channels = 1
output dimension = 45x45x32
output channesls = 32
kernel size = 5
As per the concept(w.r.t https://cs231n.github.io/convolutional-networks/)
number of weights = (input_channels) x (kernel_size) x (kernel_size) x (output_channels)=1x5x5x32=800
But keras model produces weights array of size = [5][45][32]=7200
I'm not sure if my interpretation of weight array in keras model is correct, I would be glad if someone can help me with this
一些应该澄清你的疑问的项目符号。
你的权重数公式不正确,因为你使用的是Conv1D
,所以内核大小只有一维。
定义输入形状 x_train.shape[1:] = (45,45)
对应于在具有 45 个元素的数组上应用 45 个过滤器(同样是因为它是 Conv1D
)。
这么说,权数是:
# of weights = input_filters x kernel_size x output_filters = 45x5x32 = 7200
(无偏见)
考虑到您有图片,您可能正在寻找 Conv2D
。在这种情况下,输入形状应该是 (45,45,1)
,内核有两个维度,参数的数量恰好是 800(没有偏差)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(32,kernel_size=5, padding='same',
input_shape=(45, 45, 1), use_bias=False))
model.summary()
# Layer (type) Output Shape Param #
# conv (Conv2D) (None, 45, 45, 32) 800
我正在尝试将 python 中训练有素的手语分类解决方案转换为 C 语言 headers,以便我可以部署在 M4-cortex CPU 板上。 在 Python,我能够构建模型并对其进行训练,我可以看到它的预测准确率为 90%。 但是我发现卷积层
中的权重数量 used/generated 存在问题**Conv_1d configuration**
print(x_train.shape)
model = Sequential()
model.add(Conv1D(32,kernel_size=5, padding='same',
input_shape=x_train.shape[1:], name='conv1d_1'))
print(model.layers[0].kernel.numpy().shape)
**output:**
(1742, 45, 45)
**(5, 45, 32)**
According to above configuration
input dimension = 45x45x1 pixels of image(gray scale)
input channels = 1
output dimension = 45x45x32
output channesls = 32
kernel size = 5
As per the concept(w.r.t https://cs231n.github.io/convolutional-networks/)
number of weights = (input_channels) x (kernel_size) x (kernel_size) x (output_channels)=1x5x5x32=800
But keras model produces weights array of size = [5][45][32]=7200
I'm not sure if my interpretation of weight array in keras model is correct, I would be glad if someone can help me with this
一些应该澄清你的疑问的项目符号。
你的权重数公式不正确,因为你使用的是
Conv1D
,所以内核大小只有一维。定义输入形状
x_train.shape[1:] = (45,45)
对应于在具有 45 个元素的数组上应用 45 个过滤器(同样是因为它是Conv1D
)。这么说,权数是:
# of weights = input_filters x kernel_size x output_filters = 45x5x32 = 7200
(无偏见)考虑到您有图片,您可能正在寻找
Conv2D
。在这种情况下,输入形状应该是(45,45,1)
,内核有两个维度,参数的数量恰好是 800(没有偏差)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(32,kernel_size=5, padding='same',
input_shape=(45, 45, 1), use_bias=False))
model.summary()
# Layer (type) Output Shape Param #
# conv (Conv2D) (None, 45, 45, 32) 800