巧取下标

NER任务中对 标签下标的偏移量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
a = torch.randn(2,4).softmax(dim=-1)
b = torch.randn(2,4).softmax(dim=-1)
a,b
'''
(tensor([[0.1310, 0.3604, 0.1726, 0.3360],
[0.1955, 0.3245, 0.0700, 0.4101]]),
tensor([[0.2199, 0.1130, 0.3976, 0.2695],
[0.0455, 0.0804, 0.0514, 0.8227]]))'''

scores = a.unsqueeze(1).transpose(-1,-2) @ b.unsqueeze(1)
scores
'''
tensor([[[0.0288, 0.0148, 0.0521, 0.0353],
[0.0792, 0.0407, 0.1433, 0.0971],
[0.0380, 0.0195, 0.0686, 0.0465],
[0.0739, 0.0380, 0.1336, 0.0905]],

[[0.0089, 0.0157, 0.0100, 0.1608],
[0.0148, 0.0261, 0.0167, 0.2670],
[0.0032, 0.0056, 0.0036, 0.0576],
[0.0187, 0.0330, 0.0211, 0.3374]]])'''

以上我们需要在三维张量中得到二维矩阵中最大值的坐标(x, y)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fin = torch.triu(scores)
fin
'''
tensor([[[0.0288, 0.0148, 0.0521, 0.0353],
[0.0000, 0.0407, 0.1433, 0.0971],
[0.0000, 0.0000, 0.0686, 0.0465],
[0.0000, 0.0000, 0.0000, 0.0905]],

[[0.0089, 0.0157, 0.0100, 0.1608],
[0.0000, 0.0261, 0.0167, 0.2670],
[0.0000, 0.0000, 0.0036, 0.0576],
[0.0000, 0.0000, 0.0000, 0.3374]]])'''

fin[0].argmax(), fin[0].argmax() % 4, fin[0].argmax() // 4

# (tensor(6), tensor(2), tensor(1)) ——> 0.1433

以上我们通过对argmax()返回的绝对坐标,对绝对坐标%得到列坐标(填满多少行后,余量在本行的列位),//得到行坐标(整除的行号)

接下来对fin的每个矩阵做循环即可。

JNotebook 魔法命令

%%time 可以查看运行时间

!zip !unzip

!pip

kaggle 数据加载

1
2
3
4
!mkdir -p ~/.kaggle/	# 创建一个专门的文件夹
!mv /content/kaggle.json ~/.kaggle/ # 将json转到你的kaggle文件
!kaggle competitions download -c ml2021-spring-hw7 # kaggle api 要去比赛处同意条款 获得
!unzip /content/ml2021-spring-hw7.zip #解压文件

图片查看

1
2
3
4
5
6
7
8
9
10
11
12
# 将数据集 使用dataloader装载后,使其可迭代,并用next方法调用
# samples, labels = next(iter(train_dl)) 取出第一个batch的data和target
import matplotlib.pyplot as plt

plt.figure(figsize=(10,5))
for i, imgs in enumerate(samples[:20], 0):
print(imgs.size())
npimg = imgs.numpy().transpose((1, 2, 0))
plt.subplot(2, 10, i+1)
plt.imshow(npimg, cmap=plt.cm.binary)
plt.axis('off')
print(labels[:10])

tensor转换

尽量使用torch.as_tensor(data: Any, dtype: _dtype=None, device: Optional[_device]=None)