[百度飞桨PaddlePaddle]Python“小白”逆袭大神--训练营结营心得

学习背景

我是一个可以说混了4年的 phper,高不成低不就的。每天写业务逻辑,改 bug,日复一日。 为啥一个 phper 干了那么久现在才学 python 呢?是否不务正业什么的?其实我在17 ~ 18年就开始接触 python ,基本是学了基础语法,看了唐宇迪老师的部分深度学习视频,但基本上就停留在知道的这个层面,实践很少,可以说完全就是小白。

为什么会参加这个训练营活动?

  1. 最近在听同事汇报工作的时候,看到对方的PPT,突然发现自己很多不明白,连基础语法也记忆模糊了,万一人家糊弄我怎么办,不能不懂装懂啊;
  2. 大概4月20日左右,刚好看到公众号推广百度的——python小白逆袭大神,立马被标题吸引,然后看到学习还有奖品,所以最近就参加了训练营。

学习环境

  1. 百度 aistudio 或本地部署安装环境
  2. python3.6 ~ python3.7
  3. paddleHub – 本地安装python3.8+暂不支持,因为官方的包不兼容
  4. 安装了 jupyter
  5. … …
  6. 详细作业要求到 python小白逆袭大神课程查看。

训练营作业及心得

day01 python 基础语法

  1. 打印输出 9*9 乘法口诀表
def table():
    #在这里写下您的乘法口诀表代码吧!
    for i in range(1,10):
        for j in range(1,i+1):
            print("{}*{}={:<2}".format(j,i,i*j), end=" ")
        print("")

在实现乘法表的时候,学习到 :<2 这种格式来输出更美观的对齐方式。

  1. 查找特定名称文件
def findfiles():
    #在这里写下您的查找文件代码吧!
    for root, dirs, files in os.walk(path):
    	for file in root:
    		if filename in file:
    			result.append(os.path.join(root, file))
    			
    for i,v in enumerate(result):
        print("[{} ... {}]".format(i+1,v))

作为小白一个,一开始没想到用上面这种方式实现查找文件的,后来被人提醒,才知道 os.walk() 函数,然后看菜鸟教程折腾出了上面的方案。

第一天,作业 soeasy ,然后我就有点小看这个训练营了,靠这个能成为大神,那大神也多了,结果第二天就给了我一锤子 _(¦3」∠)_

day02 《青春有你2》选手信息爬取

选手图片获取(482张图)

从来没用 python 写过比较完整的爬虫, 只有在 16 年用php实现过爬虫任务。
完成这份作业的是挺曲折的,实现爬虫步骤如下:

  1. 首先,你要明白理解 爬虫要获取什么信息
  2. 获取爬取对象的链接
  3. 分析爬取对象结构
  4. 代码实现并测试爬取

为什么第一条加粗明白理解,就是因为本人在实现的时候,以为就是提取百科里面的图片就行了,然后就简单查看页面源代码开始了代码编写实现;结果爬出的结果不对,不是目标的482张图片,后来经同学提醒,才知道要爬取百科右侧图集里面的图片。
爬取目标为百科图集
点击图集,审查元素然后重新分析图集的结构
HTML结构分析
最终成功完成这个作业。(这里只展示部分 python 代码)

def crawl_pic_urls():
    '''
    爬取每个选手的百度百科图片,并保存
    ''' 
    with open('work/'+ today + '.json', 'r', encoding='UTF-8') as file:
         json_array = json.loads(file.read())

    headers = { 
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' 
     }
        
    for star in json_array:
        name = star['name']
        link = star['link']
        #!!!请在以下完成对每个选手图片的爬取,将所有图片url存储在一个列表pic_urls中!!!
        response = requests.get(link, headers=headers)
        soup = BeautifulSoup(response.text, 'lxml')
        # 获取百科图册 
        doms = soup.select('.summary-pic a')[0]
        url = doms.get('href')
        uri = "https://baike.baidu.com"+ url
        # 请求图册的地址
        response2 = requests.get(uri, headers=headers)
        soup2 = BeautifulSoup(response2.text, 'lxml')
        doms = soup2.select('.pic-list .pic-item img')

        pic_urls = []
        for img in doms:
             src = img.get('src')
             pic_urls.append(src)

        # print(pic_urls)

        #!!!根据图片链接列表pic_urls, 下载所有图片,保存在以name命名的文件夹中!!!
        down_pic(name,pic_urls)

day03 《青春有你2》选手数据分析 —— 纠正心态

