拓展实践:AIoT自动售货机区域销量预测分析

举报
华为IoT云服务 发表于 2023/09/01 15:20:38 2023/09/01
【摘要】 1 实验介绍“云大物智”已经成为目前互联网发展的主要前沿方向,本次实验案例就是借助实际业务场景结合物联网、人工智能技术解决自动售货机的区域销量预测、货物调配等问题。本手册全流程介绍如何基于华为云服务,将开发板上报的数据,传输至ModelArts平台,并基于数据进行AI处理。



1 实验介绍

“云大物智”已经成为目前互联网发展的主要前沿方向,本次实验案例就是借助实际业务场景结合物联网、人工智能技术解决自动售货机的区域销量预测、货物调配等问题。

本手册全流程介绍如何基于华为云服务,将开发板上报的数据,传输至ModelArts平台,并基于数据进行AI处理。

图1-1 无处不在的自贩机文化

图1-2 现存问题分析

图1-3 优化整体思路

图1-4 AIoT流程

2 实验准备

2.1 登录华为云

步骤 1 登录华为云首页。

步骤 2 单击页面右上角的“登录”。

步骤 3 输入账号名(或邮箱)和密码,单击“登录”。

说明:

  • 当输入信息错误达到3次时,需要输入验证码。
  • 使用“手机号登录”时,如当前手机号码已注册多个华为云账号,请先选择此次需要登录的账号。
  • 更多登录方式,请参考登录华为云


步骤 4 若是IAM用户,请切换“IAM用户登录”,输入账号名、用户名/邮箱/手机和密码,单击“登录”。

  • 账号名:IAM用户所属的账号。
  • 用户名/邮箱:在IAM创建用户时,输入的用户名/邮箱,例如“James”。如果不知道用户名及初始密码,请向管理员获取。
  • 密码:IAM用户的密码,非账号密码。

----结束


2.2 资源准备

步骤 1 下载MQTT设备模拟器zip

下载链接:https://obs-pipeline.obs.cn-north-4.myhuaweicloud.com/sdkDeploy/simulator/MQTT_Simulator.zip


步骤 2 下载物模型文件zip

下载链接:https://iot-tools.obs.cn-north-4.myhuaweicloud.com:443/AIoT123_Model.zip


步骤 3 下载模型训练数据文件devrun-1024-iotda.zip

下载链接:https://iot-tools.obs.cn-north-4.myhuaweicloud.com:443/devrun-1024-iotda.zip

解压获取如下文件:

----结束


3 设备上报数据至IoT平台

3.1 创建产品

步骤 1 登录华为云控制台,单击左上角的切换至“华北-北京四”,展开服务列表并搜索“设备接入”,选择“物联网 > 设备接入服务”。


步骤 2 在左侧导航栏,选择“产品”,单击“创建产品”,填写参数信息后,单击“立即创建”。

  • 所属资源空间:选择默认资源空间即可
  • 产品名称:自定义,如AIoT123
  • 协议类型:MQTT
  • 数据格式:JSON
  • 设备类型选择:自定义类型
  • 设备类型:自定义,如AIoT

步骤 3 产品创建成功,请单击产品名称或“详情”,进入产品详情页。

步骤 4 单击“上传模型文件”,选择模型文件后,单击“确定”。

请将资源准备中下载的物模型文件AIoT123_Model.zip上传。

----结束


3.2 注册设备

步骤 1 进入设备接入控制台,在左侧导航栏,选择“设备 > 所有设备”,单击“注册设备”,填写设备信息后,单击“确定”。

  • 所属资源空间:与创建产品时的选择一致
  • 所属产品:选择已创建的产品,如AIoT123
  • 设备标识码:自定义,如112233f
  • 设备名称:自定义,如AIoT-01
  • 设备认证类型:密钥
  • 密钥/确认密钥:自定义,如12345678


步骤 2 设备注册成功,单击“保存并关闭”下载记录设备ID和密钥的文件。


----结束


3.3 创建数据接入通道

步骤 1 登录华为云控制台,单击左上角的切换至“华北-北京四”,展开服务列表并搜索“dis”,选择“EI 企业智能 > 数据接入服务”。


步骤 2 单击“购买接入通道”,进入购买页面。


