Keras 自编码器转 PyTorch 实现 - 代码对比和优化
Keras 自编码器转 PyTorch 实现 - 代码对比和优化
本文将演示如何将使用 Keras 构建的自动编码器模型转化为 PyTorch 代码,并提供代码优化建议,以提升模型训练效率和性能。
Keras 代码:
input_data = Input(shape=(len(SampleFeature[0]),))
encoded_input = Input(shape=(encoding_dim2,))
# dense 是全连接层 ---- embedding
# 公式(12)
encoded1 = Dense(encoding_dim1, activation='relu')(input_data)
encoded2 = Dense(encoding_dim2, activation='relu')(encoded1)
decoded1 = Dense(encoding_dim1, activation='relu')(encoded2)
# 公式(13)
decoded2 = Dense(1114, activation='sigmoid')(decoded1)
autoencoder = Model(inputs=input_data, outputs=decoded2)
decoder_layer = autoencoder.layers[-1]
encoder = Model(inputs=input_data, outputs=encoded2)
# Adam 优化
# loss 函数为 二元交叉熵 binary_cross entropy
# 公式(14)
autoencoder.compile(optimizer=Adam(lr=0.001, beta_1=0.9, beta_2=0.999,
epsilon=None, decay=0.0, amsgrad=False), loss='binary_crossentropy')
# 每次迭代 数据大小为128 迭代300次
# 在验证损失不再改善5个时期时停止训练 早期停止策略
autoencoder.fit(x_train, x_train, epochs=300, batch_size=128, shuffle=True,
validation_data=(x_test, x_test),callbacks=[EarlyStopping(monitor='val_loss', min_delta=0.0001, patience=5)])
PyTorch 代码:
import torch
import torch.nn as nn
import torch.optim as optim
class Autoencoder(nn.Module):
def __init__(self, encoding_dim1, encoding_dim2):
super(Autoencoder, self).__init__()
self.encoder1 = nn.Linear(1114, encoding_dim1)
self.encoder2 = nn.Linear(encoding_dim1, encoding_dim2)
self.decoder1 = nn.Linear(encoding_dim2, encoding_dim1)
self.decoder2 = nn.Linear(encoding_dim1, 1114)
self.activation = nn.ReLU()
self.sigmoid = nn.Sigmoid()
def encode(self, x):
x = self.activation(self.encoder1(x))
x = self.activation(self.encoder2(x))
return x
def decode(self, x):
x = self.activation(self.decoder1(x))
x = self.sigmoid(self.decoder2(x))
return x
def forward(self, x):
x = self.encode(x)
x = self.decode(x)
return x
autoencoder = Autoencoder(encoding_dim1, encoding_dim2)
optimizer = optim.Adam(autoencoder.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
criterion = nn.BCELoss()
# 将数据转换为 Tensor
x_train_tensor = torch.tensor(x_train, dtype=torch.float32)
x_test_tensor = torch.tensor(x_test, dtype=torch.float32)
# 每次迭代数据大小为128,迭代300次
# 在验证损失不再改善5个时期时停止训练 早期停止策略
for epoch in range(300):
for i in range(0, len(x_train_tensor), 128):
batch_x = x_train_tensor[i:i+128]
output = autoencoder(batch_x)
loss = criterion(output, batch_x)
optimizer.zero_grad()
loss.backward()
optimizer.step()
with torch.no_grad():
val_output = autoencoder(x_test_tensor)
val_loss = criterion(val_output, x_test_tensor)
if epoch % 10 == 0:
print("Epoch: {}, Train Loss: {:.5f}, Val Loss: {:.5f}".format(epoch+1, loss.item(), val_loss.item()))
if val_loss < best_loss:
best_loss = val_loss
patience = 0
else:
patience += 1
if patience >= 5:
print("Early stopping...")
break
# 获取编码器
encoder = nn.Sequential(
autoencoder.encoder1,
autoencoder.activation,
autoencoder.encoder2,
autoencoder.activation
)
代码对比和优化:
- 模型定义: Keras 使用
Input和Model来定义模型结构,PyTorch 使用nn.Module类。PyTorch 代码更简洁,并利用了面向对象的特性,可以方便地扩展和修改模型。 - 损失函数: Keras 使用
compile方法指定损失函数,PyTorch 使用nn.BCELoss()对象。 - 优化器: Keras 使用
Adam类,PyTorch 使用optim.Adam类。 - 训练过程: Keras 使用
fit方法训练模型,PyTorch 使用手动循环遍历数据,并调用optimizer.step()更新参数。PyTorch 代码更灵活,可以更好地控制训练过程。 - 早停机制: Keras 使用
EarlyStopping回调函数,PyTorch 使用手动实现。PyTorch 代码需要手动记录验证损失和 patience 值,以判断是否停止训练。 - 编码器获取: Keras 使用
Model类创建编码器,PyTorch 使用nn.Sequential类。PyTorch 代码更简洁,并可以方便地获取模型的特定层。
代码优化建议:
- 使用
torch.utils.data.DataLoader加载数据,可以提高数据读取效率。 - 使用
nn.DataParallel或torch.distributed.launch等技术进行多 GPU 训练,可以加速模型训练。 - 使用
torch.backends.cudnn.benchmark = True开启 CUDNN 性能优化,可以提高模型运行速度。 - 使用
torch.profiler分析模型运行时间,找到性能瓶颈,并进行优化。
结论:
本文演示了如何将使用 Keras 构建的自动编码器模型转化为 PyTorch 代码,并提供了代码优化建议。通过利用 PyTorch 的灵活性和高效性,可以更好地构建和训练深度学习模型。
原文地址: https://www.cveoy.top/t/topic/m06d 著作权归作者所有。请勿转载和采集!