第一天的课程依旧是人工智能概述与入门基础,作业相对来说比较简单,就直接把作业给分析了一下:

作业一:输出 9*9 乘法口诀表(注意格式)

注意:提交作业时要有代码执行输出结果。

考察点:

1:循环结构.

2:输出格式.

刚看到这道题的时候,就发现这不是刚开始打ACM的时候基础练习题嘛.当时比赛的时候搞过两次,然后我就一顿操作写了一个for一个while循环交了上去,后来直接右对齐交了上去,回过神看了看群里别人的讨论发现应该是左对齐,然后我就一顿操作把格式改为左对齐,但是我发现print里面加一个f后使用-进行左对齐的时候跟直接使用%不一样,所以下面就改成了%.

#使用for循环

def table():

#在这里写下您的乘法口诀表代码吧!

for i in range(1,10):

for j in range(1,i+1):

print(f"{j}*{i}=%-2d"%(i*j),end=' ')

print("")

if __name__ == '__main__':

table()

作业二:查找特定名称文件

遍历”Day1-homework”目录下文件;

找到文件名包含“2020”的文件;

将文件名保存到数组result中;

按照序号、文件名分行打印输出。

注意:提交作业时要有代码执行输出结果。

考察点:

1:循环

2:递归

这道题一看的时候直接发现,给定的是一个字符串,而不是获取地址,而且输出的是地址目录,那么我就想了想,应该是类似于深搜这样的,找到一个之后直接输出,不过当时想的有点简单,想着直接一层for循环看看是不是能直接找到(当时没有仔细看文件,没有发现文件里面还有文件)“2020”,结果凉凉,然后赶快把方法改成递归,找到一个append一次,最后输出.

# 导入OS模块

import os

# 待搜索的目录路径

path = "Day1-homework"

# 待搜索的名称

filename = "2020"

# 定义保存结果的数组

result = []

def findfiles(file_path):

pathss=os.listdir(file_path)

for i in pathss:

path_new=os.path.join(file_path,i)

if os.path.isdir(path_new):

findfiles(path_new)

else:

if filename in i:

result.append(path_new)

# 在这里写下您的查找文件代码吧!

if __name__ == '__main__':

findfiles(path)

indexx = 1

for i in result:

print(f"{indexx} {i}")

indexx+=1

第二天讲解的内容是深度学习实践平台与Python进阶,说了一些AI Studio的使用方法以及Python的一些语法,因为有上一个课程的基础,所以这个课程学习起来相对来说比较轻松,但是因为同时报名了百度云的一个课程,特别想学习爬虫,但是时间实在是不够用了,所以爬虫只能放到后面来学习了,当然这也给后面的作业造成了十分大的麻烦。

这一天的作业是《青春有你2》选手的信息的爬取,其实是想一点一点自己想着写出来的,但是发现这么简单的东西,对于我来说还是有一点吃力,于是就又参考了老师们的讲解,然后把作业给解决了,也算是对爬虫有了更深的了解。

上网的全过程:

普通用户:

打开浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 渲染到页面上。

爬虫程序:

模拟浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 提取有用的数据 --> 保存到本地/数据库。

爬虫的过程:

1.发送请求(requests模块)

2.获取响应数据(服务器返回)

3.解析并提取数据(BeautifulSoup查找或者re正则)

4.保存数据

import json

import re

import requests

import datetime

from bs4 import BeautifulSoup

import os

#获取当天的日期,并进行格式化,用于后面文件命名,格式:20200420

today = datetime.date.today().strftime('%Y%m%d')

def crawl_wiki_data():

"""

爬取百度百科中《青春有你2》中参赛选手信息,返回html

"""

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'

}

url='https://baike.baidu.com/item/青春有你第二季'

try:

response = requests.get(url,headers=headers)

print(response.status_code)

#将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串

soup = BeautifulSoup(response.text,'lxml')

#返回的是class为table-view log-set-param的

tables = soup.find_all('table',{'class':'table-view log-set-param'})

crawl_table_title = "参赛学员"

for table in tables:

#对当前节点前面的标签和字符串进行查找

table_titles = table.find_previous('div').find_all('h3')

for title in table_titles:

if(crawl_table_title in title):

return table

except Exception as e:

print(e)

def parse_wiki_data(table_html):

'''

从百度百科返回的html中解析得到选手信息,以当前日期作为文件名,存JSON文件,保存到work目录下

'''