步骤 3 填写参数信息后,单击“立即购买”。

  • 计费模式:按需购买
  • 区域:华北-北京四
  • 通道名称:自定义,如dis-iot
  • 通道类型:普通
  • 分区数量:1
  • 生命周期(小时)24
  • 源数据类型:JSON
  • 自动扩缩容:关闭
  • Schema开关:关闭


步骤 4 确认规格后,单击“提交”。


购买成功后,在“通道管理”页面查看通道信息。


----结束


3.4 创建数据转发规则

步骤 1 进入设备接入控制台,在左侧导航栏,选择“规则 > 数据转发”,单击“创建规则”。


步骤 2 设置转发数据:填写参数信息后,单击“创建规则”。

  • 规则名称:自定义,如to_DIS
  • 数据来源:设备属性
  • 触发事件:设备属性上报
  • 资源空间:选择默认资源空间
  • 数据过滤语句:选择按产品模型AIoT123进行过滤


步骤 3 设置转发目标:添加转发目标,并“确定”。

  • 转发目标:数据接入服务(DIS)
  • 区域:华北-北京四/cn-north-4
  • 归属通道:自有通道
  • 通道:选择已创建的数据接入通道,如dis-iot


步骤 4 启动规则:单击“启动规则”,让规则变为运行态。


规则运行中,如下图所示:


----结束


3.5 创建OBS桶连接DIS

创建OBS

步骤 1 登录华为云控制台,单击左上角的切换至“华北-北京四”,展开服务列表并搜索“obs”,选择“存储 > 对象存储服务”。


步骤 2 单击页面右上角的“创建桶”。


