哈工大人工智能导论实验课程秋季版介绍
博主是24秋上的人工智能导论,几乎每节都有雨课堂小测,老师和助教人都很和蔼,实验验收时稍微讲解思路和代码并进行演示就可以,助教会问一些关于实验二的问题,主要针对的是实验指导书已给出的代码框架部分,实验课时可以提前了解一下主要思想。
1.实验1
1.1实验描述
实验一有如下两种表示方式来实现:
- 谓示词表
- 生成式表示
提供了两个问题:
- 猴子摘香蕉
- 传教士过河
本文选择产生式表示来实现猴子摘香蕉问题。
猴子摘香蕉问题描述:
一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等)。设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态下(设猴子位置为A,香蕉位置在B,箱子位置为C),如何行动可摘取到香蕉。
1.2产生式表示
求解过程如下:
1.2.1 综合数据库设计
(1)综合数据库:(M,B,Box,On,H)
M:猴子的位置
B:香蕉的位置
Box:箱子的位置
On=0:猴子在地板上
On=1:猴子在箱子上
H=0:猴子没有抓到香蕉
H=1:猴子抓到了香蕉
(2)初始状态:(a,c,b,0,0)
(3)结束状态:(c,c,c,1,1)
(4)规则集:
r1: IF (x, y, z, 0, 0) THEN( w, y, z, 0, 0)
r2: IF (x, y, x, 0, 0) THEN (z, y, z, 0, 0)
r3: IF (x, y, x, 0, 0) THEN (x, y, x, 1, 0)
r4: IF (x, y, x, 1, 0) THEN (x, y, x, 0, 0)
r5: IF (x, x, x, 1, 0) THEN (x, x, x, 1, 1)
其中,x,y,z,w为变量。
根据具体问题可将规则具体为:
r1: IF (a, c, b, 0, 0) THEN (b, c,b,0,0)
r2: IF (b, c, b, 0, 0) THEN (c, c,c,0,0)
r3: IF (c, c, c, 0, 0) THEN (c, c,c,1,0)
r5: IF (c, c, c, 1, 0) THEN (c, c,c,1,1)
在已知事实下,r1>r2>r3>r5,可得到香蕉
1.2.2 代码实现
编写代码步骤:
- 定义数据结构
- 定义数据结构的比较方法
- 定义各种规则
- 定义规则集
- 编写solve函数
完整实现代码如下:
#coding:gbk
class State:
def __init__(self, monkey, banana, box, on, have):
"""
定义状态:
monkey: 猴子的位置
banana: 香蕉的位置
box: 箱子的位置
on: on=0猴子在地板上;on=1:猴子在箱子上
have: have=0:猴子没有抓到香蕉;have=1:猴子抓到了香蕉
"""
#初始状态:(a,c,b,0,0)
#结束状态:(c,c,c,1,1)
self.monkey = monkey
self.banana = banana
self.box = box
self.on = on
self.have = have
def __repr__(self):
return f"(Monkey: {self.monkey}, Banana: {self.banana}, Box: {self.box}, On: {self.on}, Have: {self.have})"
def __eq__(self, goal):
# 用于比较两个状态是否相等——无法直接用逻辑比较
return (self.monkey == goal.monkey and
self.banana == goal.banana and
self.box == goal.box and
self.on == goal.on and
self.have == goal.have)
# 设置规则1-6
# 如果猴子不在箱子的位置,则猴子走向箱子
def rule1(state):
if state.monkey != state.box :
new_state = State(state.box, state.banana, state.box, state.on, state.have)
print(f"r1: {state} -> {new_state}")
return new_state
return None
# 如果猴子在箱子的位置,二者不在香蕉的位置且猴子在箱子上,则猴子从箱子上下来
def rule2(state):
if state.monkey == state.box and state.monkey != state.banana and state.on == 1:
new_state = State(state.monkey, state.banana, state.box, 0, state.have)
print(f"r2: {state} -> {new_state}")
return new_state
return None
# 如果猴子在箱子的位置,二者不在香蕉的位置且猴子不在箱子上,则猴子将箱子推向香蕉
def rule3(state):
if state.monkey == state.box and state.monkey != state.banana and state.on == 0:
new_state = State(state.banana, state.banana, state.banana, state.on, state.have)
print(f"r3: {state} -> {new_state}")
return new_state
return None
# 如果猴子、箱子、香蕉在同一位置且猴子不在箱子上,则猴子站上箱子
def rule4(state):
if state.monkey == state.box and state.monkey == state.banana and state.on == 0:
new_state = State(state.monkey, state.banana, state.box, 1, state.have)
print(f"r4: {state} -> {new_state}")
return new_state
return None
# 如果猴子、箱子、香蕉在同一位置、猴子在箱子上且香蕉不在猴子手里,则猴子摘香蕉
def rule5(state):
if state.monkey == state.box and state.monkey == state.banana and state.on == 1 and state.have == 0:
new_state = State(state.monkey, state.banana, state.box, state.on, 1)
print(f"r5: {state} -> {new_state}")
return new_state
return None
# 如果猴子摘到了香蕉,则返回
def rule6(state):
if state.have == 1:
return None
# 设置初始状态和结束状态
initial_state = State('a', 'c', 'b', 0, 0)
goal_state = State('c', 'c', 'c', 1, 1)
# 规则集
rules = [rule1, rule2, rule3, rule4, rule5, rule6]
# 求解过程
def solve(initial_state, goal_state):
current_state = initial_state
while current_state.__eq__(goal_state) == 0:
for rule in rules: #r1 --> r6找到第一个条件符合的规则并执行
new_state = rule(current_state)
if new_state:
current_state = new_state
break
print("\ncatch banana:", current_state)
# 执行求解
solve(initial_state, goal_state)
2. 实验2
2.1 实验环境配置
2.1.1 安装ubuntu18.04
原因:ubuntu24.04不支持gcc7.9及以下版本,需要手动安装和配置
并且操作系统实验也需要旧版本的ubuntu。
镜像网站:
Index of /ubuntu-releases/18.04/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
下载版本:ubuntu-18.04.6-desktop-amd64.iso
下载后在VMWare中安装相应的ubuntu虚拟机即可。
2.1.2 安装MindSpore
版本:2.4.1
硬件平台:CPU
操作系统:linux-x86_64
如果不确定的话,可以到ubuntu虚拟机中执行命令uname -m:
随后正常按照指令安装miniconda、python3.9、gcc7
(1)安装miniconda
注:新安装的虚拟机需要先安装curl,先执行以下指令
sudo apt update
sudo apt install curl
curl --version
再安装miniconda:
cd /tmp
curl -O https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py37_4.10.3-Linux-$(arch).sh
bash Miniconda3-py37_4.10.3-Linux-$(arch).sh -b
cd -
. ~/miniconda3/etc/profile.d/conda.sh
conda init bash
(2)安装python3.9
在miniconda里安装python3.9环境,并创建虚拟环境:
conda create -n mindspore_py39 python=3.9.11 -y
conda activate mindspore_py39
注:虚拟环境安装并创建好后,在终端指令前会增加一个括号和虚拟环境标识(创建虚拟环境时参数mindspore_py39即该虚拟环境的名字);并且可以在该虚拟环境中查看python版本
如果想要退出虚拟环境,则执行指令从虚拟环境中退出。
conda deactivate
如果想要再次进入虚拟环境,则激活该虚拟环境名字即可:
conda activate mindspore_py39
这样仍会进入同一个虚拟环境中。
注:如果终端命令行中首部虚拟环境没有显示为你的虚拟环境名字,而是base,则需要先退出当前虚拟环境再激活你的python3.9虚拟环境:
(3)安装gcc7:
sudo apt-get install gcc-7 -y
(4)安装MindSpore
首先设置版本号变量
export MS_VERSION=2.4.1
随后执行对应环境的安装指令(与本文相同环境,则选择x86_64 & python3.9安装):
# x86_64 + Python3.9
pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/${MS_VERSION}/MindSpore/unified/x86_64/mindspore-${MS_VERSION/-/}-cp39-cp39-linux_x86_64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i Simple Index
执行以下指令检查是否安装成功:
python -c "import mindspore;mindspore.set_context(device_target='CPU');mindspore.run_check()"
如果显示mindspore的版本号及successfully字样,则说明成功安装好了mindspore环境。
2.1.3 设置共享文件夹
(1)创建共享文件夹
按照教程在ubuntu虚拟机与windows主机之间创建共享文件夹,名称为share
【虚拟机】Ubuntu18.04 设置共享文件夹(解决/mnt 目录下没有 hgfs 目录)_ubuntu共享文件夹在哪个目录-CSDN博客
该路径下创建的共享文件尽量先不要移动。(较低的ubuntu18版本感觉没有24智能)
(2)共享并解压实验文件
利用共享文件夹将MNIST_Data文件夹下的四个文件共享到ubuntu中,并且按照要求将其解压。
获得的目录结构如下:
└─MNIST_Data
├─ test
│ t10k-images.idx3-ubyte
│ t10k-labels.idx1-ubyte
└─ train
train-images.idx3-ubyte
train-labels.idx1-ubyte
在~下创建文件夹lenet,并在lenet中创建上述文件结构。
(3)安装gzip解压工具
sudo apt update
sudo apt install gzip
首先将压缩包放到对应的目录下,再执行解压命令:
gzip -d train-images-idx3-ubyte.gz
注:-d参数代表解压不保留源文件。将四个压缩文件全部解压。
2.2其余实验步骤
接下来的实验步骤1-5并不需要在终端中执行什么指令,只需要按照实验指导书中给出的代码补全实验参考文件中的train.py、eval.py、/src/dataset.py中的内容即可。
(博主印象里代码可以在实验指导书中找到几乎全部内容)
补全后将/src文件夹连同train.py与eval.py共享到ubuntu中,接下来首先需要确保你的终端运行在刚刚创建的python3.9虚拟环境中。
实验文件夹下的environment.txt文件夹中标注了easydict,经过验证需要先安装该库才能保证代码正常运行。
pip install easydict
接下来在终端执行train.py与eval.py:
python train.py
执行完这条指令后,首先会有一些显示,然后显示分割线:
============== Starting Training ==============
随后开始训练过程,等待三四分钟后,当epoch为10时结束训练,并显示训练时间:
训练过程中loss值整体上在逐渐减小:
python eval.py
注:需要将eval.py中的default值即为选择的训练好的模型,例如:
parser.add_argument('–ckpt_path', type=str, default="./ckpt/checkpoint_lenet-10_1875.ckpt", help='if mode is test, must provide\ path where the trained ckpt file')
可以在/ckpt文件夹下查看,一共生成了10个训练模型。
运行过程中有一些警告,但只是表示出了部分函数应当修改为更新版本函数的建议,可以不用修改,测试运行结果如下:
可以通过修改函数来消除警告:
只需要将/src/dataset.py中的
import mindspore.dataset.vision.c_transforms as CV
import mindspore.dataset.transforms.c_transforms as C
修改为:
import mindspore.dataset.vision as CV
import mindspore.dataset.transforms as C
其他部分不用进行修改。
再运行eval.py:
python eval.py
得到测试运行结果:
2.3 删除miniconda
实验结束后可以按照如下步骤删除miniconda与相关文件:
2.3.1 卸载 Miniconda
Miniconda 安装目录通常为 ~/miniconda3,删除该目录来卸载 Miniconda。
rm -rf ~/miniconda3
2.3.2 删除配置文件
Miniconda 安装后会修改一些配置文件,需要删除以下配置文件
(1) 删除 .bashrc 文件中的 Miniconda 配置
Miniconda 会修改用户的 .bashrc 文件,添加一些用于初始化 Conda 的行。
# 删除以下与 Miniconda 相关的行
. ~/miniconda3/etc/profile.d/conda.sh
conda activate base
编辑 .bashrc 文件:
nano ~/.bashrc
删除与 Miniconda 相关的行,保存并退出编辑器(在 nano 中按 Ctrl+O 保存,按 Ctrl+X 退出)。
(2) 删除 .condarc 配置文件
Miniconda 还会在用户主目录下生成一个 .condarc 配置文件,用于存储 Conda 的设置。删除该文件:
rm -f ~/.condarc
(3) 删除 Conda 环境相关文件
安装过程中创建了虚拟环境 mindspore_py39,可以删除与之相关的配置文件。
rm -rf ~/.conda
2.3.3 更新 .bashrc
重新加载 .bashrc 来使修改生效:
source ~/.bashrc
2.3.4 清理缓存
rm -rf ~/.cache
2.3.5 删除安装日志文件
如果需要删除安装日志文件来腾出内存空间:
rm -f ~/miniconda3/Miniconda3-py37_4.10.3-Linux-$(arch).sh
3. 实验二华为云部分
不再需要使用ubuntu虚拟机,使用华为云和moelArts(可以将conda卸载后去跑os实验三、、)
实验指导:
使用ModelArts Standard自定义算法实现手写数字识别_AI开发平台ModelArts_华为云
首先需要注册一个华为云账号,并且按照指导中进行modelArts权限管理。
3.1 准备训练数据
与第一部分使用相同的四个数据集
3.2 准备训练文件和推理文件
在windows主机中随便路径创建train.py、customize_service.py与config.json,将网页中给出的代码粘到对应文件中。
3.3 创建OBS桶并上传文件
如何登陆OBS管理控制台:
https://support.huaweicloud.com/clientogw-obs/obs_03_0404.html
新建一个桶后,点击桶名称,进入对象内
在对象内按照要求创建文件夹路径并上传相关文件。
注意:mnist_data文件夹中要上传全部4个数据集。
3.4 创建训练作业
(1)创建训练作业
按要求创建训练作业,并且等待运行结束。
注:需要保存日志,并且在桶内创建一个保存日志的文件夹
“确认”键一直是灰色的话,是在选择免费GPU下有一个橙色提示,需要勾选我已阅读。
(2)训练作业详细情况
由图中可以看出,详细情况中各项均正常。
(3)运行日志
训练作业的日志中标注了一些训练过程中的信息与正确率信息,可以看出准确率在训练过程中不断上升。
(4)输入输出路径
3.5 创建AI应用并部署
(1)利用训练获得的模型创建AI应用
(2)将其部署为在线服务
(3)进入在线服务进行预测
设置参数,按要求上传图片进行预测,预测结果正确。
需要使用提供的模糊数字图片样例,使用平滑图片会导致预测错误。
作者:海藻生境