Я пытаюсь создать пользовательскую модель для обучения в PyTorch, и, короче говоря, мне нужно создать тензор со всеми элементами, установленными в ноль, за исключением прямоугольного субдиагонального блока. Крайне важно, что процесс оптимизации должен затрагивать только элементы этого субдиагонального блока, оставляя все нули нетронутыми. Для этого я определил собственную сеть pytorch и определил свой прямоугольный блок с помощью nn.Parameter
Код: Выделить всё
class My_Network(nn.Module):
def __init__(self , vertical_dim , horizontal_dim):
super().__init__()
self.total_dim = vertical_dim + horizontal_dim
self.subdiagonal_block = nn.Parameter(torch.rand(vertical_dim , horizontal_dim))
Таким образом, поправьте меня, если я ошибаюсь, PyTorch должен инициализировать значения этого тензора случайными значениями и зарегистрировать их как параметры модели, подлежащей оптимизации во время обучения. Но теперь я застрял, я хочу сказать PyTorch построить тензор квадратной матрицы с размером, равным self.total_dim, то есть все нули, за исключением субдиагонального блока, и, как я говорил в вычислении который я определю в прямом методе, pytorch должен обучать только субдиагональный блок.
Я могу добавить тензор нулей по своему усмотрению, не устанавливая его в качестве параметра модели, вот так (если не ошибаюсь):
Код: Выделить всё
class My_Network(nn.Module):
def __init__(self , vertical_dim , horizontal_dim):
super().__init__()
self.total_dim = vertical_dim + horizontal_dim
self.subdiagonal_block = nn.Parameter(torch.rand(vertical_dim , horizontal_dim))
self.total_zero_tensor = torch.zeros(self.total_dim, self.total_dim)
Но как мне теперь сказать PyTorch, чтобы он вставил мой поддиагональный блок в левый нижний угол этой матрицы нулей? Мне нужно определить эту матрицу для последующих вычислений (мне нужно будет выполнить умножение матриц), но важно, чтобы только небольшой субдиагональный блок рассматривался как набор параметров, подлежащих обучению.
Подробнее здесь:
https://stackoverflow.com/questions/777 ... -trainable