bs = BeautifulSoup(str(table_html),'lxml')

all_trs = bs.find_all('tr')

error_list = ['\'','\"']

stars = []

for tr in all_trs[1:]:

all_tds = tr.find_all('td')

star = {}

#姓名

star["name"]=all_tds[0].text

#个人百度百科链接

star["link"]= 'https://baike.baidu.com' + all_tds[0].find('a').get('href')

#籍贯

star["zone"]=all_tds[1].text

#星座

star["constellation"]=all_tds[2].text

#身高

star["height"]=all_tds[3].text

#体重

star["weight"]= all_tds[4].text

#花语,去除掉花语中的单引号或双引号

flower_word = all_tds[5].text

for c in flower_word:

if c in error_list:

flower_word=flower_word.replace(c,'')

star["flower_word"]=flower_word

#公司

if not all_tds[6].find('a') is None:

star["company"]= all_tds[6].find('a').text

else:

star["company"]= all_tds[6].text

stars.append(star)

json_data = json.loads(str(stars).replace("\'","\""))

with open('work/' + today + '.json', 'w', encoding='UTF-8') as f:

json.dump(json_data, f, ensure_ascii=False)

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)

bs=BeautifulSoup(response.text,'lxml')

pic_list_url = bs.select('.summary-pic a')[0].get('href')

pic_list_url = 'https://baike.baidu.com'+pic_list_url

pic_list_response=requests.get(pic_list_url,headers=headers)

bs=BeautifulSoup(pic_list_response.text,'lxml')

pic_list_html=bs.select('.pic-list img')

pic_urls=[]

for pic_html in pic_list_html:

pic_url=pic_html.get('src')

pic_urls.append(pic_url)

#!!!根据图片链接列表pic_urls, 下载所有图片,保存在以name命名的文件夹中!!!

down_pic(name,pic_urls)

def down_pic(name,pic_urls):

'''

根据图片链接列表pic_urls, 下载所有图片,保存在以name命名的文件夹中,

'''

path = 'work/'+'pics/'+name+'/'

if not os.path.exists(path):

os.makedirs(path)

for i, pic_url in enumerate(pic_urls):

try:

pic = requests.get(pic_url, timeout=15)

string = str(i + 1) + '.jpg'

with open(path+string, 'wb') as f:

f.write(pic.content)

print('成功下载第%s张图片: %s' % (str(i + 1), str(pic_url)))

except Exception as e:

print('下载第%s张图片时失败: %s' % (str(i + 1), str(pic_url)))

print(e)

continue

def show_pic_path(path):

'''

遍历所爬取的每张图片,并打印所有图片的绝对路径

'''

pic_num = 0

for (dirpath,dirnames,filenames) in os.walk(path):

for filename in filenames:

pic_num += 1

print("第%d张照片:%s" % (pic_num,os.path.join(dirpath,filename)))

print("共爬取《青春有你2》选手的%d照片" % pic_num)

if __name__ == '__main__':

#爬取百度百科中《青春有你2》中参赛选手信息,返回html

html = crawl_wiki_data()

#解析html,得到选手信息,保存为json文件

parse_wiki_data(html)

#从每个选手的百度百科页面上爬取图片,并保存

crawl_pic_urls()

#打印所爬取的选手图片路径

show_pic_path('/home/aistudio/work/pics/')

print("所有信息爬取完成!")

最后爬取了482张选手的图片。

第三天进军深度学习常用Python库,老师讲解了四剑客(Numpy等等)知识,感觉讲的很不错,这一天的作业是对数据进行可视化,因为有相似的课程基础,所以作业相对来说不是太难,很快就解决了。

import sys

sys.path.append('/home/aistudio/external-libraries')

# 下载中文字体

!wget https://mydueros.cdn.bcebos.com/font/simhei.ttf

# 将字体文件复制到matplotlib字体路径

!cp simhei.ttf /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/

# 一般只需要将字体文件复制到系统字体目录下即可,但是在aistudio上该路径没有写权限,所以此方法不能用

# !cp simhei.ttf /usr/share/fonts/

# 创建系统字体文件路径

!mkdir .fonts

# 复制文件到该路径

!cp simhei.ttf .fonts/

!rm -rf .cache/matplotlib

import matplotlib.pyplot as plt

import numpy as np

import json

