为我的 Npy 数据集定义 ML 模型时出现问题

问题描述 投票:0回答:1

我需要帮助为我的数据定义火炬模型。我尝试了各种方法,但似乎没有任何效果。与输入尺寸和形状相关的错误不断出现。我该如何解决这些问题?

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import torch.nn.functional as f

# Load data from .npy file
data = np.load("other py files/project_files/data/train/data.npy")
print("Data Shape: ", data.shape)  # (401, 701, 255)

data_size = data.shape[0] * data.shape[1] * data.shape[2]
print("Data Size:", data_size)  # 71680755

# Load labeling data from .npy file
labels = np.load("other py files/project_files/data/train/label.npy")
print("Label Data Shape: ", labels.shape)  # (401, 701, 255)

# Convert numpy arrays to PyTorch tensors
data_tensor = torch.Tensor(data)
labels_tensor = torch.Tensor(labels)


class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
        self.fc_input_size = data_size
        self.fc = nn.Linear(self.fc_input_size, 2)

    def forward(self, x):
        x = self.pool(f.relu(self.conv1(x)))
        x = self.pool(f.relu(self.conv2(x)))
        x = x.view(-1, self.fc_input_size)
        x = self.fc(x)
        return x

model = MyModel()
print(model)

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

dataset = TensorDataset(data_tensor, labels_tensor)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

num_epochs = 10
for epoch in range(num_epochs):
    running_loss = 0.0
    for i, data in enumerate(dataloader, 0):
        inputs, labels = data
        optimizer.zero_grad()
        outputs = model(inputs.unsqueeze(1))  # channel dimension
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 100 == 99:
            print(f"[{epoch + 1}, {i + 1}] loss: {running_loss / 100}")
            running_loss = 0.0


with torch.no_grad():
    predictions = model(data_tensor.unsqueeze(1))  # channel dimension

控制台输出:

Connected to pydev debugger (build 223.8836.43)
Data Shape:  (401, 701, 255)
Data Size: 71680755
Label Data Shape:  (401, 701, 255)
MyModel(
  (conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (fc): Linear(in_features=71680755, out_features=2, bias=True)
)

File "C:\Users\PC1\PycharmProjects\Project1\newmodel2.py", line 36, in forward
    x = x.view(-1, self.fc_input_size)
RuntimeError: shape '[-1, 71680755]' is invalid for input of size 22579200
python-BaseException
python numpy machine-learning pytorch artificial-intelligence
1个回答
0
投票

你的

fc_input_size
错了。首先,您输入
data.shape[0]
,这是数据的数量,而不是每个数据项的大小。其次,您忘记了正在执行的 2 个 MaxPool 操作,每个操作都会将空间维度减少 2 倍。

计算如下:

fc_input_size = (data.shape[1] // 4) * (data.shape[2] // 4)
© www.soinside.com 2019 - 2024. All rights reserved.