【发布时间】:2021-04-13 09:42:52
【问题描述】:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
from torch.autograd import Variable
from sklearn import preprocessing
batch_size = 32
num_classes = 8
epochs = 10
img_rows, img_cols = 256, 256
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
print('x_train shape:', x_train.shape)
print("Training samples: {}".format(x_train.shape[0]))
print("Test samples: {}".format
(x_test.shape[0]))
x_train = torch.Tensor(x_train).float()
x_test = torch.Tensor(x_test).float()
y_train = torch.LongTensor(y_train)
y_test = torch.LongTensor(y_test)
#Define model
model = nn.Sequential(
nn.Conv2d(256,80,1, stride=1),
nn.ReLU(),
nn.Conv2d(80,40,1, stride=1),
nn.ReLU(),
nn.MaxPool2d(4,stride=1),
nn.Conv2d(40,30,1, stride=1),
nn.ReLU(),
nn.Conv2d(30,15,1, stride=1),
nn.ReLU(),
nn.Dropout(0.2),
nn.Flatten(),
nn.Linear(32, 32),
nn.Dropout(0.1),
nn.Linear(num_classes, 256),
nn.ReLU()
)
criterion = nn.CrossEntropyLoss()# cross entropy loss
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
for epoch in range(100):
optimizer.zero_grad()
out = model(x_train)
loss = criterion(out, y_train)
loss.backward()
optimizer.step()
print(f"Epoch {epoch+1}, loss: {loss.item()}")
但是,当我运行此代码时,它会在此特定行产生错误
RuntimeError Traceback (most recent call last)
<ipython-input-10-96fa8b09f1ec> in <module>
63 for epoch in range(100):
64 optimizer.zero_grad()
---> 65 out = model(x_train)
66 loss = criterion(out, y_train)
67 loss.backward()
带有以下错误信息
RuntimeError:给定输入大小:(40x256x1)。计算的输出大小:(40x253x-2)。输出尺寸太小
我不确定如何解决这个问题,因为我是 pytorch 的新手,并且原始模型在 tensorflow 中确实有效。 任何帮助将不胜感激
【问题讨论】:
-
PyTorch 版本:1.7.1 我正在使用带有以下软件版本的 GPU 处理 NN:Python 3.7.9 Pandas 1.2.0 Scikit-Learn 0.23.2
-
你的 x_train 形状是什么?
-
请注意,您同时在整个数据集上训练模型,但我假设您希望每步通过 32 个(如您在
batch_size中指定的)样本 -
如果你组织得好,我认为你必须将
Sequential()中的第一层从nn.Conv2d(256,80,1, stride=1)更改为nn.Conv2d(32,80,1, stride=1)才能解决你的问题 -
x_train 形状:(241, 256, 256, 1)
标签: python image-processing pytorch conv-neural-network