经过前面两天虽然不是很完美的作业,然后自己飘了,明明那么简单为啥没能够得到一次奖品呢?因此此次作业一发布,看到是刚好学习过的唐宇迪机器学习课程的绘制饼状图任务,立马就去做作业,也没检查,看到饼状图绘制成功后就立马提交了作业。
结果图
图片很简陋难看不说,前面还一堆报错及警告信息:
在这里插入图片描述
晚上临睡前,越想越不对,反思自己当天的行为,自己的目的好像不是为了奖品,而是为了不忘记这些知识,学到新知识,锻炼实践了才是我的目的。所以,后面修改了第3天的作业,并将反思写在了作业最后面。

作业结果与反思
代码实现如下:

import matplotlib.pyplot as plt
import numpy as np 
import json
import matplotlib.font_manager as font_manager
import pandas as pd
import matplotlib.font_manager as fm

#显示matplotlib生成的图形
get_ipython().run_line_magic('matplotlib', 'inline')
my_font = fm.FontProperties(fname='simhei.ttf')

weights = []
for star in json_array:
    weight = float(star['weight'].replace('kg',''))
    weights.append(weight)

a = b = c = d = 0
for weight in weights:
    if weight <= 45:
        a = a + 1
    elif weight> 45 and weight <= 50:
        b = b + 1
    elif weight>50 and weight <= 55:
        c = c + 1
    else:
        d = d + 1

labels = ['<45kg', '45~50kg', '50~55kg', '>55kg'] 
data = [a, b, c, d]
fig, ax1 = plt.subplots()
explode = (0.1, 0.1, 0.2, 0.3)
ax1.pie(x=data, explode = explode, labels = labels, autopct='%.1f%%')
ax1.axis('equal')
plt.savefig('/home/aistudio/work/result/pie_result02.jpg')
plt.show()

day04 PaddleHub之《青春有你2》作业:五人识别 —— 意外收获

第4天上课结束后,公布第3天获奖人员名单,意外在问卷调查中的获奖名单中看到了自己。(*^▽^*)

第四天的作业难点在与数据集的制作,需要收集前五名选手的图片,根据第2天作业修改爬虫获取选手图片进行训练(这里很坑的是收集女选手的图片,但百度图片掺杂很多垃圾图片,所以需要手动挑选)。作业详情见python小白逆袭大神课程作业栏目。

最后采用手工上传图片到 aistudio 项目平台上面,值得吐槽的地方在于每次只能上传5张图片。而且上传压缩包什么的很容易失败,然后错误提示无法消失,很影响用户体验。

  1. 爬取图片
  2. 制作数据集 (数据太少的问题可以学习aistudio用户 FutureSI训练数据太少?过拟合?一文带你领略“数据增长魔法”(上))
import os
# 写入文本
def make_trainlist(path,output_txt):
    f_train=open(output_txt,'w')
    for (dirpath,dirnames,filenames) in os.walk(path):
        for filename in filenames:
           cur_name = dirpath.split('/')[2]
           path = os.path.join(dirpath,filename)+' '+str(label_list.index(cur_name))+'\n'
        #    print(path)
           f_train.write(path)
    f_train.close

make_trainlist('dataset/train','dataset/train_list.txt')
make_trainlist('dataset/validate','dataset/validate_list.txt')
  1. 加载训练集和准备数据(该部分很重要,配置的路径错误,后面都会错误)
import paddlehub as hub
module = hub.Module(name="resnet_v2_50_imagenet")
from paddlehub.dataset.base_cv_dataset import BaseCVDataset
   
class DemoDataset(BaseCVDataset):	
   def __init__(self):	
       # 数据集存放位置
       
       self.dataset_dir = "."
       super(DemoDataset, self).__init__(
           base_path=self.dataset_dir,
           train_list_file="dataset/train_list.txt",
           validate_list_file="dataset/validate_list.txt",
           test_list_file="dataset/test_list.txt",
           label_list_file="dataset/label_list.txt",
           )
dataset = DemoDataset()
  1. 生成读取器和配置策略
data_reader = hub.reader.ImageClassificationReader(
    image_width=module.get_expected_image_width(),
    image_height=module.get_expected_image_height(),
    images_mean=module.get_pretrained_images_mean(),
    images_std=module.get_pretrained_images_std(),
    dataset=dataset)

