为什么Pytork和Keras的实现会产生截然不同的结果?
我正在尝试训练一个一维ConvNet,用于本文所示的时间序列分类(参考FCN om图1b) Keras的实现给了我非常优越的性能。有人能解释一下为什么会这样吗 Pytorch的代码如下所示:为什么Pytork和Keras的实现会产生截然不同的结果?,keras,pytorch,Keras,Pytorch,我正在尝试训练一个一维ConvNet,用于本文所示的时间序列分类(参考FCN om图1b) Keras的实现给了我非常优越的性能。有人能解释一下为什么会这样吗 Pytorch的代码如下所示: class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv1d(x_train.shape[1], 128, 8) self.bnorm1 = nn.
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv1d(x_train.shape[1], 128, 8)
self.bnorm1 = nn.BatchNorm1d(128)
self.conv2 = nn.Conv1d(128, 256, 5)
self.bnorm2 = nn.BatchNorm1d(256)
self.conv3 = nn.Conv1d(256, 128, 3)
self.bnorm3 = nn.BatchNorm1d(128)
self.dense = nn.Linear(128, nb_classes)
def forward(self, x):
c1=self.conv1(x)
b1 = F.relu(self.bnorm1(c1))
c2=self.conv2(b1)
b2 = F.relu(self.bnorm2(c2))
c3=self.conv3(b2)
b3 = F.relu(self.bnorm3(c3))
output = torch.mean(b3, 2)
dense1=self.dense(output)
return F.softmax(dense1)
model = Net()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.5, momentum=0.99)
losses=[]
for t in range(1000):
y_pred_1= model(x_train.float())
loss_1 = criterion(y_pred_1, y_train.long())
print(t, loss_1.item())
optimizer.zero_grad()
loss_1.backward()
optimizer.step()
为了进行比较,我使用以下Keras代码:
x = keras.layers.Input(x_train.shape[1:])
conv1 = keras.layers.Conv1D(128, 8, padding='valid')(x)
conv1 = keras.layers.BatchNormalization()(conv1)
conv1 = keras.layers.Activation('relu')(conv1)
conv2 = keras.layers.Conv1D(256, 5, padding='valid')(conv1)
conv2 = keras.layers.BatchNormalization()(conv2)
conv2 = keras.layers.Activation('relu')(conv2)
conv3 = keras.layers.Conv1D(128, 3, padding='valid')(conv2)
conv3 = keras.layers.BatchNormalization()(conv3)
conv3 = keras.layers.Activation('relu')(conv3)
full = keras.layers.GlobalAveragePooling1D()(conv3)
out = keras.layers.Dense(nb_classes, activation='softmax')(full)
model = keras.models.Model(inputs=x, outputs=out)
optimizer = keras.optimizers.SGD(lr=0.5, decay=0.0, momentum=0.99)
model.compile(loss='categorical_crossentropy', optimizer=optimizer)
hist = model.fit(x_train, Y_train, batch_size=x_train.shape[0], nb_epoch=2000)
我所看到的两者之间的唯一区别是初始化,但结果却大不相同。作为参考,我对这两个数据集使用了如下相同的预处理,在输入形状上有细微的差异,Pytorch(批次大小,通道,长度)和Keras:(批次大小,长度,通道)。不同结果的原因是层和优化器的默认参数不同。例如,在
pytorch
中,batch norm
的衰变率被认为是0.9
,而在keras
中则是0.99
。同样,默认参数中可能还有其他变化
如果使用相同的参数和固定的随机种子进行初始化,则两个库的结果不会有太大差异