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. 製作數據集
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,以及感謝微信羣了答疑的同學們!

在此,希望看到這篇總結的讀者,如果也像我這樣學了忘,忘了學的,還是下定決心去做吧,做了之後總有收穫,無論多少,不做只能啃老本。

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