在不使用 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 交易详细信息吗?