File size: 2,011 Bytes
216004d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python3
"""检验 external_test 的构造: 未训练模型在 6 个域上应各得 ~1/6, 不应全 1.0。"""
import sys
import numpy as np
import torch

sys.path.insert(0, "/work/liuyuanjie/headless")
sys.path.insert(0, "/work/liuyuanjie/headless/tests")
from run_lm4_wave import (build_feature_matrix, build_windows, assign_domains,
                          evaluate, StatMLP)

t1, d1, F1, ok1 = build_feature_matrix("/work/liuyuanjie/headless/data/wave",
                                       bands=13, use_wfr=True, use_lshell=True)
X1, yl1 = build_windows(t1, d1, F1, ok1)
y1, qs = assign_domains(yl1, 6)

t2, d2, F2, ok2 = build_feature_matrix("/work/liuyuanjie/headless/data/wave2016",
                                       bands=13, use_wfr=True, use_lshell=True)
X2, yl2 = build_windows(t2, d2, F2, ok2)
y2, _ = assign_domains(yl2, 6, qs=qs)
print("2016 每域样本:", np.bincount(y2, minlength=6).tolist())

dev = torch.device("cpu")
ext = {}
for dd in range(6):
    idx = np.where(y2 == dd)[0]
    _X = torch.from_numpy(X2[idx].astype(np.float32))
    _y = torch.from_numpy(y2[idx])
    ext[dd] = torch.utils.data.DataLoader(
        torch.utils.data.TensorDataset(_X, _y), batch_size=512)

torch.manual_seed(0)
m = StatMLP(n_feat=X1.shape[-1], n_classes=6, hidden=64, n_layers=2,
            head_type="linear", norm="fixed")
m.eval()
print("\n未训练模型在各域外部测试集上的准确率 (应各 ~0.167):")
for dd in range(6):
    a = evaluate(m, ext[dd], dev)
    print(f"  D{dd}: {a:.4f}   (该域样本 {len(ext[dd].dataset)})")

# 再看一个常数预测器 (全判 5) 的表现
class Const(torch.nn.Module):
    def __init__(self, c): super().__init__(); self.c = c
    def forward(self, x, agg=None):
        return torch.zeros(x.shape[0], 6).scatter_(1, torch.full((x.shape[0],1), self.c), 10.0)

cm = Const(5)
print("\n常数预测器 (全判 D5) 的表现 (D5 应 1.0, 其余 0.0):")
for dd in range(6):
    print(f"  D{dd}: {evaluate(cm, ext[dd], dev):.4f}")