Homework3

数据集下载

在本地环境下进行实验总是令人安心,但是又苦于网上找不到数据集,虽然kaggle上有数据集但是下载存在问题



于是有了一个天才的想法,间接从kaggle上下载(利用output文件夹中的文件是可下载这一机制将数据集从input文件夹拷贝到output文件夹),具体操作如下图





等待数据集拷贝到output后,点击输出的蓝色链接即可下载。

相关代码由下给出

!python -m zipfile -c /kaggle/working/Dataset.zip /kaggle/input/ml2022spring-hw4/Dataset # copy数据集到output文件夹,此过程可能较慢

import os
os.chdir('/kaggle/working')
print(os.getcwd())
print(os.listdir("/kaggle/working"))
from IPython.display import FileLink
FileLink('mycode.zip')

任务要求

Task1 模型选择

这里对改进sample code中的模型以及引用其他模型进行了尝试,但效果不佳。

如果你想对sample code中的模型进行改进,直接在类Classifier中的self.cnn以及self.fc模块中进行修改即可

如果你想引入其他的模型,可以参考下面的代码

import torchvision.models as models
alexNet = models.alexnet(weights=None, num_classes=11)
# model = Classifier().to(device)
model = alexNet.to(device)

PS.至于视频中提到的pretrained问题,这个参数以及被废除,使用参数weights代替,而且这里类别数与原模型的类别数不一致,如果使用原模型参数会报错。

Task2 数据增强

指出原代码问题

__getitem__中

label = int(fname.split("/")[-1].split("_")[0])

应改为

label = int(fname.split("/")[-1].split("_")[0].split("\\")[-1])

训练数据增强

这里我理解助教的意思应该是对每一个训练数据进行多种transform转换最后仍为一个样本,因此我这里的转换代码如下:

transform1 = transforms.RandomHorizontalFlip()
transform2 = transforms.RandomRotation(30)
transform3 = transforms.ColorJitter(brightness=0.5)
transform4 = transforms.RandomAffine(degrees=20, translate=(0.2, 0.2), scale=(0.7, 1.3))
train_tfm = transforms.Compose([
# Resize the image into a fixed shape (height = width = 128)
transforms.Resize((128, 128)), # You may add some transforms here.
transforms.RandomChoice([transform1, transform2, transform3, transform4]), # 对每个样本随意挑选一种转换 # ToTensor() should be the last one of the transforms.
transforms.ToTensor(),
])
trans_size = 4

测试数据增强 & Ensemble

这里我理解助教的意思是对一个测试样本进行多种不同的变换得到不同的测试样本进行预测,通过投票或其他方式决定这个测试样本的标签

如上面所说,在transforms.Compose中进行多种组合最后得到的仍为一个样本,因此不能在这里进行操作,这里选择在__getitem__中进行修改

except:
label = -1 # test has no label
# multiple prediction for testing samples
trans_im1 = train_tfm(im)
trans_im2 = train_tfm(im)
trans_im3 = train_tfm(im)
trans_im4 = train_tfm(im)
trans_im = torch.stack((trans_im, trans_im1, trans_im2, trans_im3, trans_im4))

这样我们就可以得到原样本以及变换后的四个样本,在测试时,依次取出进行预测并选择合适的机制得到标签即可。

这里我们选择助教说的第一种方式做ensemble

model_best = Classifier().to(device)
model_best.load_state_dict(torch.load(f"{_exp_name}_best.ckpt"))
model_best.eval()
prediction = []
with torch.no_grad():
for data,_ in test_loader: # multiple prediction
data = data.to(device)
# original test batch sample
test_pred = model_best(data[:, 0, :, :, :])
test_pred1 = model_best(data[:, 1, :, :, :])
test_pred2 = model_best(data[:, 2, :, :, :])
test_pred3 = model_best(data[:, 3, :, :, :])
test_pred4 = model_best(data[:, 4, :, :, :]) test_pred = test_pred *0.65 + 0.35*(test_pred1 + test_pred2 + test_pred3 + test_pred4)/4.0 test_label = np.argmax(test_pred.cpu().data.numpy(), axis=1)
prediction += test_label.squeeze().tolist()

