首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用model.fit=1时,历史记录与()日志不匹配

当使用model.fit=1时,历史记录与()日志不匹配
EN

Stack Overflow用户
提问于 2021-08-05 06:47:20
回答 1查看 63关注 0票数 0

我正在训练一个函数API模型,我的模型如下:数据总数为1094,训练:有效:测试比率为7: 2: 1。

代码语言:javascript
复制
def bonepool():
    bonepool_input = Input(shape = (1024, 256, 1))
    x = Conv2D(4, 3, padding = 'same', strides = (1,1), activation = 'relu')(bonepool_input)
    x = Conv2D(4, 3, padding = 'same', strides = (1,1), activation = 'relu')(x)
    x = MaxPooling2D(2, strides = (2, 2))(x)
    x = Conv2D(8, 3, padding = 'same', strides = (1,1), activation = 'relu')(x)
    x = Conv2D(8, 3, padding = 'same', strides = (1,1), activation = 'relu')(x)
    x = MaxPooling2D(2, strides = (2, 2))(x)
    x = Conv2D(16, 3, padding = 'same', strides = (1,1), activation = 'relu')(x)
    x = Conv2D(16, 3, padding = 'same', strides = (1,1), activation = 'relu')(x)
    x = MaxPooling2D(2, strides = (2, 2))(x)
    x = Conv2D(32, 3, padding = 'same', strides = (1,1), activation = 'relu')(x)
    x = Conv2D(32, 3, padding = 'same', strides = (1,1), activation = 'relu')(x)
    x = MaxPooling2D(2, strides = (2, 2))(x)
    boonepool_output = Flatten()(x)
    return Model(bonepool_input, bonepool_output)
model_1 = bonepool()
model_2 = bonepool()
concate = average([model_1.output, model_2.output])
x = Dense(128, activation = 'relu')(concate)
x = Dense(128, activation = 'relu')(x)
x = Dense(64, activation = 'relu')(x)
output = Dense(1, activation = 'sigmoid')
ensemble_model = Model([model_1.input, model_2.input], output)

利用f1score实现了精确性、召回性、keras.backend功能。我像这样编译了我的模型,并在拟合了模型之后检查了历史。但出了点问题。

代码语言:javascript
复制
 opt = Adam(learning rate = 0.01)
 Class_wegiht = {0:4, 1:0.5}
 ensemble_model.compile(loss = 'binary_crossentropy', optimizer = opt, metrics = ['accuracy', precision, recall, f1score])
 hist = ensemble_model.fit(train, batch_size= BATCH_SIZE, epochs = 10, stepts_per_epoch = train__len__(), class_weight = Class_weight, validation_data = valid, validation_steps = valid.__len__(), verbose = 1)

结果是(我删除了所有其他相关值)

1/1047/47 ========================================损耗: 0.1427,精度= 0.8765,

2/10 47/47 ========================================损耗: 0.8736,精度= 0.3987,

时间3/10 47/47 ========================================损耗: 0.1563,精度= 0.8655,

4/10 47/47 ========================================损耗: 0.1125,精度= 0.8788,.

但当我印刷历史的时候,

代码语言:javascript
复制
hist.history['accuracy']

前四个值与model.fit()的日志不一样

0.8211,0.3712,0.7764,0.8853 .

同样的问题也适用于损失,f1score,召回,精度,valid_loss,valid_accuracy,valid_f1score,valid_recall,.等。

但是,当我将详细内容从1改为2时,model.fit()日志的所有值都与hist.history完全相同。

有人说model.fit()缺少last_output,所以model.fit()和历史之间可能有细微的差别,但当我作为我的模型时,它们之间的差异有时超过3.0(损失4.2,而那个时代的历史‘损失’只有1.2),我认为这不是一个微小的差别。

如果这是平均值和last_output之间的问题,那么即使我使用顺序模型,使用verbose=0和verbose=1的model.fit()日志也应该是不同的。但是,当我使用顺序模型而不是函数模型时,三个值( model.fit日志(详细信息= 0)、model.fit日志(详细信息= 1)、hist.history)完全相同。

因此,我怀疑在使用函数API时,结果(准确性、精确性、回忆性、f1score等)。verbose=1所显示的总是不同于verbose=2的,历史总是与后者相匹配,而不是前者。是对的吗?如果不是,有人能告诉我我错过了什么吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-22 04:08:31

你的推测似乎是对的。你从损失和其他指标中得到的

代码语言:javascript
复制
hist.history

都是时代的平均值。但是,如果使用详细的1,日志(输出打印)文件可能与历史记录不匹配,因为它们是在每批之后更新的。你需要相信的是:

代码语言:javascript
复制
hist.history

请记住,在优化权重的同时,训练集的值是按时代计算的,这意味着与历史上的训练集有关的值可能不匹配:

代码语言:javascript
复制
ensemble_model.evaluate(train)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68661824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档