【发布时间】:2021-07-10 00:50:48
【问题描述】:
我正在尝试将以下模型转换为 pytorch:
def get_model():
model = keras.models.Sequential()
model.add(Conv2D(64, kernel_size=(3,3), activation='relu', padding='same', input_shape=(9,9,1)))
model.add(BatchNormalization())
model.add(Conv2D(64, kernel_size=(3,3), activation='relu', padding='same'))
model.add(BatchNormalization())
model.add(Conv2D(128, kernel_size=(1,1), activation='relu', padding='same'))
model.add(Flatten())
model.add(Dense(81*9))
model.add(Reshape((-1, 9)))
model.add(Activation('softmax'))
return model
model = get_model()
adam = keras.optimizers.Adam(lr=.001)
model.compile(loss='sparse_categorical_crossentropy', optimizer=adam)
model.fit(x_train, y_train, batch_size=32, epochs=2)
来自https://github.com/shivaverma/Sudoku-Solver/blob/master/model.py
class Conv2dSame(torch.nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, padding, bias=True, padding_layer=torch.nn.ReflectionPad2d):
"""It only support square kernels and stride=1, dilation=1, groups=1."""
super(Conv2dSame, self).__init__()
self.net = nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size, bias=bias, padding=padding),
nn.ReLU(True),
)
def forward(self, x):
return self.net(x)
CNN 类(torch.nn.Module):
def __init__(self, hidden_channels, batch_size):
super(CNN, self).__init__()
self.hidden_channels = hidden_channels
self.batch_size = batch_size
self.embed = nn.Sequential(
Conv2dSame(1, hidden_channels, 3, 1),
nn.BatchNorm2d(hidden_channels),
Conv2dSame(hidden_channels, hidden_channels, 3, 1),
nn.BatchNorm2d(hidden_channels),
Conv2dSame(hidden_channels, 2*hidden_channels, 1, 0),
)
self.out = nn.Sequential(
nn.Linear(2*hidden_channels*81, 81*9),
)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
embed = self.embed(x)
embed = embed.view(-1, 2*self.hidden_channels*81)
out = self.out(embed).view(-1,9,81)
return self.softmax(out)
但它似乎并不适用:
model = CNN(hidden_channels=64,batch_size=32) # GCN(hidden_channels=64)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001) #0.01
criterion = nn.CrossEntropyLoss()
def train():
model.train()
for batch_i, data in tqdm(enumerate(train_loader)): # Iterate in batches over the training dataset.
optimizer.zero_grad() # Clear gradients.
unsolved = data[0]
solved = data[1]
out = model(unsolved) # data.x, data.edge_index, data.batch) # Perform a single forward pass.
loss = criterion(out, solved) # Compute the loss.
if batch_i % 100 == 0:
print(loss)
loss.backward() # Derive gradients.
optimizer.step() # Update parameters based on gradients.
batch_size = 32 #64
num_epochs = 2
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=0)
for _ in range(num_epochs):
train()
我的损失一直停滞不前,而且我的准确性很差。我知道 keras 代码工作正常。如果我误解了 keras 代码的任何部分,请告诉我。或者,如果我的 pytorch 实现已关闭。我对 keras(和 pytorch)非常陌生。谢谢!
【问题讨论】:
-
3 件快速的事情:1. 你的第一个代码是 [Conv - ReLU - batch norm],但是你的 pytorch 代码是 [Conv - batch norm - ReLU],2. 你在 batch norm 之前使用了偏差layer,一般不推荐,和3.你reshapes不一样,这是故意的吗?
-
relu 和 batchnorm 非常棒!我已经更新了我的代码,但它似乎仍然不起作用:/。重塑是故意的,因为 keras 似乎最后有通道,但 pytorch 首先有通道。就偏差而言,我很确定偏差也在 keras 代码中,不是吗?
标签: machine-learning keras pytorch