我是一个可以说混了4年的 phper
,高不成低不就的。每天写业务逻辑,改 bug
,日复一日。 为啥一个 phper 干了那么久现在才学 python 呢?是否不务正业什么的?其实我在17 ~ 18
年就开始接触 python
,基本是学了基础语法,看了唐宇迪
老师的部分深度学习视频,但基本上就停留在知道的这个层面,实践很少,可以说完全就是小白。
为什么会参加这个训练营活动?
python3.8+
暂不支持,因为官方的包不兼容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」∠)_
。
从来没用 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)
经过前面两天虽然不是很完美的作业,然后自己飘了,明明那么简单为啥没能够得到一次奖品呢?因此此次作业一发布,看到是刚好学习过的唐宇迪
机器学习课程的绘制饼状图任务,立马就去做作业,也没检查,看到饼状图绘制成功后就立马提交了作业。
图片很简陋难看不说,前面还一堆报错及警告信息:
晚上临睡前,越想越不对,反思自己当天的行为,自己的目的好像不是为了奖品,而是为了不忘记这些知识,学到新知识,锻炼实践了才是我的目的。所以,后面修改了第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()
第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天的作业最容易踩雷的地方是配置和训练集目录,如果目录不正确很容易踩坑。
这是一个综合了前4天所有知识的一个作业,整体来说除了爬虫,都踩雷了:
' '
空字符,\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,以及感谢微信群了答疑的同学们!
在此,希望看到这篇总结的读者,如果也像我这样学了忘,忘了学的,还是下定决心去做吧,做了之后总有收获,无论多少,不做只能啃老本。