學習背景
我是一個可以說混了4年的 phper
,高不成低不就的。每天寫業務邏輯,改 bug
,日復一日。 爲啥一個 phper 幹了那麼久現在才學 python 呢?是否不務正業什麼的?其實我在17 ~ 18
年就開始接觸 python
,基本是學了基礎語法,看了唐宇迪
老師的部分深度學習視頻,但基本上就停留在知道的這個層面,實踐很少,可以說完全就是小白。
爲什麼會參加這個訓練營活動?
- 最近在聽同事彙報工作的時候,看到對方的PPT,突然發現自己很多不明白,連基礎語法也記憶模糊了,萬一人家糊弄我怎麼辦,不能不懂裝懂啊;
- 大概4月20日左右,剛好看到公衆號推廣百度的——python小白逆襲大神,立馬被標題吸引,然後看到學習還有獎品,所以最近就參加了訓練營。
學習環境
- 百度 aistudio 或本地部署安裝環境
- python3.6 ~ python3.7
- paddleHub – 本地安裝
python3.8+
暫不支持,因爲官方的包不兼容 - 安裝了 jupyter
- … …
- 詳細作業要求到 python小白逆襲大神課程查看。
訓練營作業及心得
day01 python 基礎語法
- 打印輸出 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
這種格式來輸出更美觀的對齊方式。
- 查找特定名稱文件
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
實現過爬蟲任務。
完成這份作業的是挺曲折的,實現爬蟲步驟如下:
- 首先,你要明白、理解 爬蟲要獲取什麼信息
- 獲取爬取對象的鏈接
- 分析爬取對象結構
- 代碼實現並測試爬取
爲什麼第一條加粗明白和理解,就是因爲本人在實現的時候,以爲就是提取百科裏面的圖片就行了,然後就簡單查看頁面源代碼開始了代碼編寫實現;結果爬出的結果不對,不是目標的482張圖片,後來經同學提醒,才知道要爬取百科右側圖集裏面的圖片。
點擊圖集,審查元素然後重新分析圖集的結構
最終成功完成這個作業。(這裏只展示部分 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張圖片。而且上傳壓縮包什麼的很容易失敗,然後錯誤提示無法消失,很影響用戶體驗。
- 爬取圖片
- 製作數據集
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')
- 加載訓練集和準備數據(該部分很重要,配置的路徑錯誤,後面都會錯誤)
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()
- 生成讀取器和配置策略
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優化策略;
- … … (其它過程省略)
- 預測, 讀取測試文件
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天所有知識的一個作業,整體來說除了爬蟲,都踩雷了:
- 爬取《青春有你2》任意一期的 1000+ 評論
- 清洗數據,製作高頻詞柱形圖(踩雷)
- 製作詞雲(踩雷)
- paddleHub 對評論進行審覈(踩雷)
爬取評論注意事項
- 愛奇藝不支持超過40條/頁評論
- 評論翻頁關鍵詞爲當前評論最後的ID
- Postman 模擬請求忽略 callback 參數,只能返回第一頁評論(20條),因此Postman沒找到好的使用方式(callbak 是隨機數字,分析的時候以爲是時間戳+隨機數字),後面發現python爬取,不攜帶這個參數也可以
清洗數據注意事項
- 正則清洗換行符等
- 正則清洗空格和用 replace 替換
' '
空字符,\s
有時候沒效 re.sub(r'[^\u4e00-\u9fa5^a-z^A-Z^0-9]+', '', s)
– 踩雷的部分,排除所有非中文和字母數字——刪除表情re.findall('[\u4e00-\u9fa5a-zA-Z0-9]+', s, re.S)
– 踩雷的部分,獲取清除後的中文,數字,字母等評論,忘記返回的是列表,導致一次踩雷。
詞雲製作
- 製作簡易的中文分詞文件 – 添加一些人名、形容詞等詞彙
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
- 製作停止詞文件 – 一般爲疑問詞,本人在跑結果的時候,逐漸添加了自己不滿意的一些動詞,以及主語(你,我, 他 等,注意:如果是
你們
,可能會剩下個們
字,所以們
我也過濾)和轉折詞(雖然
,但是
,因爲
,所以
)
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
白色背景詞雲結果:
總結
通過5天的課程和作業,發現了自己很多不足之處,需要繼續回顧基礎知識,同時要多實踐,多應用,否則很容易忘記。感謝主講的文老師,鍾老師及助教班主任老師和平臺 aistudio,以及感謝微信羣了答疑的同學們!
在此,希望看到這篇總結的讀者,如果也像我這樣學了忘,忘了學的,還是下定決心去做吧,做了之後總有收穫,無論多少,不做只能啃老本。