我想在keras中创建一个简单的模型,其中第一层的权重和偏置可以由另一个模型创建。类似于this paper,但更简单,其中CNN也被密集层取代。
我试过这个:
aux_in = np.random.random((2000, 10)) # features to generate weights
data_in = np.random.random((2000, 40))# main features
target = np.random.random((2000, 4))# annotations to be predicted
def create_ws(dim1,dim2):
# define our MLP network
model = Sequential()
initializer = RandomNormal(mean=0., stddev=1.)
model.add(Dense(dim2, input_dim=dim1, activation="relu"))
model.add(Dense(128, activation="relu"))
return model
def create_FCN(dim,ws):
# define our MLP network
model = Sequential()
initializer = RandomNormal(mean=0., stddev=1.)
model.add(Dense(128,
input_dim=dim,
activation="sigmoid",
kernel_initializer=initializer
))
model.set_weights(ws)
return model
wgen = create_ws(aux_in.shape[1],data_in.shape[1])
mainf = create_FCN(data_in.shape[1], wgen.get_weights()[2:])
x = Dense(32, activation="sigmoid")(mainf.output)
x = Dense(4, activation="linear")(x)
main_model = Model(inputs=[mainf.input, wgen.input], outputs=x)
opt = Nadam(learning_rate=0.001)
model.compile(loss="mean_squared_error", optimizer=opt, metrics=['accuracy'])
history=model.fit(x=[data_in,aux_in], y=target, validation_split=0.1, epochs=10, batch_size=32)
问题是,“wgen”模型似乎与“main_model”分离,因此在训练“main_model”之前和之后,其权重保持不变。“mainf”和“main_model”之间的连接似乎是正确的,因为当我在训练前后检查“main_model”上的权重时,很明显它们正在更新。
我应该如何重新连接这个模型,以便将权重生成网络(“wgen”)包含到主模型管道中?
1条答案
按热度按时间mwkjh3gx1#
我想将权重生成网络(“wgen”)包含到主模型管道中,并确保其权重在训练期间更新,您需要对代码进行一些修改。关键是要确保“wgen”生成的权重在主模型中是可连接和可训练的。
model.add(Dense(dim2,input_dim=dim1,activation=“relu”,trainable=True))
然后,我们使用“wgen”的输出作为主模型(“main_model”)的输入。通过这种方式,“wgen”生成的权重被合并到主模型的计算图中,并且它们将在训练期间更新。