gpt4 book ai didi

python - 如何正确提取 Keras ConvNet 权重矩阵以在 Excel 中使用?

转载 作者:行者123 更新时间:2023-12-04 20:50:59 28 4
gpt4 key购买 nike

我正在尝试在 Excel 中构建一个非常简单的卷积神经网络。该模型是一个图像分类器,试图识别手写的 I、O 和 X;并使用 Keras 对 EMNIST 字母数据集的一个子集进行了训练。 Excel 电子表格只是前向传播阶段(即所有实际训练都在 Keras 中进行),我主要将其用于说明和理解目的。
模型架构非常简单:输入 > 卷积层(5 个 3x3 滤波器)> maxpool > 密集输出层(3 类)。
该模型在测试集上的准确率为 99.33%,所以我知道它运行良好。使用 model.predict 对单个样本进行正确分类,但是当我在 Excel 版本中尝试相同的示例时,预测通常会有所不同(并且不正确)。
正如我所看到的,可能存在两个问题:首先,我从训练模型中提取的权重(并复制粘贴到 Excel 中)可能是错误的顺序/形状。其次,Excel模型设置不正确。我相当确定 Excel 模型很好,所以我认为权重是问题所在。
所以我的问题如下:如何使用 get_weights 从 Keras 中提取权重以这样一种方式,我可以在 Excel 中排列它们?特别是在 15x3 网格中,即卷积层的 5 个 3x3 过滤器权重的垂直堆栈和密集层的 980x3 网格。
这是我一直在做的事情-但这似乎是不正确的:

raw_conv1_weights = iox_model.get_weights()[0]
raw_conv1_biases = iox_model.get_weights()[1]
raw_dense_weights = iox_model.get_weights()[2]
raw_dense_biases = iox_model.get_weights()[3]

conv1_weights = pd.DataFrame(raw_conv1_weights.swapaxes(0,2).swapaxes(1,3).reshape(15,3))
conv1_biases = pd.DataFrame(raw_conv1_biases)
dense_weights = pd.DataFrame(raw_dense_weights)
dense_biases = pd.DataFrame(raw_dense_biases)
然后将数据框保存为 .xlsx 格式,并将网格复制粘贴到 Excel 模型中。
在 Keras 中构建的模型本身如下所示,以防相关。
# defining the model architecture
n_classes = 3

iox_model = models.Sequential()

# first convolutional layer (with padding to preserve output dimensions)
iox_model.add(layers.Conv2D(5,(3,3), activation='relu', input_shape=img_shape, padding='same'))

# max pooling layer
iox_model.add(layers.MaxPooling2D((2,2)))

# fully connected output layer
iox_model.add(layers.Flatten())
iox_model.add(layers.Dense(n_classes, activation='softmax'))
提前谢谢了!
编辑:
我正在添加一些有关 Excel 电子表格如何工作的详细信息,以防万一。
  • 输入图像是一个 28x28 的网格,其值在 0-255 范围内(单 channel 图像)。
  • 标准化图像是通过将每个单元格的值除以 255 来创建的,然后填充为 0。
  • 卷积是使用 SUMPRODUCT 在归一化图像上依次使用每个滤波器执行的,这为 5 个滤波器中的每一个创建一个 28x28 网格(特征图),并且相关滤波器的偏置项被添加到新的每个单元格中网格。
  • 使用 MAX(0,cell) 对卷积特征图中的每个单元执行 ReLU 激活,为 5 个过滤器中的每一个创建另一个 28x28 网格。
    - 对于激活图中的每个 2x2 细胞批处理,使用 MAX(2x2 细胞批处理)执行最大池化。
  • 然后将输出按顺序展平为单列(最大池映射 1,第 1 行;映射 1,第 2 行;...;映射 2,第 1 行;依此类推)。
  • logit 输出分数是通过对扁平化的最大池输出和 3 个密集层权重列中的每一个依次使用 SUMPRODUCT 获得的,并在每个列上添加相关的偏置项。然后使用 EXP 等对 logit 输出进行 softmax 处理。
  • 最佳答案

    很高兴报告我已经解决了这个问题。我想我只是在这里发布一个答案,以防有人需要它。
    事实证明,问题既不是权重也不是前向传播电子表格。我多次尝试为权重重新塑造和交换轴,但无济于事,我还从 Keras 中提取了正在调查的实际样本的激活,并将它们与 Excel 中的激活进行了比较,如下所示:

    layer_outputs = [layer.output for layer in iox_model.layers] 
    activation_model = models.Model(inputs=iox_model.input, outputs=layer_outputs)
    activations = activation_model.predict(np.expand_dims(sample, axis=0))
    以这种方式提取的所有激活都与 Excel 版本中的激活匹配。问题在于 Flatten()层。在 Keras 中展平产生的数组按以下方式排序:
  • 过滤器 1,第 1 列,第 1 行;过滤器 2,第 1 列,第 1 行;过滤器 3,第 1 列,第 1 行; ... 过滤器 5,第 14 列,第 14 行;

  • 而不是:
  • 过滤器 1,第 1 列,第 1 行;过滤器 1,第 2 列,第 1 行;过滤器 1,第 3 列,第 1 行; ... 过滤器 5,第 14 列,第 14 行;

  • 正如我所假设的那样。
    我这样做的方式意味着代表全连接输出层的 SUMPRODUCT 设置不正确。我修复了扁平层的 Excel 版本,使其生成的列遵循与 Keras 中相同的顺序,现在它可以正常工作了。

    关于python - 如何正确提取 Keras ConvNet 权重矩阵以在 Excel 中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62655807/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com