keras Tensorflow模型测试精度低

tquggr8v  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(133)

我的模型采用二进制输入,这是从二进制编码的文本(不是一个热编码)。我实现了99.5%的二进制精度和85%的精度。训练结束后,我的测试结果达到了75%左右。然而,如果我重新启动内核并加载模型(使用下面的make_model函数),然后加载 _ 权重,我只能得到35%的准确率。为什么会有这么大的差异?

# start span identification model definition - increased parameters
def make_model(learn_rate: float):
    inputs_sp_can = Input(shape=(MAX_BIN_SPAN_LEN,), name="Candidate Span")
    sp_embedding_layer = Embedding(
        len(char2idx),
        EMBEDDING_DIM,
        embeddings_initializer=keras.initializers.Constant(embed_matrix),
        trainable=False,
    )(inputs_sp_can)
    x = Bidirectional(LSTM(960))(sp_embedding_layer)
    # x = BatchNormalization()(x)
    x = Dense(1920,activation = 'selu')(x)
    x = Dense(640, activation='selu')(x)
    x = Dropout(0.5)(x)
    x = Dense(1280, activation='selu')(x)
    x = models.Model(inputs=inputs_sp_can, outputs=x)

    inputs_sent = Input(shape=(MAX_BIN_SENT_LEN,), name="Input Sentences")
    sent_embedding_layer = Embedding(
        len(char2idx),
        EMBEDDING_DIM,
        embeddings_initializer=keras.initializers.Constant(embed_matrix),
        trainable=False,
    )(inputs_sent)
    y = Bidirectional(LSTM(1800))(sent_embedding_layer)
    # y = BatchNormalization()(y)
    y = Dense(1920,activation = 'selu')(y)
    y = Dense(640, activation='selu')(y)
    y = Dropout(0.5)(y)
    y = Dense(1280, activation='selu')(y)
    y = models.Model(inputs=inputs_sent, outputs=y)

    combined_layer = Concatenate(axis=1)(
        [x.output, y.output]
    )  # ([x.output,w.output,y.output])
    z = Dense(1024, activation='selu')(combined_layer)
    z = Dense(512, activation='selu')(z)
    z = Dense(512, activation='selu')(z)
    # z = Dropout(0.5)(z)
    # z = Dense(1024, activation='selu')(z)

    pre_span_label = Dense(128, activation="selu", name="pre_span_label")(z)
    span_label = Dense(len(label_idx), activation="softmax", name="span_label")(
        pre_span_label
    )

    model = models.Model(
        inputs=[x.input, y.input], outputs=[span_label]
    )  # [x.input,w.input,y.input], outputs = [span_check,span_label])

    myoptimizer = optimizers.Adam(learning_rate=learn_rate, clipnorm=0.1)

    model.compile(
        optimizer=myoptimizer,
        loss="categorical_crossentropy",
        metrics=["binary_accuracy", "accuracy"],
    )

    return model

学习率为0.00015。拟合函数如下:

filepath = save_path + "Char_Tok_Models/Models/weights.{epoch:02d}.hdf5"
checkpoint = ModelCheckpoint(
    filepath,
    monitor="val_loss",
    verbose=1,
    save_best_only=False,
    mode="max",
    period=5
)

callbacks_list = [checkpoint]

history = model.fit(
    [x_span_train, corr_sent_train],
    corr_label_train,
    validation_data=([x_span_val, corr_sent_val], [corr_label_val]),
    epochs=25,
    callbacks=callbacks_list,
    batch_size=64,
)  #

加载权重和评估模型的代码如下:

model = make_model(0.0002)
model.load_weights(save_path + "Char_Tok_Models/Models_Upd/weights.40.hdf5")

model.evaluate([x_span_test, corr_sent_test], corr_label_test)

我很感激你的帮助。谢谢.
我改变了学习率,并尝试在最后一层使用“sigmoid”激活。我的期望是推断至少有80%的准确率。

vojdkbi0

vojdkbi01#

如果在重新启动内核并加载权重时,模型性能再次出现显著下降(从大约75%下降到35%),则表明权重初始化或加载和评估模型的方式可能存在问题。以下是您可以采取的一些步骤来解决此问题:
1.检查装载重量:确保正确装载砝码。您可以打印模型摘要或检查加载的权重形状,以验证它们是否与模型架构匹配。确保用于创建模型的make_model函数与训练期间使用的函数相同。
1.检查数据预处理:验证输入数据(x_span_test、corr_sent_test和corr_label_test)的预处理方式与训练期间相同。数据预处理中的任何差异都可能导致不同的结果。
1.检查超参数:确认超参数,如学习率(在您的情况下为0.0002),设置为与训练期间相同的值。超参数的微小变化会影响模型的性能。

rjjhvcjd

rjjhvcjd2#

当你重新加载你的模型后,重新启动内核可能会改变你的模式的准确性,这里有一些常见的原因:
1.随机初始化:神经网络通常在训练开始时随机初始化它们的权重。这种随机性可能会导致每次重启内核并创建新模型时产生不同的初始权重。因此,网络可能会在训练期间收敛到不同的权重集合,从而导致不同的性能。
1.重量初始化:如果您使用某些权重初始化技术,如Xavier/Glorot初始化或He初始化,它们也可以引入随机性。如果重新启动内核后初始权重不同,则会影响收敛。
要解决这些问题,您可以使用用途:
1.种子随机数生成器:在脚本的开头设置一个随机种子,以确保可重复性。这可以帮助确保权重初始化和数据重排在运行中是一致的。
1.保存和加载模型权重:保存模型权重,而不是保存和加载整个模型架构。通过这种方式,您可以使用相同的架构初始化模型,并加载经过训练的权重以实现一致的性能。

相关问题