哈工大人工智能导论实验课程秋季版介绍

博主是24秋上的人工智能导论,几乎每节都有雨课堂小测,老师和助教人都很和蔼,实验验收时稍微讲解思路和代码并进行演示就可以,助教会问一些关于实验二的问题,主要针对的是实验指导书已给出的代码框架部分,实验课时可以提前了解一下主要思想。


1.实验1

1.1实验描述

实验一有如下两种表示方式来实现:

  1. 谓示词表
  2. 生成式表示

提供了两个问题:

  1. 猴子摘香蕉
  2. 传教士过河

本文选择产生式表示来实现猴子摘香蕉问题

猴子摘香蕉问题描述:

一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等)。设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态下(设猴子位置为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 代码实现

编写代码步骤:

  1. 定义数据结构
  2. 定义数据结构的比较方法
  3. 定义各种规则
  4. 定义规则集
  5. 编写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)进入在线服务进行预测

设置参数,按要求上传图片进行预测,预测结果正确。

需要使用提供的模糊数字图片样例,使用平滑图片会导致预测错误。

作者:海藻生境

物联沃分享整理
物联沃-IOTWORD物联网 » 哈工大人工智能导论实验课程秋季版介绍

发表回复