import matplotlib.font_manager as font_manager

#显示matplotlib生成的图形

%matplotlib inline

with open('data/data31557/20200422.json', 'r', encoding='UTF-8') as file:

json_array = json.loads(file.read())

#绘制小姐姐区域分布柱状图,x轴为地区,y轴为该区域的小姐姐数量

zones = []

for star in json_array:

zone = star['zone']

zones.append(zone)

print(len(zones))

print(zones)

zone_list = []

count_list = []

for zone in zones:

if zone not in zone_list:

count = zones.count(zone)

zone_list.append(zone)

count_list.append(count)

print(zone_list)

print(count_list)

# 设置显示中文

plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体

plt.figure(figsize=(20,15))

plt.bar(range(len(count_list)), count_list,color='r',tick_label=zone_list,facecolor='#9999ff',edgecolor='white')

# 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小

plt.xticks(rotation=45,fontsize=20)

plt.yticks(fontsize=20)

plt.legend()

plt.title('''《青春有你2》参赛选手''',fontsize = 24)

plt.savefig('/home/aistudio/work/resresult.jpg')

plt.show()

import matplotlib.pyplot as plt

import numpy as np

import json

import matplotlib.font_manager as font_manager

import pandas as pd

#显示matplotlib生成的图形

%matplotlib inline

df = pd.read_json('data/data31557/20200422.json')

#print(df)

grouped=df['name'].groupby(df['zone'])

s = grouped.count()

zone_list = s.index

count_list = s.values

# 设置显示中文

plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体

plt.figure(figsize=(20,15))

plt.bar(range(len(count_list)), count_list,color='r',tick_label=zone_list,facecolor='#9999ff',edgecolor='white')

# 这里是调节横坐标的倾斜度,rotation是度数,以及设置刻度字体大小

plt.xticks(rotation=45,fontsize=20)

plt.yticks(fontsize=20)

plt.legend()

plt.title('''《青春有你2》参赛选手''',fontsize = 24)

plt.savefig('/home/aistudio/work/resuresult02.jpg')

plt.show()

import matplotlib.pyplot as plt

import numpy as np

import json

import matplotlib.font_manager as font_manager

%matplotlib inline

with open( 'data/data31557/20200422.json', 'r', encoding='UTF-8') as file:

json_array = json.loads(file.read())

weights = []

counts= []

for star in json_array:

weight = float(star['weight'].replace('kg',''))

weights. append(weight)

print (weights)

size_list=[]

count_list=[]

size1=0

size2=0

size3=0

size4=0

for weight in weights:

if weight <=45:

size1 += 1

elif 45 < weight <= 50:

size2 += 1

elif 50 < weight <= 55:

size3 +=1

else:

size4 += 1

labels ='<=45kg', '45-50kg', '50~55kg', '>55kg'

sizes =[size1, size2, size3, size4]

explode = (0.1, 0.1, 0, 0)

fig1, ax1 = plt.subplots()

ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',shadow=True, startangle=90)

ax1. axis('equal')

最后得到的数据如下:

感觉小姐姐们的身材都好好啊~~~~~~

后面的课程相对来说,难度就大了起来,就比如说识别小姐姐的名字,一开始的Fine-tune的轮数相对来说较少,然后模型的准确率特别低,后来把轮数改为17,准确率提升了一些。基础不牢,地动山摇,run_states = task.finetune_and_eval()报错的问题想了几个小时没有解决出来,发现群里面很多人也有同样的问题,后来改了下路径才算是解决,可以说是基础不好,调bug能调到心态爆炸。

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()

# print(dataset)

最后的大作业,有的人在作业发布当天下午1两点的时候就提交了,并且还是100分,果然都是狼人,磕磕绊绊一点一点去想实现的过程,然后用代码实现,然后debug,最后代码跑起来,中间真的是有"泪"有笑,不过最后还是坚持下来了,感觉收获了很多。

不过这次课程和百度云的课程结束后我自闭了一晚上,我觉得很多东西学的不是太扎实,对于知识蜻蜓点水式的学习,对于短期来说十分不错,但是对于长期来说十分不好,于是打算好好补一下基础,等到大三的时候再进行实战。

最后,感谢百度,感谢paddle paddle提供了这样的学习的平台,上完了直播课程之后我发现我不想上自己学校的课程了,老师们知识点讲解的特别好,向老师们看齐。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