Rumah > Artikel > Peranti teknologi > Tingkatkan perkara utama Pytorch dan tingkatkan pengoptimum!
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)(2) AdamAdam ialah algoritma pengoptimuman kadar pembelajaran adaptif yang menggabungkan idea AdaGrad dan RMSProp. Berbanding dengan algoritma turunan kecerunan tradisional, Adam boleh mengira kadar pembelajaran yang berbeza untuk setiap parameter untuk menyesuaikan diri dengan lebih baik kepada ciri-ciri parameter yang berbeza. Dengan menyesuaikan kadar pembelajaran secara adaptif, Adam boleh meningkatkan kelajuan penumpuan dan prestasi model.
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)(3) AdagradAdagrad ialah algoritma pengoptimuman kadar pembelajaran adaptif yang melaraskan kadar pembelajaran berdasarkan kecerunan sejarah parameter. Walau bagaimanapun, apabila kadar pembelajaran berkurangan secara beransur-ansur, latihan mungkin berhenti lebih awal.
optimizer = torch.optim.Adagrad(model.parameters(), lr=learning_rate)(4) RMSPropRMSProp juga merupakan algoritma kadar pembelajaran adaptif yang melaraskan kadar pembelajaran dengan mengambil kira purata gelongsor kecerunan.
optimizer = torch.optim.RMSprop(model.parameters(), lr=learning_rate)(5) AdadeltaAdadelta ialah algoritma pengoptimuman kadar pembelajaran adaptif dan versi RMSProp yang dipertingkat, yang melaraskan kadar pembelajaran secara dinamik dengan mengambil kira purata bergerak kecerunan dan purata bergerak parameter.
optimizer = torch.optim.Adadelta(model.parameters(), lr=learning_rate)Satu kes lengkapDi sini, mari kita bincangkan tentang cara menggunakan PyTorch untuk melatih rangkaian neural convolutional (CNN) mudah untuk pengecaman digit tulisan tangan. Kes ini menggunakan set data MNIST dan menggunakan pustaka Matplotlib untuk melukis keluk kerugian dan keluk ketepatan.
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}%")Dalam kod di atas, kami mentakrifkan rangkaian neural convolutional (CNN) mudah, dilatih menggunakan kehilangan entropi silang dan pengoptimum Adam. Semasa proses latihan, kami merekodkan kehilangan dan ketepatan setiap zaman, dan menggunakan perpustakaan Matplotlib untuk melukis keluk kerugian dan keluk ketepatan.
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!