config = hub.RunConfig(
    use_cuda=False,                              #是否使用GPU训练,默认为False;
    num_epoch=4,                                #Fine-tune的轮数;
    checkpoint_dir="cv_finetune_turtorial_demo",#模型checkpoint保存路径, 若用户没有指定,程序会自动生成;
    batch_size=3,                              #训练的批大小,如果使用GPU,请根据实际情况调整batch_size;
    eval_interval=10,                           #模型评估的间隔,默认每100个step评估一次验证集;
    strategy=hub.finetune.strategy.DefaultFinetuneStrategy())  #Fine-tune优化策略;
  1. … … (其它过程省略)
  2. 预测, 读取测试文件test_list.txt,预测结果
import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg

with open("dataset/test_list.txt","r") as f:
    filepath = f.readlines()

data = [filepath[0].split(" ")[0],filepath[1].split(" ")[0],filepath[2].split(" ")[0],filepath[3].split(" ")[0],filepath[4].split(" ")[0]]

label_map = dataset.label_dict()
index = 0
run_states = task.predict(data=data)
results = [run_state.run_results for run_state in run_states]

for batch_result in results:
    print(batch_result)
    batch_result = np.argmax(batch_result, axis=2)[0]
    print(batch_result)
    for result in batch_result:
        index += 1
        result = label_map[result]
        print("input %i is %s, and the predict result is %s" %
              (index, data[index - 1], result))

预测结果
P.S. 因为没有数据增强的概念,划分大量时间人工查找正确人员的图片,但效率不行,所以制作的数据集很差,导致预测效果不好,这次5中4还是瞎猫碰上死耗子的结果。-_-||

今后如何继续深入学习,可以加强这方面的知识。

第4天的作业最容易踩雷的地方是配置和训练集目录,如果目录不正确很容易踩坑。

day05 综合作业

这是一个综合了前4天所有知识的一个作业,整体来说除了爬虫,都踩雷了:

  1. 爬取《青春有你2》任意一期的 1000+ 评论
  2. 清洗数据,制作高频词柱形图(踩雷)
  3. 制作词云(踩雷)
  4. paddleHub 对评论进行审核(踩雷)

爬取评论注意事项

  1. 爱奇艺不支持超过40条/页评论
  2. 评论翻页关键词为当前评论最后的ID
  3. Postman 模拟请求忽略 callback 参数,只能返回第一页评论(20条),因此Postman没找到好的使用方式(callbak 是随机数字,分析的时候以为是时间戳+随机数字),后面发现python爬取,不携带这个参数也可以

清洗数据注意事项

  1. 正则清洗换行符等
  2. 正则清洗空格和用 replace 替换' ' 空字符,\s 有时候没效
  3. re.sub(r'[^\u4e00-\u9fa5^a-z^A-Z^0-9]+', '', s) – 踩雷的部分,排除所有非中文和字母数字——删除表情
  4. re.findall('[\u4e00-\u9fa5a-zA-Z0-9]+', s, re.S)– 踩雷的部分,获取清除后的中文,数字,字母等评论,忘记返回的是列表,导致一次踩雷。

词云制作

  1. 制作简易的中文分词文件 – 添加一些人名、形容词等词汇
def fenci(text):
    '''
    利用jieba进行分词
    参数 text:需要分词的句子或文本
    return:分词结果
    '''
    jieba.load_userdict(r"work/user_dict.txt")
    text = re.sub(r"\n", '', text) # 踩雷,忘记清除换行符,导致统计了换行符
    seg_list = jieba.cut(text)
    return seg_list
  1. 制作停止词文件 – 一般为疑问词,本人在跑结果的时候,逐渐添加了自己不满意的一些动词,以及主语(你,我, 他 等,注意:如果是你们,可能会剩下个字,所以我也过滤)和转折词(虽然但是因为所以)
def stopwordslist(file_path):
    '''
    创建停用词表
    参数 file_path:停用词文本路径
    return:停用词list
    '''
    stopwords = [line.strip() for line in open(file_path, encoding='UTF-8').readlines()]
    return stopwords

运行结果(没有吧动词过滤):
分词统计
3. 词云制作,主要避免背景图无效,WordCloud 必须是白色背景的图,目前,本人测试的是 白色非透明的png 或 白色的 jpg 图片均可以。

人物jpg白色背景图片词云结果:
词云结果图片
动物png白色背景词云结果:
tiger_pic

总结

通过5天的课程和作业,发现了自己很多不足之处,需要继续回顾基础知识,同时要多实践,多应用,否则很容易忘记。感谢主讲的文老师,钟老师及助教班主任老师和平台 aistudio,以及感谢微信群了答疑的同学们!

在此,希望看到这篇总结的读者,如果也像我这样学了忘,忘了学的,还是下定决心去做吧,做了之后总有收获,无论多少,不做只能啃老本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章