Код полносвязной НС (я знаю, что лучше сверточный, буду делать дальше), определяющий числа из набора данных MNIST. При включении точность вообще не меняется. В чем может быть ошибка? Ячейки кода я разделил линиями и пометил комментариями, что где. Заранее прошу прощения за много кода и длинные ответы.
import os
from torchvision.datasets import MNIST
from torchvision import transforms as tfs
data_tfs = tfs.Compose([
tfs.ToTensor(),
tfs.Normalize((0.5), (0.5))
])
# install for train and test
root = './'
train_dataset = MNIST(root, train=True, transform=data_tfs, download=True)
val_dataset = MNIST(root, train=False, transform=data_tfs, download=True)
train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=True)
valid_dataloader = torch.utils.data.DataLoader(val_dataset, batch_size=128, shuffle=False)
---------------------------------------------------------------
#Creating the model
activation = nn.ELU
model = nn.Sequential(
nn.Flatten(),
#YOUR CODE. Add layers to your sequential class
nn.Linear(in_features=2, out_features=128),
nn.ELU(),
nn.Linear(in_features=128, out_features=10),
nn.ELU()
)
---------------------------------------------------------------
criterion = nn.CrossEntropyLoss()#YOUR CODE. Select a loss function
optimizer = torch.optim.Adam(model.parameters())
loaders = {"train": train_dataloader, "valid": valid_dataloader}
---------------------------------------------------------------
device = "cuda" if torch.cuda.is_available() else "cpu"
---------------------------------------------------------------
max_epochs = 10
accuracy = {"train": [], "valid": []}
class Identical(nn.Module):
def forward(self, x):
return x
activation = nn.ELU
model = nn.Sequential(
nn.Flatten(),
#YOUR CODE. Add layers to your sequential class
nn.Linear(in_features=2, out_features=128),
nn.ELU(),
nn.Linear(in_features=128, out_features=10),
nn.ELU()
)
criterion = nn.CrossEntropyLoss()#YOUR CODE. Select a loss function
optimizer = torch.optim.Adam(model.parameters())
loaders = {"train": train_dataloader, "valid": valid_dataloader}
device = "cuda" if torch.cuda.is_available() else "cpu"
for epoch in range(max_epochs):
for k, dataloader in loaders.items():
epoch_correct = 0
epoch_all = 0
for x_batch, y_batch in dataloader:
if k == "train":
model.train()
optimizer.zero_grad()
outp = model(x_batch)
outp = outp[:y_batch.shape[0]] #otherwise, the last batch is less than necessary
else:
model.eval()
with torch.no_grad():
outp = model(x_batch)
outp = outp[:y_batch.shape[0]]
preds = outp.argmax(-1)
correct = (preds == y_batch).sum()
all = tuple(preds.shape)[0]
epoch_correct += correct.item()
epoch_all += all
if k == "train":
loss = criterion(outp, y_batch)
loss.backward()
optimizer.step()
if k == "train":
print(f"Epoch: {epoch+1}")
print(f"Loader: {k}. Accuracy: {epoch_correct/epoch_all}")
accuracy[k].append(epoch_correct/epoch_all)
Подробнее здесь: https://stackoverflow.com/questions/790 ... not-change