这个问题发过一次了,convert"rgb"已经试过了,不行,请各位大佬提供其他的解决方案,问题如下,
报错:
Traceback (most recent call last):
File "D:/Users/weiran/PycharmProjects/hello_world/test.py", line 100, in <module>
out = model(img)
File "D:\Users\weiran\PycharmProjects\hello_world\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
result = self.forward(*input, **kwargs)
File "D:\Users\weiran\PycharmProjects\hello_world\net.py", line 51, in forward
x=self.layer1(x)
File "D:\Users\weiran\PycharmProjects\hello_world\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
result = self.forward(*input, **kwargs)
File "D:\Users\weiran\PycharmProjects\hello_world\lib\site-packages\torch\nn\modules\container.py", line 119, in forward
input = module(input)
File "D:\Users\weiran\PycharmProjects\hello_world\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl
result = self.forward(*input, **kwargs)
File "D:\Users\weiran\PycharmProjects\hello_world\lib\site-packages\torch\nn\modules\conv.py", line 399, in forward
return self._conv_forward(input, self.weight, self.bias)
File "D:\Users\weiran\PycharmProjects\hello_world\lib\site-packages\torch\nn\modules\conv.py", line 396, in _conv_forward
self.padding, self.dilation, self.groups)
RuntimeError: Given groups=1, weight of size [16, 3, 3, 3], expected input[64, 227, 227, 3] to have 3 channels, but got 227 channels instead
代码主段
import torch
from torch import nn, optim
from torch.autograd import Variable
from torch.utils.data import DataLoader, Dataset
from torchvision import datasets, transforms
import glob
import os
from net import simpleNet, CNNNet
from PIL import Image
import numpy as np
import numpy
batch_size = 64
learning_rate = 1e-2
num_epoches = 20
data_tf = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize([0.5],[0.5])])
pic_dir_positive = "D:\\kaoyan\\minst_pytorch\\Positive"
pic_dir_negative = "D:\\kaoyan\\minst_pytorch\\Negative"
pic_path_pos = os.path.join(pic_dir_positive, "*.jpg")
pic_path_nag = os.path.join(pic_dir_negative, "*.jpg")
pic_list_pos = glob.glob(pic_path_pos)
pic_list_nag = glob.glob(pic_path_nag)
train_list_pos = list()
train_list_nag = list()
test_list_pos = list()
test_list_nag = list()
for i, pic in enumerate(pic_list_pos):
if i % 5 == 0:
test_list_pos.append([pic,1])
else:
train_list_pos.append([pic,1])
for i, pic in enumerate(pic_list_nag):
if i%5 == 0:
test_list_nag.append([pic,0])
else:
train_list_nag.append([pic,0])
train_list = train_list_pos + train_list_nag
test_list = test_list_pos + test_list_nag
print(len(train_list))
print(len(test_list))
train_array_list=list()
for pic,label in train_list:
img_pil = Image.open(pic)
img_pil_1 = np.array(img_pil)
img_tensor = torch.from_numpy(img_pil_1)
train_array_list.append((img_tensor,label))
test_array_list=list()
for pic,label in test_list:
img_pil_ = Image.open(pic)
img_pil_2 = np.array(img_pil_)
img_tensor = torch.from_numpy(img_pil_2)
test_array_list.append((img_tensor,label))
class mydataset(Dataset):
def __init__(self, tensor_label):
self.data = tensor_label
{1}
def __getitem__(self, i):
return self.data[i]
{1}
def __len__(self):
return len(self.data)
{1}
train_data = mydataset(train_array_list)
test_data = mydataset(test_array_list)
train_loader= DataLoader(train_data,batch_size=64,shuffle=True)
test_loader = DataLoader(test_data,batch_size=64,shuffle=True)
{1}
model = CNNNet()
{1}
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
{1}
model.eval()
eval_loss = 0
eval_acc = 0
{1}
for ep in range(20):
train_acc = 0
model.train()
{1}
for data in train_loader:
{1}
img, label = data
img = Variable(img)
label = Variable(label)
out = model(img)
loss = criterion(out, label)
_, pred = torch.max(out, 1)
optimizer.zero_grad()
loss.backward()
optimizer.step()
num_correct = (pred == label).sum()
train_acc += num_correct.item()
print('Training Acc: {:.6f}'.format(train_acc / (len(train_data))))
{1}
model.eval()
num_correct = 0
eval_loss = 0
for data in test_loader:
img, label = data
img = Variable(img)
label = Variable(label)
out = model(img)
loss = criterion(out, label)
eval_loss += loss.item()
_, pred = torch.max(out, 1)
num_correct = (pred == label).sum()
eval_acc += num_correct.item()
{1}
print('Test Loss: {:.6f}, Acc: {:.6f}'.format(eval_loss / (len(test_data)), eval_acc / (len(test_data))))
网络代码
class CNNNet(nn.Module):
def __init__(self):
super(CNNNet,self).__init__()
self.layer1=nn.Sequential(
nn.Conv2d(3,16,kernel_size=3),
nn.ReLU(inplace=True)
)
self.layer2 = nn.Sequential(
nn.Conv2d(16,32,kernel_size=3),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.layer3=nn.Sequential(
nn.Conv2d(32,64,kernel_size=3),
nn.ReLU(inplace=True)
)
self.layer4 = nn.Sequential(
nn.Conv2d(64,128,kernel_size=3),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.fc=nn.Sequential(
nn.Linear(128*4*4,1024),
nn.ReLU(inplace=True),
nn.Linear(1024,128),
nn.ReLU(inplace=True),
nn.Linear(128,10)
)
def forward(self, x):
x=self.layer1(x)
x=self.layer2(x)
x=self.layer3(x)
x=self.layer4(x)
x=x.view(x.size(0),-1)
x=self.fc(x)
return x
RuntimeError: Given groups=1, weight of size [16, 3, 3, 3], expected input[64, 227, 227, 3] to have 3 channels, but got 227 channels instead
也就是输入是batch_size=64,输入图片的大小为227*227,三通道,但你的输入不对,你print一下你的输入图像的大小,是227*227,三通道吗?看一下你的图像是不是是黑白和彩色图像都有?
你试一下在44和51行img_pil = Image.open(pic)后面加上.convert('RGB'),看看可不可以
输入输出维度不对
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632