在不使用 Keras API 的情况下,提取 Keras 层的权重对于进行前向传递有啥意义

Posted

技术标签:

【中文标题】在不使用 Keras API 的情况下,提取 Keras 层的权重对于进行前向传递有啥意义【英文标题】:What is the significance of extracted weight of Keras layer for doing forward pass without using Keras API在不使用 Keras API 的情况下,提取 Keras 层的权重对于进行前向传递有什么意义 【发布时间】:2019-05-20 09:00:24 【问题描述】:

我的目的是了解卷积过程中使用的内核权重,然后对图像进行前向传递以进行分类。使用 Keras API 很容易完成这项工作,但这是我硕士论文的要求,因为我想在 FPGA 上构建一个 CNN 模型,仅用于测试/分类。

而不是使用 Keras API:

1/ 我将编写一个纯代码,将我的预处理图像作为输入输入

2/我会写卷积算法,并给出Kernel提取的信息做卷积

3/ 我会为 Flatten 和

写算法

4/ 通过使用密集算法我想预测

我的查询是:

1/ layer.get_weights() 实际提供的信息是什么?它是否给了我们将用于卷积的核权重?

2/ 如果我想借助提取的权重进行分类,我该如何处理?

以下是我的模型:(为简单起见,我刚刚写了一个最小层的模型)

def cnn_model():
    model = Sequential()

    model.add(Conv2D(1, (3, 3), padding='same',
                 input_shape=input_shape,
                 activation='relu'))
    model.add(Flatten())
    model.add(Dense(num_classes, activation='softmax'))

    return model
model = cnn_model()
lr = 0.01
sgd = SGD(lr=lr, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy',
      optimizer=sgd,
      metrics=['accuracy'])

输入图像是灰度和宽度,高度是80,80。 我使用以下代码训练了我的模型:

def lr_schedule(epoch):
return lr * (0.1 ** int(epoch / 10))

batch_size = batch_size
epochs = nb_epoch
model.fit(X_train, Y_train,
      batch_size=batch_size,
      epochs=epochs,
      validation_data=(X_test, Y_test),
      #np.resize(img, (-1, <image shape>)
      callbacks= [LearningRateScheduler(lr_schedule),
      ModelCheckpoint('path_to_save_model/model.h5', 
      save_best_only=True)])

我使用以下方法提取了层权重:

from keras.models import load_model
import pandas as pd
weight_list=[]
for lay in model.layers:
    name=lay.name
    weight=lay.get_weights()
    print(name," layer weight is:\n\n",weight,"\n\n")
    weight_list.append(weight)


weight_array=[]
weight_array=np.array(weight_list)
print("weight_array's fist element is: \n\n",weight_array[0],"\n\n")

weight_array=[0] 的输出是

 [array([[[[ 0.3856341 ]],

    [[-0.35276324]],

    [[-0.51678646]]],


   [[[-0.62636113]],

    [[ 0.43428165]],

    [[-0.26765126]]],


   [[[ 0.461921  ]],

    [[-0.14468761]],

    [[-0.3061749 ]]]], dtype=float32), array([-0.1087065], dtype=float32)] 

任何建议都将不胜感激。

【问题讨论】:

【参考方案1】:

1) layer.get_weights() 实际给出的信息是什么?它是否给了我们将用于卷积的核权重?

对于卷积层,layer.get_weights() 返回 [kernel, bias]。

2) 如果我想借助提取的权重进行分类,我该如何处理?

复制网络的每个阶段,其中的数学有据可查。密切注意正在执行的确切操作,例如深度学习中的“卷积”与标准数学中的“卷积”并不完全相同(不应用变换)。我建议你通过网络传递一个已知的输入,并检查你在每个阶段得到的答案是否相同。

【讨论】:

我会尝试开始使用 weight_array=[0] 的输出进行卷积吗?我假设如果我可以使用内核权重(输出layer.get_(weights) 的索引 0)进行卷积,然后分别应用 ReLU、Flatten、Dense 和 Softmax 算法,将完成分类。我很困惑我是否以正确的方式思考。 听起来不错。不要忘记在卷积之后添加偏差。在您的示例中,您有一个 3x3 卷积,然后是一个偏差值。 但是我怎样才能得到一个 3x3 的矩阵来做卷积呢?是weight_array=[0]的输出吗?如果我称它为 weight_array=[0][0] 它是一个 4 维数组,我必须以某种方式将其设为 3x3 矩阵是否正确?如果是,那么我是否只需将偏差值与新形成的矩阵相加?在这里,我假设newly_formed_matrix= input_image_array **conv** weight_array=[0][0] newly_formed_matrix= input_image_array conv weight_array=[0][0] + weight_array=[0][1] 通过关注this,我尝试对 out_shape: (1, 3, 48, 50)out_dim: 4 进行卷积.这里,out是卷积后的输出数组。训练图像是 RGB。 weight_array[0][0] 形状为 (3,3,3,1) 和暗淡 4。您能否提供任何网站,我可以在其中获得更多有关此显式操作以及 Flatten 和 Dense 的示例?【参考方案2】:

我正在尝试解释我针对我的问题所做并理解的解决方案。我在这里给the solution,我已经试过了。我从here提供的主要信息。

在一个模型文件中卷积核权重卷积偏差密集层权重密集层偏差是存储。如果有人想使用 Python 或 C++ 中的函数从头开始编写 Numpy 前向传递,这些内核权重很重要。详细信息在Github link中给出

【讨论】:

以上是关于在不使用 Keras API 的情况下,提取 Keras 层的权重对于进行前向传递有啥意义的主要内容,如果未能解决你的问题,请参考以下文章

Keras - 如何在不改变纵横比的情况下使用 ImageDataGenerator

在不使用 python requests 模块的情况下进行此 API 调用的最佳选择是啥?

如何在不启用 keras 中的 run_eagerly 标志的情况下将张量转换为 numpy 数组

我可以在不通过 BscScan 的情况下以编程方式提取 BSC 交易详细信息吗?

在不使用媒体提取器的情况下,无法在 Android 4.2 上对视频进行低级解码

如何在不实际提取文件的情况下使用 VBScript 读取 .zip 文件的内容?