本文描述了作者在参加百度Python小白逆袭大神课程一些亲身经历,从开始的半信半疑,到最后坚定的革命信念,给没有参加过百度课程的同学一点参考,文中有高质量的数据分析、pyecharts动态图,深度学习相关代码分享,图文并茂保证不让你失望。
误打误撞点进了“百度飞桨小白逆袭大神 课程”,加了学习微信群,感觉进了贼窝似的,哪里有这么好的事情,上课不收钱,还有奖品,我信你个鬼呀!!里面准是一群托,打算哄骗我让我报班学习的吧,告诉你们不会再上你们的当了,因为我是已经上过当了!!!
Day1:Python基础练习
居然能按时开课,群里同学叽叽喳喳,老师哔哩吧啦,班主任带货,一片繁荣景象!在我还没确认里面有什么阴谋诡计之前我是不会出声的。
不过学习我是认真的,走过路过不要错过,学一点是一点,毕竟人家是大厂。
作业一:输出 9*9 乘法口诀表(注意格式)。
来吧,先来给老师个下马威,别以为我读得书少,乘法口诀前几排我还是记得住的。
我也就用一行代码概括了,老师要惊呆了吧,后来发现好多同学就这么写的,老师估计看了也就这么 噗嗤 的一下吧。
def table():
#在这里写下您的乘法口诀表代码吧!
print('\n'.join(["\t".join([f'{i}*{j}={i * j:<2}' for i in range(1, j + 1)]) for j in range(1,10)]))
#主要使用jion字符函数来连接列表里的元素,这样就不掉头发了!
if __name__ == '__main__':
table()
- 作业二:查找特定名称文件
import os
#待搜索的目录路径
path = 'Day1-homework'
#待搜索的名称
filename = "2020"
#定义保存结果的数组
result = []
n = 1
def findfiles(path):
global n
for item in os.listdir(path):
if os.path.isdir(os.path.join(path, item)):
findfiles(os.path.join(path, item))
else:
if filename in item:
result.append('['+str(n)+','+"'"+os.path.join(path,item)+"'"+']')
print('['+str(n)+','+"'"+os.path.join(path,item)+"'"+']')
n += 1
return result
if __name__ == '__main__':
findfiles(path)
没有太多亮点,里面有个套中套,所谓高大上的递归,也就这么肥事啦。后来知道 用os.walk可以一步到位,你更值得拥有。
两题下来,还没玩够。
我给老师恶作剧一下,把作业空间里的txt都写上一句话!
import os
#待搜索的目录路径
path = os.getcwd()
#待搜索的名称
filename = "2020"
#定义保存结果的数组
n = 1
def findnwrite(path):
global n
for item in os.listdir(path):
if os.path.isdir(os.path.join(path, item)):
findnwrite(os.path.join(path, item))
else:
if os.path.join(path,item).endswith('.txt'):
with open (os.path.join(path,item),'a+') as f:
f.write('人生苦短,我用python')
n += 1
return n
findnwrite(path)
- 最后再补一刀:
改作业可能是个美女老师呢,我给她送一朵花,让她流下感动的泪水,或许还给加到101分呢。后来发现改作业都是男滴助教,白送了。。。。
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator
import matplotlib.pyplot as plt
import numpy as np
print('送给您一朵花花!')
fig = plt.figure(figsize=(12, 9),dpi= 100)
ax = fig.gca(projection='3d')
[x, t] = np.meshgrid(np.array(range(26))/26.0, np.arange(0, 555.5, 0.5)/555*16*np.pi-2*np.pi)
p = (np.pi/2)*np.exp(-t/(10*np.pi))
u = 1-(1-np.mod(3.16*t, 2*np.pi)/np.pi)**4/2
y = 2*(x**2-x)**2*np.sin(p)
r = u*(x*np.sin(p)+y*np.cos(p))
surf = ax.plot_surface(r*np.cos(t), r*np.sin(t), u*(x*np.cos(p)-y*np.sin(p)),rstride=1, cstride=1, cmap=cm.gist_rainbow_r, linewidth=0, antialiased=True)
plt.show()
别问我为啥那么优秀,我是去抄的,但是避免被别人告我,我也是小改动了一下几个参数,不信你去搜,保证我们不一样。
Day2-《青春有你2》选手信息爬取
1.完成《青春有你2》选手图片爬取,将爬取图片进行保存,保证代码正常运行> 。
2.打印爬取的所有图片的绝对路径,以及爬取的图片总数,此部分已经给出代码。请在提交前,一定要保证有打印结果。
哎呀!这不是我喜欢的题目,听说前一阵子,有人玩爬虫把自己也搭进去了,这种鸡鸣狗盗的伎俩,我是抱有一定的态度的。(其实就没学过不懂,但是也要完成作业呀!)
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中!!!
r = requests.get(link,headers=headers)
soup = BeautifulSoup(r.text,'lxml')
get_url = 'https://baike.baidu.com' +soup.find_all('div',{'class':'summary-pic'})[0].find('a').get('href')
r_1 = requests.get(get_url,headers=headers)
soup_1 = BeautifulSoup(r_1.text,'lxml')
pic_urls = []
get_img_list = soup_1.find_all('div',{'class':'pic-list'})[0].find_all('img')
for pic in get_img_list:
pic_url = pic.get('src')
pic_urls.append(pic_url)
#!!!根据图片链接列表pic_urls, 下载所有图片,保存在以name命名的文件夹中!!!
down_pic(name,pic_urls)
作业代码自己写的就这么多了,靓汤!(我不是抄的,我不是抄的,我不是抄的。。。。)
我承认目前爬虫这方面相对比较弱,有点怂,后面有需要可以深入学习一下。
要看小姐姐吗?
Day3-《青春有你2》选手数据分析
要求:对《青春有你2》对选手体重分布进行可视化,绘制饼状图 就是画个饼那么简单嘛!
给出了整理好的数据,表格里有选手的相关信息,身高、体重、星座等等,需要分析下然后作图。单纯完成作业是没问题,怎么才能玩出花来呢!?
- 体重分级关键代码
df['weight']=df.weight.str[0:2].astype("int") #体重转化为整型
bins=[0,45,50,55,100]
labels=['<= 45Kg','45~50Kg','50~55Kg','>55Kg']
df['level'] = pd.cut(df['weight'], bins, labels=labels) #定制分级函数
grouped=df['weight'].groupby(df['level']).count().reset_index()#生成统计数据框
grouped.sort_values(by='weight',ascending= False, inplace= True) #原位排序
grouped
精华所在:pd.cut(df['weight'], bins, labels=labels)
,pandas的cut函数,一招制敌完成重量分级,数据处理一共用了6行,到处闪亮着pandas 的光。
老师讲解的时候的用了一串判断呀,循环呀,我露出狡黠的一笑。不过这个函数真的好用,在很多分级的情景都可以用上,兄弟记得去查查资料继续学习一下,改变的一生可能就是这一句:)
- 出图
正正规规的样板作业,没毛病!
import matplotlib.pyplot as plt
fig = plt.figure(dpi=150)
explode=(0.1,0.1,0,0)
plt.pie(grouped.weight, explode=explode,labels=grouped.level,\
autopct='%1.1f%%',shadow=False, startangle=90,radius=1.5)
plt.axis('equal')
plt.legend(loc="upper right",fontsize=10,bbox_to_anchor=(1.1,1.05),borderaxespad=0.85)
plt.savefig("work/result/pie_result.jpg",dpi=200,bbox_inches='tight')
plt.show()
还好吧,调整了一下,显示完成固定动作。
后面我开始给老师送买一送三啦!老师让我做体重,我把星座分布也做了,老师又要感动了吧,我这个勤奋好学的光辉形象,要在老师的心里扎根了。
- 星座分布图
constell=df['name'].groupby(df['constellation']).count().reset_index()
constell.sort_values(by='name',ascending= False, inplace= True)
fig = plt.figure(dpi=150)
explode=(0.1,0.1,0,0,0,0,0,0,0,0,0,0)
plt.pie(constell.name, explode=explode,labels=constell.constellation,\
autopct='%1.1f%%',shadow=True, startangle=90,radius=1.5)
plt.axis('equal')
plt.legend(loc="right",fontsize=10,bbox_to_anchor=(1.2,0.5),borderaxespad=0.55)
plt.savefig("work/result/pie_result1.jpg",dpi=200,bbox_inches='tight')
plt.show()
没完还有,我把刚从隔壁疫情数据分析班学来的用pyecharts画的南丁格尔玫瑰风图的模板借了过来。美美哒!可是平台对动态图不友好,没显示出来,老师估计也没空看,3000人交作业,哪里忙得过来,大家可以造起来,饼图都适用,好看又不贵,带走!就是比较反人类,比较难懂,就改的Java的,什么是Java我也不懂,我听说的。
- 南丁格尔玫瑰风图
from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.globals import ThemeType
from pyecharts.render import make_snapshot
from snapshot_selenium import snapshot
def p(grouped):
v=grouped.level.tolist()
d=[round(i/sum(grouped.weight)*100,2) for i in grouped.weight]
c = (
Pie(init_opts=opts.InitOpts(width='900px', height='600px',theme=ThemeType.WHITE))
# 添加数据,设置饼图的半径,是否展示成南丁格尔图
.add("", [list(z) for z in zip(v, d)],
radius=["20%", "80%"],
center=["50%", "60%"],
rosetype="area" )
# 设置全局配置项
.set_global_opts(title_opts=opts.TitleOpts(title='《青春有你2》选手体重分布',pos_left='center'),
legend_opts=opts.LegendOpts(is_show=True,type_="scroll",
pos_top= "20%",
pos_right="52%",
orient="vertical"))
# 设置系列配置项
.set_series_opts(label_opts=opts.LabelOpts(is_show=True,
position="inside",
font_size=12,
formatter="{c}%",
font_style="italic",
font_weight="bold",
font_family="Microsoft YaHei" )
)
)
return c
# 生成html文档
p(grouped).render_notebook()
还有一张
Day4-《青春有你2》选手识别
使用经典的ResNet-50作为预训练模型识别分类青春有你小姐。
题材挺好的,我也是为了看小姐姐来的!
-划重点
那么我跟你说吧,这7天的课,最重要的就是这一节课,就是这里 深度学习的启蒙课,实现了一个深度学习的流程。当下多少人被深度学习吸引住了,有报道说,计算机要产生自主意识了,我们看过的科幻片在慢慢的变成现实。—第四工业革命 深度学习。
老师没有打算给我们讲原理,讲数学,把模块都准备好了,就是让我们爽快的体验一把。
但是没有!爽快之前要付出辛勤的劳动才能体验爽快,5位小姐姐的图片要自己找,训练集、测试集、验证集的列表文件要自己建,这都是工作量呀!
图片太少识别不准确,图片增强还么学,来不及了。 上手段,其他工具完成了图片采集,我最终搜集了639张高清图片,有没比我多,有的话我们交流下,你是不是也是用我同款的工具。
这作业的另一难度在于材料的准备。封装好的迁移学习对 训练集、测试集、验证集的列表文件 要求比较高,一有点小问题,就是一长串的报错,急人呀!
不知道大家是怎么完成的,下面我们来看这一段
里面有这么一段,完成的工作内容就产生训练集、测试集、验证集的列表文件,用的是纯纯的python代码,用循环、判断写入列表文件,长太感人了! 感兴趣的感觉去学习下。
#总的图像数量
all_class_images = 0
#存放类别标签
class_label=0
# 设置要生成文件的路径
data_root_path="/home/aistudio/data/fish_image/fish_image"
#存储要写进test.txt和train.txt中的内容
trainer_list=[]
eval_list=[]
#读取每个类别,['fish_01', 'fish_02', 'fish_03']
for class_dir in class_dirs:
#每个类别的信息
class_detail_list = {}
eval_sum = 0
trainer_sum = 0
#统计每个类别有多少张图片
class_sum = 0
#获取类别路径
path = data_root_path + "/" + class_dir
# 获取所有图片
img_paths = os.listdir(path)
for img_path in img_paths: # 遍历文件夹下的每个图片
name_path = path + '/' + img_path # 每张图片的路径
if class_sum % 10 == 0: # 每10张图片取一个做验证数据
eval_sum += 1 # test_sum为测试数据的数目
eval_list.append(name_path + "\t%d" % class_label + "\n")
else:
trainer_sum += 1
trainer_list.append(name_path + "\t%d" % class_label + "\n")#trainer_sum测试数据的数目
class_sum += 1 #每类图片的数目
all_class_images += 1 #所有类图片的数目
class_label += 1
# 说明的json文件的class_detail数据
class_detail_list['class_name'] = class_dir #类别名称,如jiangwen
class_detail_list['class_label'] = class_label #类别标签
class_detail_list['class_eval_images'] = eval_sum #该类数据的测试集数目
class_detail_list['class_trainer_images'] = trainer_sum #该类数据的训练集数目
class_detail.append(class_detail_list)
random.shuffle(eval_list)
with open(data_list_path + "eval.txt", 'a') as f:
for eval_image in eval_list:
f.write(eval_image)
random.shuffle(trainer_list)
with open(data_list_path + "train.txt", 'a') as f2:
for train_image in trainer_list:
f2.write(train_image)
print ('生成数据列表完成!')
重点来了,这篇稿子最重要的部分有营养的地方来了!大家一定认真哈,不要开小差啦!
麻烦大了,是不是前面废话太多,以至于精彩部分,大家睡着了!!
我在百度平台公开了我这个项目,数据集都准备好,大家也可以直接去体验一把,开箱即可食用,记得点赞好评哦。有报错的地方,不用来找我,因为我也不懂,报错的都是迁移学习黑盒子里面的东西。
**《青春有你2》5位选手识别作业* 链接,难度初级
Step1、基础工作
加载数据文件
制作数据准备函数。
def data_list():
name_dict = {'wangchengxuan':4,'anqi':3, 'xujiaqi':1, 'yushuxin':0, 'zhaoxiaotang':2}
path="dataset/data" #图片所在文件夹
address_list = [] #图片地址列表
label_list = [] #标签列表
for root, dirs, files in os.walk(path, topdown=False):
for name in files:
address = os.path.join(root, name) #获取图片路径
address_list.append(address)
label = address.split('/')[2] #路径分割后,截取目录名即为标记名,开始的时候大脑里转的是map,lambda,还是apply!
label_list.append(name_dict.get(label)) #截取目录名对应的标注
return {'address':address_list,'label':label_list} #生成字典
df = pd.DataFrame(data_list()) #代码只有一句,那么这是直插灵魂的一句。
df['address'] = df.address.str[8:] #按要求产生相对路径。
df_new=df.copy() #样品数据框随机打乱,按9:1比例生成 测试集,验证集,训练集列表文档。
df_new = df.sample(frac=1.0) #打乱数据
df_validate = df_new.sample(frac=0.1) #取同数量样本作为验证集
df_new.drop(index=df_validate.index,inplace=True) #去除测试集
df_test = df_new.sample(5) #随机抽取5样本作为测试集
df_train = df_new.drop(index=df_test.index) #剩下的为训练集
len(df_train.index)
### 生成数据列表文件
df_test['address'] = 'dataset/'+df_test['address']
df_test.to_csv('dataset/test_list.txt', sep=' ', index=0,header=0) #导出 验证集列表
df_validate.to_csv('dataset/validate_list.txt', sep=' ', index=0,header=0) #导出 验证集列表
df_train.to_csv('dataset/train_list.txt', sep=' ', index=0,header=0) #导出 训练集列表
#有种万箭齐发的感觉,所需要的材料已经准备完毕了,到此后面的工作已经可以自动继续运行了!
简单的说,列表–>字典–>DataFrame–>TXT。就是用前面提到的os.walk 生成图片路径列表,然后,根据文件夹名字映射标签,(映射没用上,一直想用映射),路径和标签组合成字典,然后潘大师(pandas)出场,做成了一个DataFrame.这样后面对图片路径的裁剪都变得很方便,更重要的是导出TXT 很方便。
思路非常清晰,一气呵成,打完收工!潘大师下次还用你!
你还在用遍历吗,你还在用循环吗,不行了,有计算机了,为什么要用按键的计算器呀!这一招可以普适分类图像分类任务的数据集列表的生成管理,真的好用,带一上一份吧,时候不早了,赶紧上路吧,如果没时间后面可以不看了,最精彩的已经讲完了。
代码最后跑起来是这样子:
Ai平台在GUP赋能下,跑起来是很爽的!在我脑海里的视觉效果是这样子的。项目链接在上面可以去感受体验!
自我感觉这么良好的作业,大家猜老师给我打多少分,101是不是也少了一点呀,这么革命性的创制,解放了多少劳动力呀!
答案:09(倒过来看)
,你在笑我装逼失败吧!估计是装逼太明显了,下次低调些了!
后面我哭着去找班主任理论去了。。。。然后再跟助教探讨了一番人生!
Day5-综合大作业
- 作业要求
第一步:爱奇艺《青春有你2》评论数据爬取(参考链接:https://www.iqiyi.com/v_19ryfkiv8w.html#curid=15068699100_9f9bab7e0d1e30c494622af777f4ba39)
爬取任意一期正片视频下评论 评论条数不少于1000条
第二步:词频统计并可视化展示
数据预处理:清理清洗评论中特殊字符(如:@#¥%、emoji表情符),清洗后结果存储为txt文档
中文分词:添加新增词(如:青你、奥利给、冲鸭),去除停用词(如:哦、因此、不然、也好、但是) 统计top10高频词 可视化展示高频词
第三步:绘制词云 根据词频生成词云 可选项-添加背景图片,根据背景图片轮廓生成词云
第四步:结合PaddleHub,对评论进行内容审核
Balabala
大作业也就这样啦,由些零散的技能组成的,老师大概想给我们营造期末考试的感觉!确实这么短时间里把这些东西串起来了是有点难度的。我也不打算给大家分享代码了,都是体力活,这就不展开了,反正是我弄到凌晨4点。
最后,青春有你评论词云图作品:
我放进去一朵花,它却给我一个球!生活常常都是这样子的!
散了,散了,散花了!
到最后,我还是没搞明白百度飞桨团队是干啥的,投入那么多精力然后,还不赚钱,再次让我感受到社会主义的优越性!
谢谢大家的帮助!不然作业自己真做不出来!
关于代码的方面,希望能得到大佬的指点和帮助!
下一回合,我们江湖见!
安好!