Gan*_*rei 8 neural-network deep-learning keras tensorflow pytorch
我也曾在定制模块中遇到过这种情况,但在本示例中,我专门使用了官方 PyTorch 示例之一和 MNIST 数据集。
我已经使用 Eager 模式在 Keras 和 TF2 中移植了确切的架构,如下所示:
model = keras.models.Sequential([ keras.layers.Conv2D(32, (3, 3) , input_shape=(28,28,1), activation='relu'),
keras.layers.Conv2D(64, (3, 3)),
keras.layers.MaxPool2D((2, 2)),
keras.layers.Dropout(0.25),
keras.layers.Flatten(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dropout(0.5),
keras.layers.Dense(10, activation='softmax')]
)
model.summary()
model.compile(optimizer=keras.optimizers.Adadelta(), loss=keras.losses.sparse_categorical_crossentropy, metrics=['accuracy'])
model.fit(train_data,train_labels,batch_size=64,epochs=30,shuffle=True, max_queue_size=1)
Run Code Online (Sandbox Code Playgroud)
PyTorch 中的训练循环是:
def train(args, model, device, train_loader, optimizer, epoch):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target)
loss.backward()
optimizer.step()
Run Code Online (Sandbox Code Playgroud)
和我一起为每个时代计时:
for epoch in range(1, args.epochs + 1):
since = time.time()
train(args, model, device, train_loader, optimizer, epoch)
# test(args, model, device, test_loader)
# scheduler.step()
time_elapsed = time.time() - since
print('Training complete in {:.0f}m {:.0f}s'.format(
time_elapsed // 60, time_elapsed % 60))
Run Code Online (Sandbox Code Playgroud)
我已经证实:
Keras 版本每 epoch 运行大约 4-5 秒,而 PyTorch 版本每 epoch 运行大约 9-10 秒。
为什么会这样,这次我该如何改进?
我认为必须考虑到一个细微的区别;我最好的选择/预感如下:它不是每个 GPU 本身的处理时间,而是max_queue_size=10参数,在 Keras 中默认为 10。
由于默认情况下,在 PyTorch 的正常 for 循环中,数据不会排队,因此 Keras 受益的队列允许更快地将数据从 CPU 传输到 GPU;从本质上讲,用于馈送 GPU 的时间要少得多,因为它从内部队列中消耗得更快/将数据从 CPU 传输到 GPU 的开销减少了。
除了我之前的观察,我看不出任何其他明显的差异,也许其他人可以指出新的发现。
| 归档时间: |
|
| 查看次数: |
807 次 |
| 最近记录: |