Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

训练刚结束时的验证效果和保存并重新加载模型参数后进行验证的结果不一样 #50

Open
123AOQW opened this issue Apr 8, 2024 · 3 comments

Comments

@123AOQW
Copy link

123AOQW commented Apr 8, 2024

Environment (使用环境)

  • Installation method (安装方式): Install SSSegmentation for Developing
  • The version of sssegmentation (版本号): 1.5.3
  • Operating system (操作系统): Linux。使用slurm任务调度工具。
  • Python version (Python版本): 3.8.19

Question description (问题描述)
我将unet模型的某个训练配置文件稍加修改,得到了fcn_unets5os16_spider.py并将该文件作为训练我自己数据集的配置,bs=32,epochs设为20。按默认设置,每隔10个epoch在验证集val上验证效果。训练返回的结果文件中,第20个epoch结束后的验证结果如下【结果1】:

2024-04-08 12:06:49 INFO  Rank 0 finished
2024-04-08 12:06:49 INFO  All Finished, all_preds: 480, all_gts: 480
2024-04-08 12:06:51 INFO  {'iou': {'__background__': 0.9306402134161759, 'spider': 0.6665832034694705}, 'miou': 0.7986117084428233, 'accuracy': array([0.96680556, 0.78754992]), 'mpa': 0.8771777369668247}

(accuracy和mpa是我加进去的)

之后我用测试脚本dist_test.sh,加载了第20个epoch结束后保存的参数文件epoch_20.pth进行验证,调用测试脚本的命令如下:

bash scripts/dist_test.sh 1 ssseg/configs/unet/fcn_unets5os16_spider.py fcn_unets5os16_spider_ep20/epoch_20.pth --slurm

单独运行测试脚本得到的结果如下【结果2】:

2024-04-08 15:22:14 INFO  Rank 0 finished
2024-04-08 15:22:14 INFO  All Finished, all_preds: 480, all_gts: 480
2024-04-08 15:22:16 INFO  {'iou': {'__background__': 0.9324833796798122, 'spider': 0.6735323713466238}, 'miou': 0.803007875513218, 'accuracy': array([0.96818855, 0.79066773]), 'mpa': 0.879428142561482}

这和前面训练时的验证结果不一样。我之后又运行了一次单独运行测试脚本的命令,结果和【结果2】一样。

请问为什么会这样?

@123AOQW 123AOQW changed the title 训练刚结束时的测试效果和保存并重新加载模型参数后测试的结果不一样 训练刚结束时的验证效果和保存并重新加载模型参数后进行验证的结果不一样 Apr 8, 2024
@CharlesPikachu
Copy link
Member

你能check一下训练时候测试使用的数据和训练完之后使用的数据是否一致吗。就是check一下缓存的pkl文件里用的imageids是否一致。

@123AOQW
Copy link
Author

123AOQW commented Apr 9, 2024

我只找到了一个pkl文件,即./fcn_unets5os16_spider_ep20/fcn_unets5os16_spider_ep20_0.pkl(我当前所在的目录是sssegmentation)。我用下面的代码读取了这个文件:

import pickle

# 读取.pkl文件
with open('fcn_unets5os16_spider_ep20_0.pkl', 'rb') as f:
    data = pickle.load(f)

# 查看数据尺寸
print(len(data))     # 2
print(len(data[0]))  # 480
print(len(data[1]))  # 480

# 查看数据样式
print(data[0][0])
'''
['2601', array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]])]
'''
print(data[1][0])
'''
[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]
 '''
 # 这里的列表也是array类型,只是用print单独打印出来时没显示

可见两个列表里保存的数据的样式不一样,第二个列表里没保存imageid。我比较了相同位置的表示图片的二维列表(我没搞清楚这里的array表示是预测完的结果还是原图),发现二者并不相同:

print(sum(data[0][0][1]==data[1][0]))
'''
[256 256 256 256 256 256 256 256 256 254 252 252 251 251 250 250 250 250
 249 249 249 248 249 251 249 249 248 248 248 248 250 251 252 251 248 247
 246 245 245 246 247 247 248 247 249 250 249 250 251 253 252 252 251 251
 250 250 251 253 253 251 243 242 240 248 249 242 238 238 230 227 225 224
 221 219 212 221 229 233 232 231 230 234 235 236 234 236 237 239 239 240
 238 239 238 240 238 240 241 239 240 240 238 237 238 240 233 226 221 215
 216 223 225 230 231 237 231 229 230 233 236 237 244 248 249 245 243 242
 240 235 237 235 235 228 222 224 229 238 238 228 235 248 253 255 255 254
 254 253 253 253 252 253 252 251 254 254 255 255 255 250 250 249 249 244
 237 232 237 242 242 242 247 235 234 234 233 232 237 234 239 243 245 250
 250 248 240 238 232 225 223 214 222 225 224 224 220 213 215 216 218 221
 224 230 229 227 227 227 226 223 229 230 225 219 218 216 221 222 225 236
 238 240 241 241 241 242 242 242 241 242 243 243 242 248 248 248 248 248
 248 248 247 247 247 247 247 247 248 248 249 250 249 249 249 249 250 250
 252 255 256 256]
'''
# 我的图片尺寸为256x256,如果两个二维列表相同,此处输出的列表里应全为256.

这是否意味着前后两次验证用的imageids顺序不一致?


补充:我后面发现还有一个pkl文件./fcn_unets5os16_spider_ep20/configs/fcn_unets5os16_spider.py.pkl,但是从该文件所在的目录来看这个pkl文件里保存的应该是模型的配置,和imageid没关系。

@123AOQW
Copy link
Author

123AOQW commented Apr 9, 2024

我的数据集中的验证集的imageid标号范围是2400~2849,一共480张图片。虽然图片编号如此,但验证集的图片并不是从训练集中抽取的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants