質問: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