@PANES

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

質問:lossの計算、クロスエントロピー【行き詰まりました】

解決したいこと

みなさまビギナーにご教授いただけませんでしょうか

MNIST用いてCNNのデモ、をやってみています
一回だけconv2dするだけのネットワークですが、、エラーが出て行き詰まりました

間違いがあれば指摘いただけませんか?
torch.version, torchvision.version, pl.version はそれぞれ
('1.13.1+cu116', '0.14.1+cu116', '1.8.3')
でやっています

発生している問題・エラー

Predictions and targets are expected to have the same shape, but got torch.Size([1024, 10]) and torch.Size([1024]).

該当するソースコード


transform = transforms.Compose([transforms.ToTensor()])

# data import
train_val = datasets.MNIST("./", train=True, download=True, transform=transform)
test = datasets.MNIST("./", train=False, download=True, transform=transform)

#train_valをtrainとvalに分割
pl.seed_everything(0)
n_train, n_val = 50000, 10000
train, val = torch.utils.data.random_split(train_val, [n_train, n_val])

#データローダー
batch_size = 1024
train_loader = torch.utils.data.DataLoader(train, batch_size, shuffle=True, drop_last=True)
val_loader = torch.utils.data.DataLoader(val, batch_size)
test_loader = torch.utils.data.DataLoader(test, batch_size)

!pip install -q torchmetrics
import torchmetrics
from torchmetrics.functional import accuracy

#ここからクラスです ここが怪しいのではないかと思ってます
class Net(pl.LightningModule):

    def __init__(self):
        super().__init__()

        self.conv = nn.Conv2d(in_channels=1, out_channels=3, kernel_size=3, padding=1)
        self.bn = nn.BatchNorm2d(3)
        self.fc = nn.Linear(588,10)

    def forward(self, x):
        h = self.conv(x)
        h = F.relu(h)
        h = self.bn(h)
        h = F.max_pool2d(h, kernel_size=2, stride=2)
        h = h.view(-1,588)
        h = self.fc(h)
        return h

    def training_step(self, batch, batch_idx):
        x,t = batch
        y = self(x)
        loss = F.cross_entropy(y,t)
        self.log("train_loss", loss, on_step=False, on_epoch=True, prog_bar=True)
        self.log("train_acc", accuracy(y.softmax(dim=1), t, task="binary"), on_step=False, on_epoch=True, prog_bar=True)
        return loss

    def validation_step(self, batch, batch_idx):
        x,t = batch
        y = self(x)
        loss = F.cross_entropy(y,t)
        self.log("val_loss", loss, on_step=False, on_epoch=True, prog_bar=True)
        self.log("val_acc", accuracy(y.softmax(dim=1), t, task="binary") , on_step=False, on_epoch=True, prog_bar=True)
        return loss

    def test_step(self, batch, batch_idx):
        x,t = batch
        y = self(x)
        loss = F.cross_entropy(y,t)
        self.log("test_loss", loss, on_step=False, on_epoch=True, prog_bar=True)
        self.log("test_acc", accuracy(y.softmax(dim=1), t, task="binary"), on_step=False, on_epoch=True, prog_bar=True)
        return loss

    def configure_optimizers(self):
        optimizer = torch.optim.SGD(self.parameters(), lr=0.01)
        return optimizer
 
pl.seed_everything(0)
net = Net()
trainer = pl.Trainer(accelerator="gpu", devices=1, max_epochs=10, deterministic=1)

trainer.fit(net, train_loader, val_loader)

# この後error出ました

自分で試したこと

公式のF.cross_entropyを読むと、引数のshapeで
Target:
If containing class indices, shape () ,(N)、、、
If containing class probabilities, same shape as the input and each value should be between [0,1].
と記載してあるので、class indicesをclass確率と認識してしまっている??
と考えていますが、修正方法がわかりません

もしくはaccuracy計算部分のコードが間違っているのでしょうか?

0 likes

No Answers yet.

Your answer might help someone💌