Mixup数据增强

这里助教所说应该是对训练数据进行Mixup增强,但是效果也是不太行。

下面给出__getitem__完整代码,这里面对train samples进行Mixup增强,对test samples进行了多变换增强。

def __getitem__(self,idx):

        # original image procession
fname = self.files[idx]
im = Image.open(fname) # original image transform
trans_im = self.transform(im) #
# im = self.data[idx]
try:
# label = int(fname.split("/")[-1].split("_")[0])
label = int(fname.split("/")[-1].split("_")[0].split("\\")[-1])
# mixup augmentation for train samples
fname1 = self.files[random.randint(0, self.__len__() - 1)]
im1 = Image.open(fname1)
trans_mix_im1 = self.transform(im1)
label1 = int(fname1.split("/")[-1].split("_")[0].split("\\")[-1]) trans_im = 0.5*trans_im + 0.5*trans_mix_im1 label = [label, label1] except:
label = -1 # test has no label
# multiple prediction for testing samples
trans_im1 = train_tfm(im)
trans_im2 = train_tfm(im)
trans_im3 = train_tfm(im)
trans_im4 = train_tfm(im)
trans_im = torch.stack((trans_im, trans_im1, trans_im2, trans_im3, trans_im4)) return trans_im,label

loss修改

loss = criterion(logits, labels[0].to(device))
loss1 = criterion(logits, labels[1].to(device))
loss = loss + loss1
def mixup_accuracy(output, target1, target2):
"""
计算 Mixup 样本的准确率
:param output: 模型的输出,形状为 (batch_size, num_classes)
:param target1: 第一个样本的标签,形状为 (batch_size,)
:param target2: 第二个样本的标签,形状为 (batch_size,)
:return: 准确率
"""
# 计算模型对混合样本的预测结果
output = output.to(device)
target1 = target1.to(device)
target2 = target2.to(device) _, pred_indices = output.topk(2, dim=-1)
# 取出预测结果中最大的两个值对应的索引
pred1_indices = pred_indices[:, 0] # 第一个最大值的索引
pred2_indices = pred_indices[:, 1] # 第二个最大值的索引
# 计算混合样本的准确率
acc1 = (((pred1_indices == target1) | (pred1_indices == target2))).float()
acc2 = (((pred2_indices == target1) | (pred2_indices == target2))).float()
acc = (acc1 + acc2 == 2.0).float().mean()
return acc
###Task3 交叉验证
ChatGpt告诉我这么做
```python
k = 4
kf = KFold(n_splits=k, shuffle=True, random_state=42)
for fold, (train_idx, valid_idx) in enumerate(kf.split(dataset)):
train_set = Subset(dataset, train_idx)
valid_set = Subset(dataset, valid_idx) # Create data loaders for training and validation sets
train_loader = DataLoader(train_set, batch_size=batch_size, shuffle=True, pin_memory=True)
valid_loader = DataLoader(valid_set, batch_size=batch_size, shuffle=False, pin_memory=True)

最终结果

这一套组合拳下来,结果糟糕透了,不知道哪里出了问题!

李宏毅2022机器学习HW3 Image Classification的更多相关文章

  1. 李宏毅老师机器学习课程笔记_ML Lecture 3-1: Gradient Descent

    引言: 这个系列的笔记是台大李宏毅老师机器学习的课程笔记 视频链接(bilibili):李宏毅机器学习(2017) 另外已经有有心的同学做了速记并更新在github上:李宏毅机器学习笔记(LeeML- ...

  2. 李宏毅老师机器学习课程笔记_ML Lecture 2: Where does the error come from?

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  3. 李宏毅老师机器学习课程笔记_ML Lecture 1: ML Lecture 1: Regression - Demo

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  4. 李宏毅老师机器学习课程笔记_ML Lecture 1: 回归案例研究

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  5. 李宏毅老师机器学习课程笔记_ML Lecture 0-2: Why we need to learn machine learning?

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  6. 李宏毅老师机器学习课程笔记_ML Lecture 0-1: Introduction of Machine Learning

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  7. 李宏毅老师机器学习第一课Linear regression

    机器学习就是让机器学会自动的找一个函数 学习图谱: 1.regression example appliation estimating the combat power(cp) of a pokem ...

  8. 基于卷积神经网络的面部表情识别(Pytorch实现)----台大李宏毅机器学习作业3(HW3)

    一.项目说明 给定数据集train.csv,要求使用卷积神经网络CNN,根据每个样本的面部图片判断出其表情.在本项目中,表情共分7类,分别为:(0)生气,(1)厌恶,(2)恐惧,(3)高兴,(4)难过 ...

  9. Logistic回归二分类Winner or Losser----台大李宏毅机器学习作业二(HW2)

    一.作业说明 给定训练集spam_train.csv,要求根据每个ID各种属性值来判断该ID对应角色是Winner还是Losser(0.1分类). 训练集介绍: (1)CSV文件,大小为4000行X5 ...

  10. 线性回归预测PM2.5----台大李宏毅机器学习作业1(HW1)

    一.作业说明 给定训练集train.csv,要求根据前9个小时的空气监测情况预测第10个小时的PM2.5含量. 训练集介绍: (1)CSV文件,包含台湾丰原地区240天的气象观测资料(取每个月前20天 ...

随机推荐

  1. cri-docker的学习和了解-番外

    cri-docker的学习和了解-番外 前言 因为已经有足足两年多没再详细接触K8S了. 然后利用两个晚上搭建了IPV6 SingleStack的K8S单机版 中间一直使用的docker的方式学习和工 ...

  2. Python学习之十二_tkinter的学习与使用

    Python学习之十二_tkinter的学习与使用 摘要 本来想说会用QT5进行界面编程 但是发现比较繁琐 还是先学习使用 tkinter的方式进行界面化的编写和学习了 基础知识 tkinter是一个 ...

  3. Redis监控方法之二

    Redis监控方法之二 背景 前期整理过使用 exporter + prometheus 方式进行Redis监控的搭建过程 最近给同事研究clickhouse时发现 clickhouse 有对应的pl ...

  4. [转帖]Skip List--跳表(全网最详细的跳表文章没有之一)

    https://www.jianshu.com/p/9d8296562806 跳表是一种神奇的数据结构,因为几乎所有版本的大学本科教材上都没有跳表这种数据结构,而且神书<算法导论>.< ...

  5. Nginx双层域名时 iframe嵌入/跳转页面的处理过程

    Nginx双层域名时 iframe嵌入/跳转页面的处理过程 背景 两年前在上一家公司内遇到一个Nginx的问题 当时的场景是 双层nginx代理时(一层域名侧, 一层拆分微服务的网关层) 程序里面会打 ...

  6. iptables 命令学习

    iptables 命令学习 摘要 Linux 早起版本使用netfilter进行数据包过滤. 最新的版本开始改用 ebpf的方式进行内核编程式的包过滤. netfilter 可以理解为内核态的一个处理 ...

  7. [转帖]深入内存/主存:解剖DRAM存储器

    https://zhuanlan.zhihu.com/p/561501585 2022/9/9更新:经过和评论区大佬的交流,准备研读一下JEDEC标准,主要是加深自己对banking和访存加速的理解( ...

  8. React Hooks 指北

    前言 这篇文章旨在总结 React Hooks 的使用技巧以及在使用过程中需要注意的问题,其中会附加一些问题产生的原因以及解决方式.但是请注意,文章中所给出的解决方式并不一定完全适用,解决问题的方案有 ...

  9. 文盘Rust -- r2d2 实现redis连接池

    作者:贾世闻 我们在开发应用后端系统的时候经常要和各种数据库.缓存等资源打交道.这一期,我们聊聊如何访问redis 并将资源池化. 在一个应用后端程序访问redis主要要做的工作有两个,单例和池化. ...

  10. Keepalive-Haproxy高可用介绍

    假设我们现在开发了一个应用应用的端口号为 8080,这个应用我们想让它去实现一个负载均衡的访问,就是说我们有两台服务器都部署了我们的 8080 应用,我们想让它一会访问 ip 为: 192.168.0 ...