我需要帮助为我的数据定义火炬模型。我尝试了各种方法,但似乎没有任何效果。与输入尺寸和形状相关的错误不断出现。我该如何解决这些问题?
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
你的
fc_input_size
错了。首先,您输入 data.shape[0]
,这是数据的数量,而不是每个数据项的大小。其次,您忘记了正在执行的 2 个 MaxPool 操作,每个操作都会将空间维度减少 2 倍。
计算如下:
fc_input_size = (data.shape[1] // 4) * (data.shape[2] // 4)