The network does not learn The total loss and the inference result will be the same value every time

The total loss and the inference result will be the same value every time.

gpu cpu is working normally
detaset CIFAR100
Please tell me if there is not enough information. I will add it.

import torch
import torchvision
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torchvision import datasets, transforms
from torch.utils.data import Dataset
import time

class Firttan(nn.Module):
def init(self):
super().init()
def forward(self, inputs):
inputs=inputs.view(inputs.size(0),-1)
return inputs
class MYoptimizer():
def init(self):
self.tortal_losses=0
self.optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
self.scheduler = optim.lr_scheduler.StepLR(self.optimizer, step_size=10, gamma=0.9)
self.criterion = torch.nn.CrossEntropyLoss()

def loss(self,inputs, labels):
    self.optimizer.zero_grad()
    outputs=net(inputs)
    loss=self.criterion(outputs, labels)
    loss.backward()
    torch.nn.utils.clip_grad_norm_(net.parameters(),1,2)
    self.optimizer.step()
    self.tortal_losses+=loss.to('cpu').item()
def Done(self,epoc,timee):
    print("Epoch",epoc,"total_loss",self.tortal_losses,timee)
    self.tortal_losses=0
    self.scheduler.step()

class swish(nn.Module):
def init(self, beta = 1.25):
super().init()
self.beta = beta
def forward(self, inputs):
return inputs * torch.sigmoid(self.beta * inputs)
class DataSet:
def init(self,detas,labels):
self.X = detas # 入力
self.t = labels # 出力

def __len__(self):
    return len(self.X) # データ数(10)を返す

def __getitem__(self, index):
    # index番目の入出力ペアを返す
    return self.X[index], self.t[index]

class Net(torch.nn.Module):

def __init__(self):
    super(Net, self).__init__()
    
    self.conv1 = nn.Sequential(nn.Conv2d(3, 16, 3, padding=1),swish(),
                               nn.Conv2d(16, 16, 3, padding=1),swish(),
                               nn.MaxPool2d(2, 2),swish(),
                               nn.Conv2d(16, 32, 3, padding=1),swish(),
                               nn.Conv2d(32, 32, 3, padding=1),swish(),
                               nn.MaxPool2d(2, 2),swish(),
                               Firttan(),
                               nn.Linear(32 * 8* 8, 512),
                               swish(),
                               nn.Linear(512, 100),
                               nn.Softmax(dim=1))

def forward(self, x):
    x = self.conv1(x)
    return x

def eval_(dataloader):
correct = 0
total = 0
with torch.no_grad():
for (images, labels) in dataloader:
images, labels = images, labels

        outputs = net(images.to('cuda:0'))
        _, predicted = torch.max(outputs.to('cpu').data, 1)
        correct += (predicted == labels).sum().item()
        total += labels.size(0)

print("Val Acc",(correct/total))

cifar100_data = torchvision.datasets.CIFAR100(
‘./cifar-100’, train=True, download=True,
transform=torchvision.transforms.ToTensor())

さっき作ったDataSetクラスのインスタンスを作成

datasetをDataLoaderの引数とすることでミニバッチを作成.

batch_size=128
n_epochs = 50

dataloader = torch.utils.data.DataLoader(cifar100_data, batch_size=batch_size,shuffle=True,drop_last=True)
net = Net().to(‘cuda:0’)
net.train()
MYoptimizer=MYoptimizer()
print(“start”)
for _ in range(n_epochs):
timee=time.time()
net.train()
for inputs, labels in dataloader:
MYoptimizer.loss(inputs.to(‘cuda:0’),labels.to(‘cuda:0’))
MYoptimizer.Done(,time.time()-timee)
#テスト
net.eval()
eval
(dataloader)
print(“a”)

result
Files already downloaded and verified
start
Epoch 0 total_loss 1796.0163736343384 8.27594780921936
Val Acc 0.009995993589743589
Epoch 1 total_loss 1796.0164184570312 7.108090877532959
Val Acc 0.009935897435897435
Epoch 2 total_loss 1796.0164275169373 7.067081689834595
Val Acc 0.009995993589743589
Epoch 3 total_loss 1796.0164308547974 7.0995776653289795
Val Acc 0.009995993589743589

I can’t display the code well
How can my site recognize it as a code?

Remove the nn.Softmax at the end of your model, as nn.CrossEntropyLoss will apply F.log_softmax internally.

PS: you can post code snippets by wrapping them into three backticks ```, which makes debugging easier :wink: