【问题标题】:How can I pretrain for a multi-input DNN for Keras如何为 Keras 预训练多输入 DNN
【发布时间】:2020-11-12 01:53:16
【问题描述】:

我目前正在使用 Keras + Tensorflow 开发一个模型,以确定一组蛋白质的温度范围。我首先做的是创建一个预训练模型,将蛋白质转换为嵌入,然后预测其各自的温度。

我现在要做的是将此预训练模型合并到一个新模型中,该模型可以使用这个给定模型和相应的权重作为输入。然后适应一个新的数据集并再次预测。新顶级模型的以下代码是:

更新代码

'Load Pretrained Model'
loaded_model = keras.models.load_model('pretrained_model')

#Freeze all model layer weights
loaded_model.trainable = False

input1 = np.expand_dims(x_train['input1'],1)
input2 = np.expand_dims(x_train['input2'], 1)
input3 = x_train['input3']

#Redefine Input Layers for ANN
input1 = Input(shape = (input1.shape[1],), name = "input1")
input2 = Input(shape = (input2.shape[1],), name = "input2")
input3 = Input(shape = (input3.shape[1],), name = "input2")

base_inputs = [input1, input2, input3]

x = loaded_model(base_inputs, training = False)
x = Dense(64, activation = "relu",  kernel_regularizer=regularizers.l2(0.01))(x)

output = Dense(1, activation = "sigmoid")(x)

top_model = Model(inputs = base_inputs, outputs = output)

# Compile the Model
top_model.compile(loss='mse', optimizer = Adam(lr = 0.0001), metrics = ['mse'])

这无法正常工作,我不确定如何启动和运行它。我正在努力解决这个问题并且经常遇到这个错误:

AttributeError: 'Dense' object has no attribute 'shape'

有什么想法吗?

【问题讨论】:

    标签: python tensorflow keras neural-network


    【解决方案1】:

    您能否尝试使用 keras 层初始化输入并尝试? 您已经使用 Numpy 初始化了输入形状。 但是,如果我是对的,不幸的是,您从 keras 导入的密集层不支持此功能('Dense' object has no attribute 'op')。 请注意,“输入”是一个 keras 层

    您能否尝试按照以下链接中的说明初始化 keras 输入 (https://keras.io/guides/functional_api/)?

    举个例子,

    input1 = keras.Input(shape=(1,))
    input2 = keras.Input(shape=(1,))
    input3 = keras.Input(shape=(1,))
    

    是否使层可训练完全取决于您的机器学习架构。在迁移学习的情况下,您可以只使用来自预训练模型的训练权重,并使用从该模型获得的训练权重训练您的新网络。在这种情况下,您必须冻结预训练模型的层。因此trainable = False。您可以在自定义架构中使用的隐藏层的数学计算中使用这些权重。

    但是根据您的代码 sn-p,我可以预测您没有使用任何隐藏层(如 LSTM、RNN 或任何其他单元格)来存储您的序列数据。此外,您正在尝试将初始化的 Numpy 输入提供给预训练模型。我不认为这是否是正确的方法。从代码 sn-p 中,您使该层不可训练,但您正在尝试训练模型。

    另外,如果我是对的,我认为您必须使用预训练模型使用新数据集进行训练,对吗?如果是这样,请查看以下链接(https://keras.io/guides/transfer_learning/)。

    【讨论】:

    • @Nara-KS 再次感谢您提供如此漂亮的答案。你是对的,我从层中删除了training = False 参数,因为我确实想在新数据集上训练模型。在这种情况下,尽管有 numpy 输入,但我的模型仍然可以正常工作,并且没有给出任何问题,我只是为了格式化而重新塑造它们。但是,我的模型仍在运行。
    • @machine_apprentice 澄清:虽然您首先使用 Numpy 初始化了输入,但您随后再次使用 input1 = Input(shape = (input1.shape[1],), name = "input1") 初始化了输入,您已在代码 sn-p 中进行了更新。祝你好运!
    【解决方案2】:

    考虑到您的问题,我可以建议迁移学习方法是一个可行的解决方案。在迁移学习中,您可以使用来自一组数据的一个域的训练模型来使用另一组数据训练类似类型的问题。为了清楚地了解如何使层可训练并冻结它,可以在以下链接中了解微调(https://keras.io/guides/transfer_learning/

    关于属性报错,建议看下面的链接(https://keras.io/guides/functional_api/

    首先,您要初始化 keras 的输入节点以及输入的形状,这些数据与您将提供给训练模型的数据有关。一个例子如下所示,

    inputs = keras.Input(shape=(784,))
    

    如果您提供图像数据,也可以如下所示

    img_inputs = keras.Input(shape=(32, 32, 3))
    

    dense layer 期望输入应该是一个特定的形状,你可以根据你的数据找到它。如果不确定,请先分析数据。它将为您提供大量信息以进一步进行。

    【讨论】:

    • 嘿!感谢您提供如此详细的答案。所以我刚刚用一个新的代码片段更新了我的问题,这样的工作吗?我现在没有收到任何错误,但我不确定我的模型是否仍在对旧数据进行训练,或者只是考虑新数据或两者兼而有之......
    • 或者我应该在模型中省略额外的 training = false 吗?
    • @Dharman 请看下面的链接,可能有用(stackoverflow.com/questions/61083004/…)
    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2018-01-10
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多