先放一下最终结果,参加的竞赛是Kaggle的Classify Leaves,是李沐大神举办的一个比赛,虽然已经过期了,但是还是可以来熟悉一下基本操作,总共有176个种类,随机预测概率大概为0.0056,我最终得到的预测结果正确率大概为30%,用了最简单的AlenNet,加了一点点的预处理,也就水平翻转之类的,对这个结果还是比较满意的,后续对这个模型继续修改,希望能把正确率提升到70左右吧。

真的是太激动了,用了差不多一个礼拜,从头到尾写出了自己的第一个能用的模型,从开始不知道如何加载数据,如何是不知道如何加载模型,训练模型,到最后生成预测结果,真的是看的再多也不如自己动手敲一遍。

曾经看了吴恩达的机器学习,深度学习也看了一部分,然后转去了李沐的动手学深度学习,吴恩达的视频都是理论,虽然有课后习题但是只做了一部分,然后跟着李沐前面敲了敲代码,本来想着最起码基础的都会吧,但是实际操作起来真的是折磨,首先一直用的都是java,python只稍微学了一点点,然后再就是pytorch也不熟,再就是基本操作过程一直都是跟着敲得,也没有自己从零开始写过,然后呃,整个过程非常的非常的折磨。

就只能问问同学,然后得到一个大概的方向再去看文档,看博客,看源码,看注释,然后一点一点啃,最终是成功磨出来了这个模型,里面很多地方的写法肯定都非常离谱,但是当时为了达到效果实在是不知道该怎么办了,等后面修改的时候再把它改好一点把,希望可以跟李沐大神一样,也不说一样吧,有他代码60%的水平就很好了,它的代码真的是太优美了,致敬。

在这里放上动手学深度学习系列的专栏链接,用框架是pytorch,真的非常赞,坚持啃完肯定会有很多收获的。

下面代码只是我个人纪念,还是不要继续往下看了,也不知道会不会有人看,但是作为入行这个方向不久的小白来说,我觉得虽然它不是很好,但是实现了一部分功能,后面再改进吧,估计也没人看,都是自己搁着纪念了hhhh,如果有人看到了这里,祝你后面的科研路顺利,idea多多,论文多多!!!

