Hai, saya Xiaozhuang!
Hari ini kita bercakap tentang pengoptimum dalam Pytorch.
Pilihan pengoptimum mempunyai kesan langsung pada kesan latihan dan kelajuan model pembelajaran mendalam. Pengoptimum yang berbeza sesuai untuk masalah yang berbeza, dan perbezaan prestasinya boleh menyebabkan model menumpu lebih cepat dan lebih stabil, atau berprestasi lebih baik pada tugas tertentu. Oleh itu, apabila memilih pengoptimum, pertukaran dan keputusan perlu dibuat berdasarkan ciri-ciri masalah tertentu.
Oleh itu, memilih pengoptimum yang betul adalah penting untuk menyesuaikan model pembelajaran mendalam. Pilihan pengoptimum akan mempengaruhi bukan sahaja prestasi model, tetapi juga kecekapan proses latihan.
PyTorch menyediakan pelbagai pengoptimum yang boleh digunakan untuk melatih rangkaian saraf dan mengemas kini berat model. Pengoptimum ini termasuk SGD biasa, Adam, RMSprop, dsb. Setiap pengoptimum mempunyai ciri unik dan senario yang berkenaan. Memilih pengoptimum yang sesuai boleh mempercepatkan penumpuan model dan meningkatkan hasil latihan. Apabila menggunakan pengoptimum, anda perlu menetapkan hiperparameter seperti kadar pembelajaran dan pereputan berat, serta menentukan fungsi kehilangan dan parameter model. . SGD ialah algoritma pengoptimuman yang biasa digunakan untuk menyelesaikan parameter model pembelajaran mesin. Ia menganggarkan kecerunan dengan memilih sekumpulan kecil sampel secara rawak dan menggunakan arah negatif kecerunan untuk mengemas kini parameter. Ini membolehkan prestasi model dioptimumkan secara beransur-ansur semasa proses berulang. Kelebihan SGD ialah kecekapan pengiraan yang tinggi, terutamanya sesuai untuk
Penurunan kecerunan stokastik ialah algoritma pengoptimuman yang biasa digunakan untuk meminimumkan fungsi kehilangan. Ia berfungsi dengan mengira kecerunan pemberat berbanding dengan fungsi kehilangan dan mengemas kini pemberat dalam arah negatif kecerunan. Algoritma ini digunakan secara meluas dalam pembelajaran mesin dan pembelajaran mendalam.
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
optimizer = torch.optim.Adagrad(model.parameters(), lr=learning_rate)
optimizer = torch.optim.RMSprop(model.parameters(), lr=learning_rate)
optimizer = torch.optim.Adadelta(model.parameters(), lr=learning_rate)
import torchimport torch.nn as nnimport torch.optim as optimfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoaderimport matplotlib.pyplot as plt# 设置随机种子torch.manual_seed(42)# 定义数据转换transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])# 下载和加载MNIST数据集train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)# 定义简单的卷积神经网络模型class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)self.relu = nn.ReLU()self.pool = nn.MaxPool2d(kernel_size=2, stride=2)self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)self.fc1 = nn.Linear(64 * 7 * 7, 128)self.fc2 = nn.Linear(128, 10)def forward(self, x):x = self.conv1(x)x = self.relu(x)x = self.pool(x)x = self.conv2(x)x = self.relu(x)x = self.pool(x)x = x.view(-1, 64 * 7 * 7)x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return x# 创建模型、损失函数和优化器model = CNN()criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型num_epochs = 5train_losses = []train_accuracies = []for epoch in range(num_epochs):model.train()total_loss = 0.0correct = 0total = 0for inputs, labels in train_loader:optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()total_loss += loss.item()_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = correct / totaltrain_losses.append(total_loss / len(train_loader))train_accuracies.append(accuracy)print(f"Epoch {epoch+1}/{num_epochs}, Loss: {train_losses[-1]:.4f}, Accuracy: {accuracy:.4f}")# 绘制损失曲线和准确率曲线plt.figure(figsize=(10, 5))plt.subplot(1, 2, 1)plt.plot(train_losses, label='Training Loss')plt.title('Training Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.legend()plt.subplot(1, 2, 2)plt.plot(train_accuracies, label='Training Accuracy')plt.title('Training Accuracy')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.legend()plt.tight_layout()plt.show()# 在测试集上评估模型model.eval()correct = 0total = 0with torch.no_grad():for inputs, labels in test_loader:outputs = model(inputs)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = correct / totalprint(f"Accuracy on test set: {accuracy * 100:.2f}%")
Saya Xiao Zhuang, jumpa lagi lain kali!
Atas ialah kandungan terperinci Tingkatkan perkara utama Pytorch dan tingkatkan pengoptimum!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!