0%

1
2
3
4
5
git tag -a <版本号> -m "<备注信息>"

git tag -d <版本号>

git push origin --tags

在cv和numpy中截取区域的操作是不一样的
xmin, xmax, ymin, ymax

cv.draw(xmin: xmax, ymin: ymax)

a[ymin:ymax, xmin:xmax]

1
2
3
4
5
6
7
8
9
ignored_params = list(map(id, model.fc.parameters()))
base_params = filter(lambda p: id(p) not in ignored_params,
model.parameters())

optimizer = torch.optim.SGD([
{'params': base_params},
{'params': model.fc.parameters(), 'lr': opt.lr}
], lr=opt.lr*0.1, momentum=0.9)

右对齐

1
2
3
A      (4d array):  8 x 1 x 6 x 1
B (3d array): 7 x 1 x 5
Result (4d array): 8 x 7 x 6 x 5

一层集装箱,每个集装箱里面装了物体, 如果一层的物体的stride是一样的,那么就合并成一个。

1
2
3
4
5
6
7
8
9
10
typedef struct THStorage
{
real *data;
ptrdiff_t size;
int refcount;
char flag;
THAllocator *allocator;
void *allocatorContext;
struct THStorage *view;
} THStorage;
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct THTensor
{
int64_t *size; // 注意是指针
int64_t *stride; // 注意是指针
int nDimension;

// Note: storage->size may be greater than the recorded size
// of a tensor
THStorage *storage;
ptrdiff_t storageOffset;
int refcount;
char flag;
} THTensor;

a = b
只有当a[:], a[1]的时候b会发生变化;
如果只是a=b, 那么只是改变了引用。

1
2
3
4
5
6
7
a = np.zeros((2,2))
b = a[0]
b[0] = 1
print(a)

[[ 1. 0.]
[ 0. 0.]]
1
2
3
4
5
6
7
a = np.zeros((2,2))
b = a[0]
b = np.ones(10)
print(a)

[[ 0. 0.]
[ 0. 0.]]

函数传入参数也是如此

1
2
3
4
a = torch.Tensor([1, 3])
b = torch.Tensor([1, 4])
torch.sum(a == b) * 1.0 / 3 # ==> 0
torch.sum(a == b).item() * 1.0 / 3

使用MAE损失(特别是对于神经网络)的一个大问题是它的梯度始终是相同的,这意味着即使对于小的损失值,其梯度也是大的。这对模型的学习可不好。为了解决这个问题,我们可以使用随着接近最小值而减小的动态学习率。MSE在这种情况下的表现很好,即使采用固定的学习率也会收敛。MSE损失的梯度在损失值较高时会比较大,随着损失接近0时而下降,从而使其在训练结束时更加精确(参见下图)

如果我们只给一个预测结果来最小化MSE,那么该预测值应该是所有目标值的均值。但是如果我们试图最小化MAE,那么这个预测就是所有目标值的中位数。我们知道中位数对于离群点比平均值更鲁棒,这使得MAE比MSE更加鲁棒。