import os
os.chdir('/learn/dive-into-deep-learning/src/competition_2')
# -*- coding:utf-8
"""
作者: Jia
日期: 2022年03月14日
描述: 自定义DataSet类,用于读入数据
"""
from torch.utils.data import Dataset
from PIL import Image
import matplotlib.pyplot as pltclass CustomDataSet(Dataset):def __init__(self, image_path, image_class, transform=None, device="cpu"):self.image_path = image_pathself.image_class = image_classself.transform = transformdef show_img(self, index):plt.subplots(1, 1)img = Image.open(self.image_path[index])plt.imshow(img[2])plt.show()def __getitem__(self, index):img = Image.open(self.image_path[index])if img.mode != 'RGB':raise ValueError("image:{} isn't RGB mode.".format(self.image_path[index]))label = np.argmax(self.image_class[index])label = torch.tensor(label).to(device)if self.transform is not None:img = self.transform(img)return img.to(device), labeldef __len__(self):return len(self.image_path)
import pandas as pd
from torch.utils.data import DataLoader
from torchvision import transforms
import torchvision.models as model
import torch.optim as optim
import torch.nn as nn
import torch
import numpy as np
first_train = True
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 训练集transform,随机裁剪并且随机水平翻转,然后转换为tensor类型并做规范化
train_transform = transforms.Compose([transforms.RandomResizedCrop(224, scale=(0.64, 1.0), ratio=(1, 1)),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])
])# 测试集transform
test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])
])train_data = pd.read_csv('train.csv')
num_classes = len(train_data['label'].unique())  # 类别的总数,用于确定网络的输出层有多少参数# 编码为 one-hot 格式
train_data = pd.get_dummies(train_data, columns=['label'], prefix="", prefix_sep="")
print(train_data.shape)
(18353, 177)
# 建立DataSet
np_train_data = np.array(train_data)
print(np_train_data.shape)
image_path = np_train_data[:, 0]
image_label = np_train_data[:, 1:].astype(float)
train_set = CustomDataSet(image_path, image_label, train_transform, device)
(18353, 177)
# 查询可用GPU数量
torch.cuda.device_count()
8
batch_size = 8
train_loader = DataLoader(train_set, batch_size=batch_size, shuffle=True, drop_last=True)
alexnet = model.alexnet(num_classes=num_classes)alexnet.train()  # 打开训练模式
AlexNet((features): Sequential((0): Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))(1): ReLU(inplace=True)(2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(3): Conv2d(64, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(4): ReLU(inplace=True)(5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(6): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(7): ReLU(inplace=True)(8): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(9): ReLU(inplace=True)(10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(11): ReLU(inplace=True)(12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False))(avgpool): AdaptiveAvgPool2d(output_size=(6, 6))(classifier): Sequential((0): Dropout(p=0.5, inplace=False)(1): Linear(in_features=9216, out_features=4096, bias=True)(2): ReLU(inplace=True)(3): Dropout(p=0.5, inplace=False)(4): Linear(in_features=4096, out_features=4096, bias=True)(5): ReLU(inplace=True)(6): Linear(in_features=4096, out_features=176, bias=True))
)
# 初始化参数
def init_weights(m):if type(m) == nn.Linear:torch.nn.init.normal_(m.weight, std=0.01)alexnet.apply(init_weights)
AlexNet((features): Sequential((0): Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))(1): ReLU(inplace=True)(2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(3): Conv2d(64, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(4): ReLU(inplace=True)(5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(6): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(7): ReLU(inplace=True)(8): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(9): ReLU(inplace=True)(10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(11): ReLU(inplace=True)(12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False))(avgpool): AdaptiveAvgPool2d(output_size=(6, 6))(classifier): Sequential((0): Dropout(p=0.5, inplace=False)(1): Linear(in_features=9216, out_features=4096, bias=True)(2): ReLU(inplace=True)(3): Dropout(p=0.5, inplace=False)(4): Linear(in_features=4096, out_features=4096, bias=True)(5): ReLU(inplace=True)(6): Linear(in_features=4096, out_features=176, bias=True))
)
# 将模型放到GPU1上
alexnet.to(device=device)
AlexNet((features): Sequential((0): Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2))(1): ReLU(inplace=True)(2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(3): Conv2d(64, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(4): ReLU(inplace=True)(5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False)(6): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(7): ReLU(inplace=True)(8): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(9): ReLU(inplace=True)(10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(11): ReLU(inplace=True)(12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False))(avgpool): AdaptiveAvgPool2d(output_size=(6, 6))(classifier): Sequential((0): Dropout(p=0.5, inplace=False)(1): Linear(in_features=9216, out_features=4096, bias=True)(2): ReLU(inplace=True)(3): Dropout(p=0.5, inplace=False)(4): Linear(in_features=4096, out_features=4096, bias=True)(5): ReLU(inplace=True)(6): Linear(in_features=4096, out_features=176, bias=True))
)
# 定义超参数
epochs = 5
learning_rate = 0.02
# 损失函数和优化函数
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(alexnet.parameters(), lr=learning_rate)
for step, data in enumerate(train_loader):print(data[0].shape, data[1])break
torch.Size([8, 3, 224, 224]) tensor([173,  58, 153, 101,  45, 125,  54, 150], device='cuda:0')
f = open('log.txt', 'w')
if first_train:for epoch in range(epochs):running_loss = 0.0for step, data in enumerate(train_loader):# 将导数值清零optimizer.zero_grad()# forward + backward + optimizeloss = criterion(alexnet(data[0]), data[1])loss.backward()optimizer.step()# 打印日志running_loss += loss.item()if step % 50 == 49:print('[%d, %5d] loss: %.3f' % (epoch + 1, step + 1, running_loss / 500))f.write('[%d, %5d] loss: %.3f' % (epoch + 1, step + 1, running_loss / 50) + "\n")running_loss = 0.0torch.save(alexnet.state_dict(), "alexNet.params")f.close()
else:alexnet.load_state_dict(torch.load('alexNet.params'))alexnet.eval()
# 生成预测文件
test_data = pd.read_csv("test.csv")
test_data_img_path = test_data['image'].values
print(type(test_data_img_path))
print(test_data_img_path)
test_data_set = CustomDataSet(test_data_img_path, np.zeros_like(test_data_img_path), transform=test_transform,device=device)
<class 'numpy.ndarray'>
['images/18353.jpg' 'images/18354.jpg' 'images/18355.jpg' ...'images/27150.jpg' 'images/27151.jpg' 'images/27152.jpg']
test_data_loader = DataLoader(test_data_set, batch_size=batch_size)
pred = []
for X, _ in test_data_loader:y_hat = alexnet(X.to(device))pred.extend(y_hat.argmax(dim=1).type(torch.int32).cpu().numpy())# np_pred = np.array(pred)
# np_pred.shape
labels = train_data.columns.values[1:]
labels
array(['abies_concolor', 'abies_nordmanniana', 'acer_campestre','acer_ginnala', 'acer_griseum', 'acer_negundo', 'acer_palmatum','acer_pensylvanicum', 'acer_platanoides', 'acer_pseudoplatanus','acer_rubrum', 'acer_saccharinum', 'acer_saccharum','aesculus_flava', 'aesculus_glabra', 'aesculus_hippocastamon','aesculus_pavi', 'ailanthus_altissima', 'albizia_julibrissin','amelanchier_arborea', 'amelanchier_canadensis','amelanchier_laevis', 'asimina_triloba', 'betula_alleghaniensis','betula_jacqemontii', 'betula_lenta', 'betula_nigra','betula_populifolia', 'broussonettia_papyrifera','carpinus_betulus', 'carpinus_caroliniana', 'carya_cordiformis','carya_glabra', 'carya_ovata', 'carya_tomentosa','castanea_dentata', 'catalpa_bignonioides', 'catalpa_speciosa','cedrus_atlantica', 'cedrus_deodara', 'cedrus_libani','celtis_occidentalis', 'celtis_tenuifolia','cercidiphyllum_japonicum', 'cercis_canadensis','chamaecyparis_pisifera', 'chamaecyparis_thyoides','chionanthus_retusus', 'chionanthus_virginicus','cladrastis_lutea', 'cornus_florida', 'cornus_kousa', 'cornus_mas','crataegus_crus-galli', 'crataegus_laevigata','crataegus_phaenopyrum', 'crataegus_pruinosa', 'crataegus_viridis','cryptomeria_japonica', 'diospyros_virginiana','eucommia_ulmoides', 'evodia_daniellii', 'fagus_grandifolia','ficus_carica', 'fraxinus_nigra', 'fraxinus_pennsylvanica','ginkgo_biloba', 'gleditsia_triacanthos', 'gymnocladus_dioicus','halesia_tetraptera', 'ilex_opaca', 'juglans_cinerea','juglans_nigra', 'juniperus_virginiana', 'koelreuteria_paniculata','larix_decidua', 'liquidambar_styraciflua','liriodendron_tulipifera', 'maclura_pomifera','magnolia_acuminata', 'magnolia_denudata', 'magnolia_grandiflora','magnolia_macrophylla', 'magnolia_stellata', 'magnolia_tripetala','magnolia_virginiana', 'malus_baccata', 'malus_coronaria','malus_floribunda', 'malus_hupehensis', 'malus_pumila','metasequoia_glyptostroboides', 'morus_alba', 'morus_rubra','nyssa_sylvatica', 'ostrya_virginiana', 'oxydendrum_arboreum','paulownia_tomentosa', 'phellodendron_amurense', 'picea_abies','picea_orientalis', 'picea_pungens', 'pinus_bungeana','pinus_cembra', 'pinus_densiflora', 'pinus_echinata','pinus_flexilis', 'pinus_koraiensis', 'pinus_nigra','pinus_parviflora', 'pinus_peucea', 'pinus_pungens','pinus_resinosa', 'pinus_rigida', 'pinus_strobus','pinus_sylvestris', 'pinus_taeda', 'pinus_thunbergii','pinus_virginiana', 'pinus_wallichiana', 'platanus_acerifolia','platanus_occidentalis', 'populus_deltoides','populus_grandidentata', 'populus_tremuloides','prunus_pensylvanica', 'prunus_sargentii', 'prunus_serotina','prunus_serrulata', 'prunus_subhirtella', 'prunus_virginiana','prunus_yedoensis', 'pseudolarix_amabilis', 'ptelea_trifoliata','pyrus_calleryana', 'quercus_acutissima', 'quercus_alba','quercus_bicolor', 'quercus_cerris', 'quercus_coccinea','quercus_imbricaria', 'quercus_macrocarpa', 'quercus_marilandica','quercus_michauxii', 'quercus_montana', 'quercus_muehlenbergii','quercus_nigra', 'quercus_palustris', 'quercus_phellos','quercus_robur', 'quercus_shumardii', 'quercus_stellata','quercus_velutina', 'quercus_virginiana', 'robinia_pseudo-acacia','salix_babylonica', 'salix_caroliniana', 'salix_matsudana','salix_nigra', 'sassafras_albidum', 'staphylea_trifolia','stewartia_pseudocamellia', 'styrax_japonica','taxodium_distichum', 'tilia_americana', 'tilia_cordata','tilia_europaea', 'tilia_tomentosa', 'tsuga_canadensis','ulmus_americana', 'ulmus_glabra', 'ulmus_parvifolia','ulmus_procera', 'ulmus_pumila', 'ulmus_rubra', 'zelkova_serrata'],dtype=object)
df = pd.DataFrame({'image': test_data_img_path, 'label': labels[pred]})
df
image label
0 images/18353.jpg prunus_virginiana
1 images/18354.jpg eucommia_ulmoides
2 images/18355.jpg acer_pseudoplatanus
3 images/18356.jpg abies_concolor
4 images/18357.jpg platanus_occidentalis
... ... ...
8795 images/27148.jpg abies_concolor
8796 images/27149.jpg amelanchier_canadensis
8797 images/27150.jpg abies_concolor
8798 images/27151.jpg juniperus_virginiana
8799 images/27152.jpg prunus_virginiana

8800 rows × 2 columns

df.to_csv('submission.csv', index=False)

记第一次训练出深度学习模型并成功预测结果相关推荐

  1. 该如何训练好深度学习模型?

    博主不是专业搞竞赛出生,仅依赖博主为数有限的工程经验,从工程实践的方面讨论如何把深度学习模型训练好.如果写的不好,欢迎各位大佬在评论区留言互动.训练好深度学习模型与训练深度学习模型差别还是很大的,训练 ...

  2. 不用写代码,就能训练测试深度学习模型!Uber开源AI工具箱Ludwig

    乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 让代码的归代码,让AI的归AI. 在不写代码就能进行AI开发的道路上,Uber今日又往前踏了一步. 刚刚,Uber宣布开源Ludwig,一 ...

  3. 请谨慎使用预训练的深度学习模型

    2019-10-04 19:26:56 作者:Cecelia Shao 编译:ronghuaiyang 导读 预训练模型用起来非常容易,但是你是否忽略了可能影响模型性能的细节呢? 你运行过多少次下面的 ...

  4. 用lstm模型做预测_深度学习模型 CNN+LSTM 预测收盘价

    -- 本篇文章 by HeartBearting 上一篇浏览量很大,感谢各位的关注! 能够在这里分享一些实验,一起领略 数据科学之美,也很开心. 以后,这个实验的模型会不断深化. 之后,也会分享一些 ...

  5. 收藏 | PyTorch深度学习模型训练加速指南2021

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者:LORENZ KUHN 编译:ronghuaiyang ...

  6. 深度学习模型训练的一般方法(以DSSM为例)

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 本文主要用于记录DSSM模型学习期间遇到的问题及分析.处理经验.先统领性地提出深度学习模型训练 ...

  7. 深度学习模型DNN部署到安卓设备上全流程示例——{pytorch->onnx>ncnn->Android studio}

    之前写过一篇文章 "Windows配置pytorch转onnx转ncnn转android设备" 如何配置环境设置,可以参考这篇如何配置 目录 "Windows配置pyto ...

  8. 亚马逊专家揭秘:如何建立自动检测乳腺癌的深度学习模型

    安妮 编译自 Insight Data Science 量子位出品 | 公众号 QbitAI 本文作者Sheng Weng,现亚马逊Alexa项目组数据专家,莱斯大学应用物理专业已毕业博士生,主要研究 ...

  9. 除了网络搜索(NAS),AutoML对深度学习模型优化还有哪些贡献?

    文/编辑 | 言有三 自从Google提出AutoML技术以来,已经过去了好几年了,如今在学术界和工业界都是热点.AutoML在网络结构的搜索上已经取得了非常多的突破,相关的文章,技术博客都已经广为流 ...

最新文章

  1. 过去一周AI领域有哪些新鲜事?看这一篇就够了
  2. Altium designer几个网络同时走线
  3. java连接数据库hei_如何黑MySQL5数据库?(来自:http://superhei.blogbus.com)
  4. windows node.js安装以及启动过程
  5. layui table动态选中_layui后台管理—table 数据表格详细讲解
  6. 蓝桥杯51单片机之利用中断同时控制流水灯、数码管、独立按键、蜂鸣器【单片机开发初学者有趣综合案例】
  7. ELK学习总结(1)——我们为什么要用ELK
  8. 企业治理的要诀(学习总结)
  9. python用来正常显示中文标签 plt.rcParams['font.sans-serif'] = ['SimHei']错误
  10. Tomcat启动页面中文乱码解决方法
  11. android平板电脑 刷机工具,小白必看,安卓平板电脑刷机教程之一键刷机,普耐尔 MOMO 安卓平板论坛...
  12. nodejs怎么使用爬虫HTTP代理IP抓取数据
  13. 2020年春节抢票神器
  14. 机器学习 -- 主成分分析
  15. 37岁Android程序员裸辞,四个月被497家公司拒绝,问猎头后懵了
  16. 在python中、int表示的数据类型是_python--002--数据类型(int、str)
  17. Lucene .Net + 盘古分词 学习资料
  18. 推荐几个超有趣的公众号
  19. 接口测试之Postman使用全指南(原来使用 Postman测试API接口如此简单)
  20. 季节前面为什么用in_季节前面用in还是on

热门文章

  1. 机器人爆发,能从「潮玩」开始吗?
  2. 集体炸锅!什么是超声刀美容,做脸部超声刀能维持多久?弄僵
  3. Wemos D1 Arduino超声波测距原理讲解加代码、超声波驱动SG90电机(垃圾桶感应开关)
  4. BaoStock:一个免费、开源的python证券数据接口包
  5. 微信Token验证失败
  6. android机器人kibot,360儿童机器人app
  7. 如何使用 ATK-SIM900A 模块进行中英文的短信发送
  8. 搭建呼叫中心系统的成本费用
  9. 如何在C#中引入CPLEX的dll(CPLEX系列-教程一)
  10. cpu超线程优缺点_什么是超线程技术?_CPUCPU评测-中关村在线