2 回答

TA貢獻1880條經驗 獲得超4個贊
您可以利用 pytorch 的稀疏數據類型:
class SparseLinear(nn.Module):
? def __init__(self, in_features, out_features, sparse_indices):
? ? super(SparseLinear, self).__init__()
? ? self.weight = nn.Parameter(data=torch.sparse.FloatTensor(sparse_indices, torch.randn(sparse_indices.shape[1]), [in_features, out_features]), requires_grad=True)
? ? self.bias = nn.Parameter(data=torch.randn(out_features), requires_grad=True)
? def forward(self, x):
? ? return torch.sparse.admm(self.bias, self.weight, x, 1., 1.)

TA貢獻1876條經驗 獲得超6個贊
我假設您想使用密集張量來實現這種稀疏連接層。如果是這樣,您可以將要屏蔽(無連接)的元素的屏蔽矩陣(張量)定義為 0.0,否則為 1.0。在前向傳遞中,您可以簡單地將權重張量與掩碼張量相乘(您想要采用逐元素乘積,這是您在 PyTorch 中使用 * 運算符時的默認值),然后再與輸入進行矩陣乘法對于你的稀疏層。
為了使其正常工作,您必須確保您的掩模張量沒有收到梯度,否則它會在您訓練模型時更新并變得無效。為此,您只需requires_grad=False
在創建掩模張量時進行設置。
添加回答
舉報