Czy możemy wykorzystać model ChatGPT do wygenerowania kodu do treningu w PyTorchu? Tak i nie. Robi błędy, ale część umie poprawić. Ostatecznie proste MLP działa, po poprawkach związanych z importami. Są też problemy nie do przeskoczenia o czym niżej.
Zapytanie które wpisałem wyglądało następująco:
I need a simple pytorch training example on MNIST
Prompt
Here is a simple PyTorch example for training a model on the MNIST dataset.
First, we need to load the MNIST dataset. We can do this using PyTorch’s torchvision
package.
import torch
import torchvision
# load the MNIST dataset
mnist = torchvision.datasets.MNIST(root="./data", train=True, transform=transforms.ToTensor(), download=True)
Next, we need to split the dataset into a training set and a validation set. We can do this using PyTorch’s DataLoader
class.
Copy code<code># split the dataset into a training set and a validation set
train_loader = torch.utils.data.DataLoader(mnist, batch_size=64, shuffle=True)
val_loader = torch.utils.data.DataLoader(mnist, batch_size=64, shuffle=False)
</code>
Now, we can define our model. For this example, we will use a simple multilayer perceptron (MLP) with two hidden layers.
Copy code<code># define the model
class MLP(nn.Module):
def __init__(self):
super(MLP, self).__init__()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.Linear(128, 64)
self.fc3 = nn.Linear(64, 10)
def forward(self, x):
x = x.view(-1, 28*28)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
model = MLP()
</code>
Next, we need to define a loss function and an optimizer. For this example, we will use cross-entropy loss and the Adam optimizer.
Copy code<code># define the loss function and the optimizer
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
</code>
Now, we can train the model. This involves looping over the training data, computing the loss, and updating the model’s parameters.
Copy code<code># train the model
for epoch in range(10):
for data, target in train_loader:
# forward pass
output = model(data)
loss = criterion(output, target)
# backward pass
optimizer.zero_grad()
loss.backward()
# update the model's parameters
optimizer.step()
</code>
Finally, we can evaluate the model on the validation set. This involves looping over the validation data, computing the loss, and printing the average loss.
Copy code<code># evaluate the model
val_loss = 0.0
for data, target in val_loader:
# forward pass
output = model(data)
loss = criterion(output, target)
val_loss += loss.item()
val_loss /= len(val_loader)
print("Validation loss: {:.4f}".format(val_loss))
</code>
That’s it! This is a simple example for training
Sprawdźmy w praktyce
W pierwszej komórce z kodem jest oczywiście błąd:
Zapytajmy ChatGPT co z tym zrobić:
Po poprawce jest już ok:
Co na to ChatGPT?
lepiej, ale będzie draka z F:
No to prosimy o poprawkę:
I faktycznie jest poprawka:
Hura, trenuje się bez problemu:
Super – z dokładnością do przełączenia modelu w eval oraz wykorzystania no_grad/inference_mode przy eval 🙂
Przydałoby się accuracy…
To ciekawe – wygląda na pomyłkę max i argmax
Walczymy dalej:
Tu porażka na całej linii… Nie wiem jak zapytać by dostać dobrą odpowiedź, więc tu poprawiam ja.
prawidłowo jest oczywiscie tak:
# evaluate the model
val_loss = 0.0
val_acc = 0.0
for data, target in val_loader:
# forward pass
output = model(data)
loss = criterion(output, target)
val_loss += loss.item()
# calculate the accuracy
predicted = torch.argmax(output, 1)
correct = (predicted == target).sum().item()
val_acc += correct / len(target)
val_loss /= len(val_loader)
val_acc /= len(val_loader)
print("Validation loss: {:.4f}".format(val_loss))
print("Validation accuracy: {:.4f}".format(val_acc))
No to idźmy w prostsze rzeczy:
Niestety jest błąd:
od razu zapytałem, jak to poprawić:
Poprawka dodaje None jako target:
Co oczywiście jest błędem:
Potem jest już tylko gorzej
Niestety już nie jest w stanie tego poprawić:
Spróbujmy wymienić Transformer na implementację self-attention
Ale chwila – brakuje forward!
i proszę:
W praktyce niestety nie działa (niedostosowane rozmiary)
Tu chyba zbrakło kontekstu, że to był MNIST i że ja tylko zmieniam model…
Podsumowanie
Ja mam dość poprawiania po maszynie 🙂
Niewiele brakuje, by to działało fajnie, czy wręcz wygodnie
Tutaj znajdziesz notebook:
https://colab.research.google.com/drive/1efekY1V_qCjQQrIGnBYh_OzmMCPj8Rao?usp=sharing
Tutaj link do ChatGPT: