【飛槳PaddlePaddle學習心得】day5(學習過程中遇到的坑的彙總)

坑1 沒有paddlehub裏面的模型文件

在這裏插入圖片描述

原因:

沒有下載paddlehub  沒有import paddlehub 沒有使用hub命令下載senta_bilstm模型
模型下載命令:!hub install senta_bilstml==1.0.0
可以引伸出來 使用paddlehub,所有找不到模型額問題,都是paddle沒有加載進來

坑2 matplotlib顯示中文的問題

在這裏插入圖片描述

原因

1.沒有安裝中文字體
2.安裝了中文字體,但是沒有複製到matplotlib下面
3.設置matplotlib.rcParams
4.for mac:安裝好以後需要使用rm -r ~/.matplotlib 刪除~/.matplotlib文件

解決方法

	#下載中文字體
	wget https://mydueros.cdn.bcebos.com/font/simhei.ttf 
	#在操作系統中創建字體目錄fonts(可能已經有
	mkdir .fonts
	# 複製字體文件到該路徑
	cp simhei.ttf .fonts/
	#複製字體到當前使用的conda環境中的matplotlib下的指定路徑
	cp simhei.ttf /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/
	# Linux系統默認字體文件路徑
	ls /usr/share/fonts/
	# 查看系統可用的ttf格式中文字體
	fc-list :lang=zh | grep ".ttf"
	 # 設置顯示中文
    matplotlib.rcParams['font.family'] = ['SimHei']
    # 解決負號'-'顯示爲方塊的問題
    matplotlib.rcParams['axes.unicode_minus'] = False

最終效果:

在這裏插入圖片描述

坑3這是一個系列性的問題(day4問題

可能的報錯

這一系列的問題都出現在使用paddlehub進行Finetune的時候 也就是在運行run_states = task.finetune_and_eval()這行代碼的時候。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

其實可以很容易知道,我們不能對模型做什麼改動,只有在運行這一行代碼的時候報錯了,那麼我們唯一和模型進行交互的是什麼呢?是我們的數據集,所有肯定是我們的額數據集出現了問題呀。
歸根到底,出現問題還是沒有理解paddlehua的自定義數據集的規定。


from paddlehub.dataset.base_cv_dataset import BaseCVDataset
   
class DemoDataset(BaseCVDataset):	
   def __init__(self):	
       # 數據集存放位置
       self.dataset_dir = "dataset"
       super(DemoDataset, self).__init__(
           base_path=self.dataset_dir,
           train_list_file="train_list.txt",
           validate_list_file="validate_list.txt",
           test_list_file="test_list.txt",
           label_list_file="label_list.txt", )
dataset = DemoDataset()

從這個DemoDataset可以看出,dataset_dir設定了所有的路徑的root節點,相當於下面super裏面的所有路徑前面都要加入dataset/這個前綴。詳細的要求可以查看適配自定義數據
然後就是train_list.txt、validate_list.txt和test_list.txt裏面的內容了。
在這裏插入圖片描述

以上圖(train_list.txt)裏面的內容爲例.分爲兩列:
第一列是訓練數據的路徑,這裏也是最容易出錯的,這裏的路徑默認前面是有了一個dataset的,也就是我們在前面代碼裏面設置的self.dataset_dir = “dataset”,很多問題都是出現在這裏的,因爲這裏寫錯了,那麼模型就加載不到圖片,肯定會報錯呀。
然後就是第二列的數據,中間以空格分割,第二列的數據與label_list.txt裏面的內容形成索引。
在這裏插入圖片描述
以上是label_list.txt裏面的內容,paddle在查詢的時候,訓練和測試文件的時候,會自動根據索引去label_list.txt中匹配label。

坑4在python中使用paddlehub的情感分析

這個的坑在於,傳入的數據必須是個字典,而且字典的key要爲text,value必須要是個list。

senta = hub.Module(name='senta_bilstm', version='1.0.0')
input_dict = {'text':['你好呀!','ennenene']}
res = senta.sentiment_classify(data=input_dict)

坑5 大作業爬蟲

本次大作業第一步就是爬取評論的數據,這個爬蟲相對來說不要太容易了,唯一的槽點就是調用的接口找起來有點麻煩,在這裏給出,結構的url如下,對於參數來說,只要注意content_id和last_id就行了,content_id代表的是那一步電影/電視(in iqiyi)。然後last_id的話主要是達到一個翻頁的作業,只需要把本次查詢到的最後一個評論的用戶的id賦值給last_id就可以實現查詢下一頁的評論了。

接口鏈接和參數如下

意思的話從參數名上面大部分就能看明白了
在這裏插入圖片描述

坑6 json.loads 和 json.dump

這兩個函數會由於基本功的問題,容易搞混淆或者記不起怎麼用。
當我們通過接口爬取到數據後,返回的通常都是json類型的字符串數據。這個時候我們就需要上面的兩個函數來幫忙了,那麼到底這兩個函數怎麼用呢。
通俗的講:

json.loads(str(data):將一個JSON編碼的字符串轉換回一個Python數據結構(通常爲字典
json.dump(json_data): 將一個Python數據結構轉換爲JSON字符串,通常在寫文件的時候使用。

所有本次大作業,先拿到的就是json類型的字符串,我們要拿到裏面的comments的話就要先把它轉換爲dict類型的數據,然後再訪問:

	lastId = ''
	response = getComment(lastId)   #getComment發送請求得到json類型的字符串
	response = json.loads(response) #使用json.loads解析
    comment_list = response['data']['comments'] #得到一次返回的所有comments的list
    lastId = comment_list[-1]['id']      #得到lastID  然後再次使用getComment(lastId)
    while len(comment_list) <1000:
    	getComment(lastId)
    	……
    	……
   	
   #當要持久化爬取到的json數據的時候 就要使用json.dump()
   with open('day5.json', 'w', encoding='UTF-8') as f:
        json.dump(comment_list, f, ensure_ascii=False)

2020.4.27 00:12 未完待續


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