Python CNN过于适合少数族裔

Python CNN过于适合少数族裔,python,deep-learning,conv-neural-network,pytorch,Python,Deep Learning,Conv Neural Network,Pytorch,我是开发CNN的新手,目前正在使用PyTorch制作一个二值图像分类器。我的数据集严重不平衡,我已经手动增加了我的测试分割和训练分割以达到平衡。我有一个0类(训练集有6500个图像),还有一个1类(训练集有5200个图像)。当我尝试使用skorch的拟合函数时,我得到的验证精度相当于集合中1类图像的百分比,并且我的预测函数仅为所有图像输出1 这是我改编CNN的教程: 这是我的CNN:(根据教程改编) 导入火炬 导入torch.nn作为nn 将torch.optim导入为optim 导入torch

我是开发CNN的新手,目前正在使用PyTorch制作一个二值图像分类器。我的数据集严重不平衡,我已经手动增加了我的测试分割和训练分割以达到平衡。我有一个0类(训练集有6500个图像),还有一个1类(训练集有5200个图像)。当我尝试使用skorch的拟合函数时,我得到的验证精度相当于集合中1类图像的百分比,并且我的预测函数仅为所有图像输出1

这是我改编CNN的教程:

这是我的CNN:(根据教程改编)

导入火炬
导入torch.nn作为nn
将torch.optim导入为optim
导入torchvision.transforms作为变换
将torchvision.dataset导入为数据集
将torchvision.models导入为模型
将numpy作为np导入
从numpy导入数组
作为pd进口熊猫
从skorch导入神经网络分类器
从skorch.helper导入预定义的分割
从skorch.callbacks导入LRScheduler
从skorch.callbacks导入检查点
从skorch.callbacks导入冷冻库
从PIL导入图像
进口斯科奇
导入操作系统
进口cv2
导入glob
从sklearn.pipeline导入功能联合,管道
从sklearn.preprocessing导入StandardScaler、MinMaxScaler、Normalizer
#定义转换(与不在线转换相同)
#先前手动扩充的
train_transforms=变换。组合([
#transforms.RandomResizedCrop(224),
#transforms.RandomHorizontalFlip(),
变换。中心裁剪(224),
transforms.ToTensor(),
转换。规范化([0.485,0.456,0.406],
[0.229, 0.224, 0.225])
])
val_transforms=transforms.Compose([
#变换。调整大小(256),
变换。中心裁剪(224),
transforms.ToTensor(),
转换。规范化([0.485,0.456,0.406],
[0.229, 0.224, 0.225])
])
train\u ds=datasets.ImageFolder(train\u分割路径,train\u变换)
val\u ds=datasets.ImageFolder(测试路径,val\u转换)
检查点(
f_params='best'u model.pt',monitor='valid'u acc'u best')
#目前正在将ResNet与一些层一起使用
类预训练模型(nn.模块):
定义初始化(自、输出功能):
super()。\uuuu init\uuuuu()
model=models.resnet152(预训练=True)
#不想改变训练前的重量
对于model.parameters()中的参数:
param.requires_grad=False
num_features=model.fc.in_features
fc_层=nn.顺序(
nn.线性(数字特征,4096),
nn.ReLU(就地=真),
nn.辍学率(p=0.3),
nn.线性(4096,输出特性),
nn.ReLU(就地=真),
nn.辍学率(p=0.3),
)
model.fc=fc\u层
self.model=model
def前进(自身,x):
返回自我模型(x)
use_cuda=torch.cuda.u是否可用()
net=神经网络分类器(
模块=预训练模型,
模块输出特性=2,
标准=nn.交叉熵,
批次尺寸=16,
lr=0.0001,
最大纪元=3,
优化器=optim.Adam,
列车分割=预定义的列车分割(val\U ds),
回调=[checkpoint],
device=torch.device(“cuda”如果torch.cuda.is_可用()否则为“cpu”)
)
净配合(序列号,y=无)
以下是拟合函数的结果:

第1阶段:列车损失=.46有效_acc=.4301有效损失=.6931

第2阶段:列车损失=0.6931有效\u acc=0.4301有效损失=0.6931

第3阶段:列车损失=0.6931有效\u acc=0.4301有效损失=0.6931

事实证明,对于这个特定的数据集,我的验证图像中有43%是1类图像

y_pred=net.predict(val_ds)提供了以下信息:

数组([1,1,1,…,1,1,1],dtype=int64)

我想我有两个问题:

1) 是否有任何我在初始化CNN时做得不正确的事情会导致这种情况


2) 这是什么原因造成的?我能做些什么来纠正它吗?

您能提供您的导入语句和/或可能的到您修改代码的教程的链接吗?我在中编辑了这两个!你洗牌你的训练例子吗?是的,很好的一点-我有一个数组,我所有的图像,我洗牌之前,我手动分割的图像。最后一个辍学层似乎奇怪。通常情况下,你不会把辍学作为网络的最后一层。你能包括你的导入语句和/或可能是你改编代码的教程的链接吗?我在中编辑了这两个!你洗牌你的训练例子吗?是的,很好的一点-我有一个数组,我所有的图像,我洗牌之前,我手动分割的图像。最后一个辍学层似乎奇怪。通常情况下,你不会把辍学作为网络的最后一层。