【问题标题】:How to get Conv2D layer filter weights如何获得 Conv2D 层过滤器权重
【发布时间】:2018-02-23 00:03:51
【问题描述】:

如何在每个 epoch 之后获取 Keras 中 Conv2D 层的所有过滤器(如 32 ,64 等)的权重?我提到这一点,因为初始权重是随机的,但在优化后它们会改变。

我查了this answer,但不明白。请帮助我找到一个解决方案,在每个时期之后获取所有过滤器的权重。

还有一个问题是,在 Keras 文档中,Conv2D 层的输入形状是(样本、通道、行、列)。 samples 到底是什么意思?是我们拥有的输入总数(比如在 MNIST 数据集中它是 60.000 个训练图像)还是批量大小(比如 128 或其他)?

【问题讨论】:

  • 你到底有什么不明白的?你需要具体,否则它是一个重复的问题。
  • 假设我在 keras 中制作一个模型,它有一个像 Conv2D(64, (3, 3), activation='relu') 这样的层,这意味着过滤器的数量是 64,每个过滤器的大小为 3*3。对于任何模型的第一次迭代,这些 64*3*3 值通过 glorot_uniform 初始化程序进行初始化,然后在 model.compile 中我使用 sgd 优化器。这意味着现在这 64 个过滤器将获得新的值。我想看看这些新的价值观。
  • 我知道。您链接的问题提供了答案。你没有解释你从另一个问题中不明白的地方。
  • 我得到了第一个问题的答案。 model.layers[index of layer].get_weights()[0] 将权重。只是我想在 keras 的 Conv2D 层中询问样本是什么意思?我拥有的输入总数或 batch_size。因为在 tensorflow 文档中,他们提到了 Conv 层的批量大小。

标签: keras


【解决方案1】:

样本 = 批次大小 = 批次中的图像数量

Keras 经常使用None 来表示这个维度,这意味着它可以变化,你不必设置它。

虽然这个维度确实存在,但是当你创建一个层时,你传递input_shape没有它:

Conv2D(64,(3,3), input_shape=(channels,rows,cols))
#the standard it (rows,cols,channels), depending on your data_format

要在每个 epoch(或批次)之后完成操作,您可以使用 LambdaCallback,传递 on_epoch_end 函数:

#the function to call back
def get_weights(epoch,logs):
    wsAndBs = model.layers[indexOfTheConvLayer].get_weights()
    #or model.get_layer("layerName").get_weights()

    weights = wsAndBs[0]
    biases = wsAndBs[1]
    #do what you need to do with them
    #you can see the epoch and the logs too: 
    print("end of epoch: " + str(epoch)) for instance

#the callback
from keras.callbacks import LambdaCallback
myCallback = LambdaCallback(on_epoch_end=get_weights)

将此回调传递给训练函数:

model.fit(...,...,... , callbacks=[myCallback])

【讨论】:

  • 我在mnist数据集中使用了batch size=128
  • 好吧,你是对的。但是这个维度不应该让我们担心。它是自动计算出来的,我们不需要把它放在图层中。我们必须把Conv2D(filers,kernel_size, input_shape=(side1,side2,channels))
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2018-01-16
相关资源
最近更新 更多