【问题标题】:Adding new units to a Keras model layer and changing their weights向 Keras 模型层添加新单元并更改其权重
【发布时间】:2018-12-25 09:10:45
【问题描述】:

我正在开展一个项目,该项目需要我向神经网络的输出层添加新单元以实现某种形式的迁移学习。我想知道是否可以这样做并使用 Keras 或 TensorFlow 设置单位的权重。

具体来说,我想将一个输出神经元附加到 Keras 模型的输出层,并设置该神经元的初始权重和偏差。

【问题讨论】:

  • 您是否要附加到输出向量,然后将其用作新 NN 的输入?
  • 没有;我的目标只是附加一个输出单元
  • 您能否更具体地说明您的目标/意图?
  • 是的,我同意 Dom 的观点。能否请您更具体一点。谢谢。

标签: python tensorflow keras


【解决方案1】:

偶然发现了我自己问题的答案。谢谢大家的回答/cmets。

https://keras.io/layers/about-keras-layers/

此源代码的前几行详细说明了如何加载和设置权重。 本质上,将输出神经元附加到 Keras 模型可以通过加载旧输出层、附加新权重以及为新层设置权重来完成。代码如下。

# Load weights of previous output layer, set weights for new layer
old_layer_weights = model.layers.pop().get_weights()
new_neuron_weights = np.ndarray(shape=[1,bottleneck_size])

# Set new weights

# Append new weights, add new layer
new_layer = Dense(num_classes).set_weights(np.append(old_layer_weights,new_neuron_weights))
model.add(new_layer)

【讨论】:

  • 你有多少新课程?并且“重新训练”后模型的准确率好不好?我正在尝试做这样的事情,但有大约 300 个新课程。但是我正在删除输出层并创建一个新的具有神经元数量的新层来处理新类。而且我很挣扎,因为两个输出层(训练和再训练)中类的位置不同。我使用编码器位置来获取在softmax中具有最佳结果的类名。所以我不确定它是否是正确的通讯员类。你知道如何克服这个问题吗?
【解决方案2】:

您可以将新单元添加到预训练神经网络的输出层。这种形式的迁移学习被称为using the bottleneck features of a pre-trained network。这可以在 tensorflow 和 Keras 中实现。

请在下面的 Keras 中找到教程: https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

另外,请在下面找到 tensorflow 的教程:

https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/08_Transfer_Learning.ipynb

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-18
    • 2017-12-03
    • 2017-07-27
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多