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

作业一:输出 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,最后代码跑起来,中间真的是有"泪"有笑,不过最后还是坚持下来了,感觉收获了很多。

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