步骤 3 填写参数后,单击“立即创建”。

  • 区域:华北-北京四
  • 桶名称:自定义,如devrun(因为桶名称需全局唯一,可以加上姓名拼音后缀,如devrun-Vz
  • 数据冗余存储策略:单AZ存储
  • 默认存储类型:标准存储
  • 桶策略:私有
  • 其他参数:使用默认配置即可


步骤 4 创建完成,单击桶名称,如devrun,进入桶概览页。在左侧导航栏,选择“对象”,单击“新建文件夹”,新建data文件夹。


步骤 5 进入data文件夹,单击“新建文件夹”,新建input文件夹。


----结束


DIS通道添加转储任务

在数据接入服务下添加转储任务,使DIS内流入的数据转存储至创建的OBS桶内。

步骤 1 进入数据接入服务控制台,在左侧导航栏,选择“通道管理”,单击已创建的通道名称,如dis-iot


步骤 2 在通道详情页面,单击“转储任务 > 添加转储任务”。


步骤 3 填写参数后,单击“立即创建”。

  • 源数据类型:JSON
  • 转储服务类型:OBS
  • 任务名称:自定义,如task_aiot
  • 转储文件格式:Text
  • 数据转储地址:选择已创建的OBS桶,如devrun
  • 转储文件目录:设定一个自定义多层目录,如data/input/

因根目录需要存放其他文件,多层目录便于隔离,有数据流入后相应文件夹会自动创建,也可以先到obs桶控制台里依样创建。

  • 其他参数:与图例保持一致


步骤 4 创建完成后返回转储任务列表,即可看到转储任务已添加完成,状态为“运行中”。


----结束


3.4 设备上报数据

模拟器与平台建立连接

步骤 1 解压2.2 资源准备中下载的MQTT设备模拟器zip包,双击启动设备接入模拟器(device_demo_mqttnet.exe)。

步骤 2 输入服务IP,设备ID,设备密钥,单击“Connect”。

  • Server Address:从设备接入控制台总览页获取,填写为MQTT/MQTTS接入信息的域名
  • Device ID注册设备成功后返回的设备ID
  • Device Secret注册设备成功后返回的设备密钥


步骤 3 建立连接成功后,设备变为“在线”状态。

若无法建立连接,请打开“命令提示符”窗口,输入“ping 服务IP”查看您的主机是否能和华为云物联网平台正常通信,若无法正常通信,请更换主机的网络环境。


----结束


模拟器设备上报数据

步骤 1      模拟器发送消息,上报设备属性。


可以从资源准备中获取的devrun-1024-iotda.json文件中,取前三行数据并删除device_id后进行上报。

消息内容1

{
    "services" : [{
            "service_id" : "order",
            "properties" : {
                "orderID" : "00000001",
                "userID" : "066503",
                "userAge" : 24,
                "deviceID" : "WZ_10-005",
                "area" : "WZ",
                "region" : "Mall",
                "longitude" : 120.95,
                "latitude" : 28.13,
                "orderTime" : "1572560084975",
                "payment" : "UnionPay",
                "water_Num" : 0,
                "water_Price" : 1,
                "cola_Num" : 0,
                "cola_Price" : 3,
                "tea_Num" : 0,
                "tea_Price" : 3,
                "coffee_Num" : 0,
                "coffee_Price" : 5,
                "milk_Num" : 0,
                "milk_Price" : 4,
                "juice_Num" : 0,
                "juice_Price" : 3,
                "yogurt_Num" : 0,
                "yogurt_Price" : 4,
                "bread_Num" : 0,
                "bread_Price" : 7,
                "sanwiches_Num" : 0,
                "sanwiches_Price" : 7,
                "sugar_Num" : 0,
                "sugar_Price" : 2,
                "status" : 0,
                "totalCost" : 0
            },
            "event_time" : "20200824T162716Z"
        }
    ]
}


消息内容2

{
    "services" : [{
            "service_id" : "order",
            "properties" : {
                "orderID" : "00000002",
                "userID" : null,
                "userAge" : 46,
                "deviceID" : "WZ_2-001",
                "area" : "WZ",
                "region" : "School",
                "longitude" : 120.82,
                "latitude" : 27.93,
                "orderTime" : "1572560183069",
                "payment" : "Cash",
                "water_Num" : 0,
                "water_Price" : 1,
                "cola_Num" : 1,
                "cola_Price" : 3,
                "tea_Num" : 0,
                "tea_Price" : 3,
                "coffee_Num" : 0,
                "coffee_Price" : 5,
                "milk_Num" : 0,
                "milk_Price" : 4,
                "juice_Num" : 0,
                "juice_Price" : 3,
                "yogurt_Num" : 0,
                "yogurt_Price" : 4,
                "bread_Num" : 1,
                "bread_Price" : 7,
                "sanwiches_Num" : 0,
                "sanwiches_Price" : 7,
                "sugar_Num" : 0,
                "sugar_Price" : 2,
                "status" : 1,
                "totalCost" : 10
            },
            "event_time" : "20200824T162717Z"
        }
    ]
}


消息内容3

{
    "services" : [{
            "service_id" : "order",
            "properties" : {
                "orderID" : "00000003",
                "userID" : null,
                "userAge" : 38,
                "deviceID" : "LS_2-002",
                "area" : "LS",
                "region" : "Hospital",
                "longitude" : 120.28,
                "latitude" : 28.15,
                "orderTime" : "1572560256159",
                "payment" : "Cash",
                "water_Num" : 0,
                "water_Price" : 1,
                "cola_Num" : 0,
                "cola_Price" : 3,
                "tea_Num" : 0,
                "tea_Price" : 3,
                "coffee_Num" : 0,
                "coffee_Price" : 5,
                "milk_Num" : 0,
                "milk_Price" : 4,
                "juice_Num" : 0,
                "juice_Price" : 3,
                "yogurt_Num" : 0,
                "yogurt_Price" : 4,
                "bread_Num" : 0,
                "bread_Price" : 7,
                "sanwiches_Num" : 0,
                "sanwiches_Price" : 7,
                "sugar_Num" : 0,
                "sugar_Price" : 2,
                "status" : 0,
                "totalCost" : 0
            },
            "event_time" : "20200824T162717Z"
        }
    ]
}


步骤 2      进入设备接入控制台,在设备详情页查看最新上报数据。

 

 步骤 3      观察到DISOBS内均有数据流入存储。

查看数据接入服务dis-iot通道详情:


查看对象存储服务devrun桶的/data/input目录:


 步骤 4      在对象存储服务devrun桶的/data/input目录,单击“上传对象”,上传2.2 资源准备获取的数据文件“devrun-1024-iotda.json”,并删除转储生成的文件。

注:为了方便模型训练,实验提前准备了训练数据集文件,


步骤 5      在对象存储服务devrun桶的/data目录,单击“上传对象”,上传notebook文件“aiot-predict.ipynb”和“模型应用.ipynb”。


----结束


4 各区域物品销售量预测

4.1 创建Notebook

步骤 1 登录华为云控制台,单击左上角的切换至“华北-北京四”,展开服务列表并搜索“modelarts”,选择“EI 企业智能 > ModelArts”。


步骤 2 在左侧导航栏,选择“开发环境 > Notebook”,单击“创建”。


步骤 3 填写服务选型参数,单击“下一步”。

  • 名称:自定义,如notebook-aiot
  • 自动停止:2小时


  • 镜像:公共镜像 | tensorflow1.13-cuda10.0-cudnn7-ubuntu18.04
  • 资源类型:公共资源池
  • 类型:GPU
  • 规格:GPU: 1*T4(16GB)|CPU: 8 32GB
  • 存储配置:云硬盘EVS | 磁盘规格 5GB


步骤 4 规格确认后,单击“提交”。


等待Notebook实例状态变为“运行中”,即表示实例创建成功。


----结束


4.2 数据预处理

步骤 1 打开已创建的Notebook,如notebook-aiot


步骤 2 上传aiot-predict.ipynb到工作磁盘。


步骤 3 在工作磁盘新建input目录,并进入input目录上传devrun-1024-iotda.json文件。


步骤 4 双击打开aiot-predict.ipynb,并根据提示选择TensorFlow-1.13-gpu内核。


步骤 5 依次执行各cell代码段。

绿色:表示编辑状态,可修改代码。


蓝色:表示选定状态,可单击Run执行。


[*] :表示该代码段正在执行,请等待执行完成,再进入下一步。


步骤 6 导入软件包。

%matplotlib inline 
# 导入软件包
import pandas as pd 
import numpy as np 
import json 
import os 
import os.path

步骤 7 自定义文件合并函数。

# 自定义文件合并函数
def MergeJson(filepath,outfile): 
    k = open(filepath+outfile,'a+') 
    for parent,dirnames,filenames in os.walk(filepath): 
        for filepath in filenames: 
            jsonPath = os.path.join(parent,filepath) 
            f = open(jsonPath) 
            k.write(f.read()+"\n") 
    k.close() 
if __name__ == '__main__': 
    filepath = "./input/" # 读取数据文件路径,此处为./input/
    outfile = "devrun-1024-iotda.json" 
MergeJson(filepath,outfile) # 输出路径同filepath,在/input/下

步骤 8 读取json格式数据。

# 读取json格式数据并列出五行数据进行查看
data = pd.read_json('./input/details.json',lines = True) 
data.head(5)


步骤 9 解析json格式。

# 解析json格式数据
data['service_id'] = data['services'].apply(lambda x:x[0]['service_id']) 
data['event_time'] = data['services'].apply(lambda x:x[0]['event_time']) 
data['temp_data_cols'] = data['services'].apply(lambda x:list(x[0]['properties'].values())) 
data['temp_data_cols1'] = data['temp_data_cols'].apply(lambda x:','.join([str(y) for y in x])) 
data_val = data['temp_data_cols1'].str.split(',',expand=True) 
keys_array = list(data['services'][0][0]['properties'].keys()) 
data_val.columns = keys_array 
data_tem = pd.concat([data,data_val],axis=1) 
data_tem.head()


步骤 10 修改时间戳格式。

# 修改时间戳格式
import time 
def convert_str_timestamp(input_str): 
    float_time = float(input_str)/1000 
    timestamp = time.localtime(float_time) 
    str_time = time.strftime("%Y--%m--%d ",timestamp) 
    return str_time 

data_tem['order_Time'] = data_tem['orderTime'].apply(lambda x:convert_str_timestamp(x)) 
data_tem.head() # 查看数据,最后一列是新修改生成的order_Time


# 将新生成的字段order_time的值赋给原字段orderTime,新字段后续待删除
data_tem['orderTime'] = data_tem['order_Time']


步骤 11 提取区域信息。

deviceID字段格式为“HZ_7-005”,其中“HZ”为城市缩写,“HZ_4”表示“杭州第4个区”,需要从deviceID中提取出区域,并生成一个新的字段“district”。

# 提取区域信息
# deviceID字段格式为“HZ_7-005”,其中“HZ”为城市缩写,“HZ_4”表示“杭州第4个区”,需要从deviceID中提取出区域,并生成一个新的字段“district”
data_tem['district'] = data_tem['deviceID'].str.split('-',True).str[0:1] 
data_tem['district'] = data_tem['district'].apply(lambda x:"".join(x))

# 查看新生成的数据,最后一列为新生成的字段district
data_tem.head()


步骤 12 删除多余的数据列。

# 删除开发板自定义的列 
data_new = data_tem.drop(['device_id','event_time', 'service_id','services','order_Time','temp_data_cols','temp_data_cols1'],axis=1) 

# 查看整理后的数据
data_new.head(5) 

整理后的数据为(部分显示):

查看新生成数据列。

data_new.columns # 查看新生成的数据列


步骤 13 保存数据。

使用to_csv()方法将解析后数据文件保存为csv格式文件,并且将保存的数据上传保留至OBS桶内,以便于后续其他AI项目使用。

# 保存数据:在当前路径转为csv格式,首列是行索引不保留
data_new.to_csv('./details.csv',index=0) 

# 此时details.csv已产生与ipynb同目录,但jupyter界面不可见
# 将details.csv上传到OBS桶内
from modelarts.session import Session
session = Session()
session.upload_data(bucket_path="/devrun/data/", path=r'./details.csv')
# bucket_path定义OBS桶路径,格式为:“/bucket_name/dir1/”,其中“bucket_name”为OBS桶名
# 此处为上传单个文件,path为本地路径,参数类型为string;

上传后在OBS内和ModelArts内都可见该details.csv,后续其他开发可读,读取时先选中对其Sync OBS


步骤 14 查看样本量以及字段数量。

# 调用pandas中shape函数,查看样本量以及字段数量
data_new=pd.read_csv('./details.csv') 
data_new.shape


步骤 15 查看字段类型。

data_new.dtypes # 查看字段类型


步骤 16 查看缺失值。

# 查看缺失值
# 安装并导入missingno库,并调用missingno.matrix()方法,将每个列的缺失值以矩阵的形式进行展示
!pip install missingno 
import missingno as msno 
msno.matrix(data_new,figsize=(31,10))


步骤 17 查看各城市消费总金额的分布情况。

# 查看各城市消费总金额的分布情况
%matplotlib inline 
# 显示图像结果,否则输出结果为图像内存地址 
import seaborn as sns 
import matplotlib.pyplot as plt 
sns.barplot(data=data_new,x='area',y='totalCost',palette="Set2",estimator = sum)


步骤 18 字段转换。

# 通过字典将城市名称缩写转换为全称
dict_city ={u'HZ':"杭州", 
            u'WZ':"温州", 
            u'NB':"宁波", 
            u'QZ':"衢州", 
            u'SX':"绍兴", 
            u'ZS':"舟山", 
            u'LS':"丽水", 
            u'TZ':"台州", 
            u'JH':"金华", 
            u'HuZ':"湖州", 
            u'JX':"嘉兴" } 
# 通过字典将支付方式转换为整形枚举值
dict_payment ={u'Cash':0, 
                u'UnionPay':1, 
                u'Alipay':2, 
                u'WeChat':3} 
data_new.payment = data_new.payment.apply(lambda x: dict_payment[x]) 
data_new.area = data_new.area.apply(lambda x: dict_city[x]) 
data_new.head()


步骤 19 明确预测的区域和商品。

# 明确预测的区域和商品
# 通过输入要预测的城市名、区域名和物品名称,筛选出目标数据
area_name=input("请输入您要预测的城市:") 
data1=data_new[data_new['area'].isin([area_name])] 
region=input("请输入您要预测的城市区域:") 
data2=data1[data1['region'].isin([region])] 
good_name=input("输入您要预测的物品:") 
columns_name=["userAge","area","region","longitude","latitude","orderTime","payment",good_name+"_Num"] 
data3=data2[columns_name] 
data3.head()

# 此处以 绍兴 Station water 为例

将城市、区域和下单时间从数据中删除:

# 将城市、区域和下单时间从数据中删除
data3.drop("area", axis = 1 ,inplace = True) 
data3.drop("region", axis = 1 ,inplace = True) 
data3.drop("orderTime", axis = 1 ,inplace = True) 
data3.head() # 查看删除后的结果

----结束


4.3 数据集划分

步骤 1 将数据划分特征数据和标签数据。

# 将数据划分特征数据和标签数据
label=data3.water_Num 
label=label.astype(float) 
data3.drop("water_Num",axis=1,inplace=True) 
data_all=data3 
print(data_all)

结果如下:


步骤 2 特征数据标准化。

# 特征数据标准化:由于不同特征的数值不在同一量纲下,我们需要将所有的特征数值规范到同一量纲下
data_all=data_all.astype(float) 
data_all = np.log(data_all+0.001) 
data_all.hist(figsize=(20, 15), color = 'c')

结果如下:


步骤 3 准备训练数据和测试数据。

将特征数据按7:3的比例划分为训练数据和测试数据,将标签数据同按7:3的比例划分为训练标签和测试标签。

# 准备训练数据和测试数据
# 将特征数据按7:3的比例划分为训练数据和测试数据,将标签数据按7:3的比例划分为训练标签和测试标签
from sklearn.model_selection import train_test_split 
data_train, data_holdout, label_train, label_holdout = train_test_split(data_all, label, test_size=0.3, random_state=17)

----结束


4.4 构建模型

步骤 1 导入keras模块。

Keras模块是Tensorflow深度学习框架一个重要模块,该模块里面封装了大部分的深度学习核心函数,构建网络,模型评估均可使用Keras模块。

# 导入keras模块
# Keras模块是Tensorflow深度学习框架一个重要模块,该模块里面封装了大部分的深度学习核心函数,构建网络,模型评估均可使用Keras模块
from keras import models 
from keras import layers


步骤 2 构建神经网络。

通过构建函数的形式,一层一层的将网络模型构建起来。

# 构建神经网络
# 通过构建函数的形式,一层一层的将网络模型构建起来
def build_model(): 
    model = models.Sequential() 
    model.add(layers.Dense(64, activation='relu', input_shape=(data_train.shape[1],))) 
    model.add(layers.Dense(64, activation='relu')) 
    model.add(layers.Dense(1)) 
    model.compile(optimizer='rmsprop', loss='mse', metrics=['mae']) 
    return model

----结束


4.5 训练模型

步骤 1 使用五倍交叉验证的方法搜索模型里的最佳超参。

# 训练模型:五倍交叉验证训练
# 使用五倍交叉验证的方法搜索模型里的最佳超参
import numpy as np 
k = 5 
num_val_samples = len(data_train) // k #整数除法 
num_epochs = 25
all_mae_histories = []

for i in range(k): 
    print('processing fold #', i) 
    #依次把k分数据中的每一份作为校验数据集 
    val_data = data_train[i * num_val_samples : (i+1) * num_val_samples] 
    val_targets = label_train[i* num_val_samples : (i+1) * num_val_samples] 
    #把剩下的k-1分数据作为训练数据,如果第i分数据作为校验数据,那么把前i-1份和第i份之后的数据连起来 
    partial_train_data = np.concatenate([data_train[: i * num_val_samples], data_train[(i+1) * num_val_samples:]], axis = 0) 
    partial_train_targets = np.concatenate([label_train[: i * num_val_samples], label_train[(i+1) * num_val_samples: ]], axis = 0) 

    print("build model") 
    model = build_model() 
    #把分割好的训练数据和校验数据输入网络 
    history = model.fit(partial_train_data, 
                        partial_train_targets, 
                        validation_data=(val_data, val_targets), 
                        epochs = num_epochs, 
                        batch_size = 1, 
                        verbose = 0) 
    mae_history = history.history['val_mean_absolute_error'] 
    all_mae_histories.append(mae_history)

结果如下:


----结束


4.6 模型评估

步骤 1 结果平均化。

# 模型评估:结果平均化
# 由于评测结果指标随着迭代训练模型和五倍交叉验证划分训练数据和验证数据,产生很多评测结果指标
# 需将模型训练中得到的验证集上的结果求平均来表示模型的性能

average_mae_history = [np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]


步骤 2 评估结果可视化。

# 模型评估:评估结果可视化
# 使用matplotlib模块将评估结果随着迭代次数的变化趋势用折线图的形式展示出来

import matplotlib.pyplot as plt 
plt.plot(range(1, len(average_mae_history) + 1), average_mae_history) 
plt.xlabel('Epochs') 
plt.ylabel('Validation MAE') 
plt.show()

结果如下:


# 从上图看到,数据段误差值变动很剧烈,但我们从图中很难看出不同点之间的差异究竟是多少
# 为了把第20个epoch后面的数据差异更明显的展现出来,我们对数据做一些变换

def smooth_curve(points, factor=0.9): 
    smoothed_points = [] 
    for point in points: 
        if smoothed_points: 
            previous = smoothed_points[-1] 
            smoothed_points.append(previous * factor + point * (1 - factor)) 
        else: 
            smoothed_points.append(point) 
    return smoothed_points 

smooth_mae_history = smooth_curve(average_mae_history[20:]) 

plt.plot(range(1, len(smooth_mae_history)+1), smooth_mae_history) 
plt.xlabel('Epochs') 
plt.ylabel('Validation MAE') 
plt.show()

结果如下:


步骤 3 测试数据检验。

# 测试数据检验
test_mse_score, test_mae_score = model.evaluate(data_holdout, label_holdout) 
print(test_mae_score)

结果如下:


根据检验结果发现,在本次实验中,模型的性能很差,这也和我们数据维度不大数据量不足有关。我们后续工作可以将数据的维度加大,来提高模型的性能。

----结束


4.7 模型保存

步骤 1 在工作磁盘新建model目录。


步骤 2 保存模型。

将训练好的模型保存到我们新建的model文件夹下。

# 保存模型
# 将训练好的模型保存到新建的model文件夹下
model.save('./model/NN.model')

# 此时NN.model已产生在model目录下,但jupyter界面不可见
# 将NN.model上传到OBS桶内
from modelarts.session import Session
session = Session()
session.upload_data(bucket_path="/devrun/data/model/", path=r'./model/NN.model')
# bucket_path定义OBS桶路径,格式为:“/bucket_name/dir1/”,其中“bucket_name”为OBS桶名
# 此处为上传单个文件,path为本地路径,参数类型为string;

----结束


4.8 模型应用

步骤 1      保存测试数据。

# 保存测试数据
# 将训练模型前分的测试数据保存下来,看作新数据来使用
data_holdout.to_csv('./newdata.csv')

# 此时newdata.csv已产生与ipynb同目录,但jupyter界面不可见
# 将newdata.csv上传到OBS桶内
from modelarts.session import Session
session = Session()
session.upload_data(bucket_path="/devrun/data/", path=r'./newdata.csv')

步骤 2      上传模型应用.ipynb到工作磁盘。


步骤 3      双击打开模型应用.ipynb,并根据提示选择TensorFlow-1.13-gpu内核。


步骤 4      模型应用。

首先导入需要的模块,再读取数据,然后使用保存的模型进行预测。

# 导入需要的模块pandas和tensorflow
import pandas as pd 
import tensorflow as tf 

# 读取数据newdata.csv
# 并使用模型NN.model进行预测
data=pd.read_csv('./newdata.csv') 
model = tf.keras.models.load_model('./model/NN.model') 
data.drop("Unnamed: 0",axis = 1 ,inplace = True) 
prediction = model.predict(data) 
print(prediction)

结果如下:

准确值介于0-1之间,数值越小表示模型预测性能越差,数值越大表示模型预测性能越好。


----结束


5 资源释放

删除DIS资源

步骤 1 进入数据接入服务控制台,在左侧导航栏,选择“通道管理”,根据通道名称选择,如dis-iot,单击“操作”列的“删除”。

----结束

删除OBS资源

步骤 1 进入对象存储服务控制台,单击已创建的桶名称,如devrun,进入详情页面;在左侧导航栏,选择“对象”,右侧勾选全部,单击“删除”。

步骤 2 返回对象存储列表,删除桶,如devrun

----结束

删除设备接入资源

步骤 1 进入设备接入控制台,在左侧导航栏,选择“规则”,删除数据转发规则,如to_DIS

步骤 2 在左侧导航栏,选择“设备 > 所有设备”,删除设备,如112233f

步骤 3 在左侧导航栏,选择“产品”,删除产品,如AIoT123

----结束

删除ModelArts资源

步骤 1 进入ModelArts控制台,在左侧导航栏,选择“开发环境 > Notebook”,删除实例,如notebook-aiot

----结束


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。