pytorch #conv-neural-network
#pytorch #conv-нейронная сеть
Вопрос:
Я имею в виду, что в дополнение к чему-то вроде:
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(1, 10, 3)
У вас могут быть постоянные фильтры, такие как filter_vals = np.array([[-1, -1, 1], [-1, -1, 1], [-1, -1, 1]])
на том же уровне.
Комментарии:
1. Определенный вами уровень conv содержит 10 фильтров в форме 3×3, но ядро, которое вы определили, равно 4×4… Вы имели в виду заменить одно из ядер фиксированным ядром 3×3?
2. Это была просто иллюстрация, размерность имеет очень мало значения. Я это исправлю
3. Ну, это так, если вы хотите заменить веса
conv1
? Вы хотите также изменить размер ядраconv1
?
Ответ №1:
Предполагая, что вы ищете, чтобы заменить веса слоя свертки на веса, определенные в filter_vals
, вы можете сначала расширить его до количества фильтров, здесь 10
, затем заменить веса conv1
:
>>> conv1.weight.data = torch.from_numpy(filter_vals).expand_as(conv1.weight)
Ответ №2:
Я полагаю, вы хотите, чтобы случайные параметры были доступны для изучения (requires_grad), а фиксированные — нет. Я не думаю, что это должно быть сделано в одном conv
, а с двумя, с последующей конкатенацией, например:
conv1 = nn.Conv2d(1, 6, 3)
conv2 = nn.Conv2d(1, 4, 3)
conv2.weight = ...
y1 = conv1(x)
with torch.no_grad():
y2 = conv2(x)
y = torch.cat( (y1,y2), dim=3 )
Комментарии:
1. Это именно тот момент, которого я хочу избежать. поскольку начальное взвешивание матрицы, т.е. Conv2d.weight, оказывает сильное влияние на сеть, и, добавив эти жесткие фильтры, мы можем избежать этих искажений
2. Может быть, вы хотите исправить случайное начальное значение? pytorch.org/docs/stable/notes/randomness.html