• 江苏首场!2022华为开发者大赛暨HCSD校园沙龙落地无锡
    9⽉14⽇,【华为开发者大赛暨HCSD校园沙龙】走进无锡南洋职业技术学院。本次活动由华为技术有限公司主办,华为云开发者联盟产品部、华为无锡软件开发云创新中心联合承办,无锡南洋职业技术学院·智能装备与信息工程学院协办。2022华为开发者大赛联合高校圈层活动品牌HCSD(Huawei Cloud Student Developers)推出【华为开发者大赛暨HCSD校园沙龙】活动,旨在协华为专家走进校园,与高校开发者共话行业技术、勇攀技术高峰,共建高校生态,助力院校人才培养。活动现场合照活动伊始,无锡市计算机学会副理事长兼秘书长致辞表示,华为在人才培养方面提供了很好的资源与平台,希望同学们好好利用本次机会,积极参与活动。本次沙龙活动促进了校企合作实质性深层次开展。无锡市计算机学会副理事长兼秘书长随后,华为大赛运营专家刘雅婕详细介绍了华为开发者大赛江苏赛区,本届大赛江苏赛区以“Spark Infinity 创想无限”为主题。此次在无锡正式启动的2022华为开发者大赛江苏赛区是中国赛区的一个重要组成部分。面向开发者开放华为云能力,为广大开发者提供了海量API接口。也期待各位开发者通过大赛这个顶级竞技舞台,可以发挥想象力进行创新创造,结合实际场景,解决行业痛点,共建云生态。参赛者可在华为云官网报名,作品征集将持续至2022年10月8日,开发者可以充分发挥想象力进行创新创造,解决实际问题。华为开发者大赛运营专家 刘雅婕如今,以云和AI为核心的全场景智慧时代正在加速到来,各行各业将通过新技术进行数字化转型,重构体验、优化流程、使能创新,打造面向未来的核心竞争力。那么高校开发者如何抓住时代机遇学好AI呢?华为云EI开发者生态工程师青姚老师人工智能定位、人工智能技术发展历程、人工智能入门难点及AI工程师面临的问题和挑战、华为云一站式AI开发管理平台ModelArts、AI Gallery社区、华为云开发者认证简介和华为云开发者认证权益等方面问题,进行了深入浅出的讲解。还带领学生体验了华为云开发者认证中的热门实验,学习了解如何使用文字识别OCR服务,既提升了同学们的运用能力,也带领同学们通过实践体验开发乐趣,增强同学们考取华为云开发者认证的信心。华为云EI开发者生态工程师 青姚活动现场,同学们踊跃参与,氛围十分活跃,不少同学抓住机会与专家进行互动问答,切磋交流。转眼活动进入尾声,还为同学们开放了华为云开发者认证考试券名额,旨在通过开发者认证体系,帮助同学们学习并考取认证,真正在云上作业,懂开发会开发,进而助力数字产业人才生态发展。活动现场学生实操
  • 华为云HCSD校园沙龙落地南昌
    10⽉18⽇下午,华为云【HCSD校园沙龙】走进江西应用科技学院。本次活动由华为技术有限公司主办,华为云开发者联盟产品部、华为(江西)VR/AR软件中心、华为(江西)智能网联汽车产业创新中心承办,江西应用科技学院软件与区块链学院协办。华为云推出【HCSD校园沙龙】活动,旨在携行业专家走进校园,与高校开发者共话行业技术、勇攀技术高峰,共建高校生态,助力院校人才培养。活动伊始,江西应用科技学院软件与区块链学院院长卞秀运对举办此次活动的目的作出说明,并向在场同学介绍此次莅临活动的嘉宾和专家。随后江西应用科技学院副校长李建萍发表致辞,他表示江西应用科技学院一直“坚持产教融合,深度开展校企合作”的办学特色,与华为公司一直保持着深度合作,探索Harmony OS人才培养模式,先后多名老师参加了华为的专项学习和培训,致力于将学校建设成为应用型技术技能型人才培养、前沿技术研发、人才创新创业的新高地。同时他也相信通过本次HCSD校园沙龙活动,同学们对华为云将会有更深刻的了解,对于如何成为一名优秀的开发者有更明确的方向和目标。深化人才培养,助力产教融合华为开发者创新中心运营总监高荀则从产业发展与人才培养双向驱动的角度出发,展开题为《华为开放能力 助力新时代人才培养》的主旨演讲。在演讲中,高荀向在场学生介绍了华为开放能力,并分享华为开发者创新应用中心的运营模式等相关内容。期间,她重点提到华为云人才培养战略,将多维度互动体验式教学,助力院校培养高水平应用型学生。同时,华为还将基于对产业行业的政策、市场、技术调研和发展趋势的预判,融合华为商用解决方案产品与技术,结合高校专业原有人才培养方案与教学计划,共同制定适合高校教学,适应行业需求,具备产教融合特色的人才培养方案,教学计划与课程体系,帮助高校明确与细化专业培养、目标及学生毕业能力要求。AI实操升级,行业专家现场支招如今,以云和AI为核心的全场景智慧时代正在加速到来,各行各业将通过新技术进行数字化转型,重构体验、优化流程、使能创新,打造面向未来的核心竞争力。那么高校开发者如何抓住时代机遇,学好AI呢?华为云EI开发者生态工程师岩风针对人工智能定位、人工智能技术发展历程、人工智能入门难点及AI工程师面临的问题和挑战、华为云一站式AI开发管理平台ModelArts、AI Gallery社区、华为云开发者认证简介和华为云开发者认证权益等方面问题,进行了深入浅出的讲解。还带领学生体验了华为云开发者认证中的热门实验<图像动漫化>,学习了解如何将图像变成动漫效果,既提升了同学们的运用能力,也带领同学们通过实践体验开发乐趣,增强同学们考取华为云开发者认证的信心。活动现场,同学们也踊跃参与到讨论中,氛围十分活跃,不少同学抓住此次机会与专家进行互动问答、切磋交流。转眼活动进入尾声,华为还为江西应用科技学院同学们开放了华为云开发者认证专属考试券名额,旨在通过开发者认证体系,帮助同学们学习并考取认证,真正在云上作业,懂开发会开发,进而助力数字产业人才生态发展。一直以来,华为云创新中心都积极与高校以及产教融合机构紧密合作,持续孵化江西开发者人才生态圈。华为云创新中心也将基于华为云生态体系,面向江西各大高校构筑开发者生态,输出华为云技术能力,为校园开发者提供丰富的开发工具、搭建学习、交流、分享、实践的平台,营造本地产业生态,建立伙伴互利共赢的合作机制。面向未来,华为云将继续扎根江西省,深入不同领域业务场景,加速全栈创新,为开发者带来实际技术提供支持,与伙伴一同发展,共同加快产业数字化进程,提升核心竞争力,助力江西培育更加适宜的“数字生态”,播撒更多优良的“技术种子”,打造数字经济发展新高地。
  • [技术干货] 使用DQN算法玩“2048”游戏
    实验目标通过本案例的学习和课后作业的练习:了解DQN算法的基本概念了解如何基于DQN训练一个小游戏了解强化学习训练推理游戏的整体流程你也可以将本案例相关的 ipynb 学习笔记分享到 AI Gallery Notebook 版块获得成长值,分享方法请查看此文档。案例内容介绍《2048》是一款单人在线和移动端游戏,由19岁的意大利人Gabriele Cirulli于2014年3月开发。游戏任务是在一个网格上滑动小方块来进行组合,直到形成一个带有有数字2048的方块。该游戏可以上下左右移动方块。如果两个带有相同数字的方块在移动中碰撞,则它们会合并为一个方块,且所带数字变为两者之和。每次移动时,会有一个值为2或者4的新方块出现,所出现的数字都是2的幂。当值为2048的方块出现时,游戏即胜利,该游戏因此得名。(源自维基百科) DQN是强化学习的经典算法之一,最早由DeepMind于2013年发表的论文“Playing Atari with Deep Reinforcement Learning”中提出,属于value based的model free方法,在多种游戏环境中表现稳定且良好。 在本案例中,我们将展示如何基于simple dqn算法,训练一个2048的小游戏。整体流程:安装基础依赖->创建2048环境->构建DQN算法->训练->推理->可视化效果DQN算法的基本结构Deep Q-learning(DQN)是Q-learing和神经网络的结合,利用经验回放来进行强化学习的训练,结构如下:神经网络部分神经网络用来逼近值函数,一般采用全连接层表达特征输入,采用卷积层表达图像输入。其损失函数表达为γ经验折扣率,γ取0,表示只考虑当下,γ取1,表示只考虑未来。经验回放经验回放是指:模型与环境交互得到的(s,a,r,s')会存入一个replay buffer,然后每次从中随机采样出一批样本进行学习。采用该策略的优点如下:减少样本之间的相关性,以近似符合独立同分布的假设;同时增大样本的利用率。探索策略一般采用贪婪探索策略,即agent以ε的概率进行随机探索,其他时间则采取模型计算得到的动作。DQN的整体结构可以简单的表示为:​DQN论文Nature DQN论文Nature DQN在DQN的基础上,采用两个结构一样的网络,一个当前Q网络用来选择动作,更新模型参数,另一个目标Q网络用于计算目标Q值。这样可以减少目标Q值和当前的Q值相关性。2048游戏环境简介2048环境来源于GitHub开源项目,继承于gym基本环境类。玩家可以上下左右移动方块,如果方块数字相同,则合并且所带数字变成两者之和。当值为2048的方块出现时,则获得胜利。结束标志只要出现非法移动,即移动的方向的数字无法合并,则该局结束。相比较于传统的可试验多次更加严格,难度提高。奖励函数奖励值为当前方块和累加最大合成数字最大能合成4096注意事项本案例运行环境为 Pytorch-1.0.0,支持 GPU和CPU 运行,请查看《ModelAtrs JupyterLab 硬件规格使用指南》了解切换硬件规格的方法;如果您是第一次使用 JupyterLab,请查看《ModelAtrs JupyterLab使用指导》了解使用方法;如果您在使用 JupyterLab 过程中碰到报错,请参考《ModelAtrs JupyterLab常见问题解决办法》尝试解决问题。实验步骤1. 程序初始化第1步:安装基础依赖!pip install gym第2步:导入相关的库import sysimport timeimport loggingimport argparseimport itertoolsfrom six import StringIOfrom random import sample, randintimport gymfrom gym import spacesfrom gym.utils import seedingimport numpy as npimport torchimport torch.nn as nnfrom PIL import Image, ImageDraw, ImageFontfrom IPython import displayimport matplotlibimport matplotlib.pyplot as plt2. 训练参数初始化¶本案例设置的 epochs = 3000,可以达到较好的训练效果,GPU下训练耗时约10分钟。CPU下训练较慢,建议调小 epochs 的值,如50,以便快速跑通代码。parser = argparse.ArgumentParser()parser.add_argument("--learning_rate", type=float, default=0.001) # 学习率parser.add_argument("--gamma", type=float, default=0.99) # 经验折扣率parser.add_argument("--epochs", type=int, default=50) # 迭代多少局数parser.add_argument("--buffer_size", type=int, default=10000) # replaybuffer大小parser.add_argument("--batch_size", type=int, default=128) # batchsize大小parser.add_argument("--pre_train_model", type=str, default=None) # 是否加载预训练模型parser.add_argument("--use_nature_dqn", type=bool, default=True) # 是否采用nature dqnparser.add_argument("--target_update_freq", type=int, default=250) # 如果采用nature dqn,target模型更新频率parser.add_argument("--epsilon", type=float, default=0.9) # 探索epsilon取值args, _ = parser.parse_known_args()3. 创建环境2048游戏环境继承于gym.Env,主要几个部分:init函数 定义动作空间、状态空间和游戏基本设置step函数 与环境交互,获取动作并执行,返回状态、奖励、是否结束和补充信息reset函数 一局结束后,重置环境render函数 绘图,可视化环境def pairwise(iterable): "s -> (s0,s1), (s1,s2), (s2, s3), ..." a, b = itertools.tee(iterable) next(b, None) return zip(a, b)class IllegalMove(Exception): passdef stack(flat, layers=16): """Convert an [4, 4] representation into [4, 4, layers] with one layers for each value.""" # representation is what each layer represents representation = 2 ** (np.arange(layers, dtype=int) + 1) # layered is the flat board repeated layers times layered = np.repeat(flat[:, :, np.newaxis], layers, axis=-1) # Now set the values in the board to 1 or zero depending whether they match representation. # Representation is broadcast across a number of axes layered = np.where(layered == representation, 1, 0) return layeredclass Game2048Env(gym.Env): metadata = {'render.modes': ['ansi', 'human', 'rgb_array']} def __init__(self): # Definitions for game. Board must be square. self.size = 4 self.w = self.size self.h = self.size self.squares = self.size * self.size # Maintain own idea of game score, separate from rewards self.score = 0 # Members for gym implementation self.action_space = spaces.Discrete(4) # Suppose that the maximum tile is as if you have powers of 2 across the board. layers = self.squares self.observation_space = spaces.Box(0, 1, (self.w, self.h, layers), dtype=np.int) self.set_illegal_move_reward(-100) self.set_max_tile(None) # Size of square for rendering self.grid_size = 70 # Initialise seed self.seed() # Reset ready for a game self.reset() def seed(self, seed=None): self.np_random, seed = seeding.np_random(seed) return [seed] def set_illegal_move_reward(self, reward): """Define the reward/penalty for performing an illegal move. Also need to update the reward range for this.""" # Guess that the maximum reward is also 2**squares though you'll probably never get that. # (assume that illegal move reward is the lowest value that can be returned self.illegal_move_reward = reward self.reward_range = (self.illegal_move_reward, float(2 ** self.squares)) def set_max_tile(self, max_tile): """Define the maximum tile that will end the game (e.g. 2048). None means no limit. This does not affect the state returned.""" assert max_tile is None or isinstance(max_tile, int) self.max_tile = max_tile # Implement gym interface def step(self, action): """Perform one step of the game. This involves moving and adding a new tile.""" logging.debug("Action {}".format(action)) score = 0 done = None info = { 'illegal_move': False, } try: score = float(self.move(action)) self.score += score assert score <= 2 ** (self.w * self.h) self.add_tile() done = self.isend() reward = float(score) except IllegalMove: logging.debug("Illegal move") info['illegal_move'] = True done = True reward = self.illegal_move_reward # print("Am I done? {}".format(done)) info['highest'] = self.highest() # Return observation (board state), reward, done and info dict return stack(self.Matrix), reward, done, info def reset(self): self.Matrix = np.zeros((self.h, self.w), np.int) self.score = 0 logging.debug("Adding tiles") self.add_tile() self.add_tile() return stack(self.Matrix) def render(self, mode='human'): if mode == 'rgb_array': black = (0, 0, 0) grey = (200, 200, 200) white = (255, 255, 255) tile_colour_map = { 2: (255, 255, 255), 4: (255, 248, 220), 8: (255, 222, 173), 16: (244, 164, 96), 32: (205, 92, 92), 64: (240, 255, 255), 128: (240, 255, 240), 256: (193, 255, 193), 512: (154, 255, 154), 1024: (84, 139, 84), 2048: (139, 69, 19), 4096: (178, 34, 34), } grid_size = self.grid_size # Render with Pillow pil_board = Image.new("RGB", (grid_size * 4, grid_size * 4)) draw = ImageDraw.Draw(pil_board) draw.rectangle([0, 0, 4 * grid_size, 4 * grid_size], grey) fnt = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 30) for y in range(4): for x in range(4): o = self.get(y, x) if o: draw.rectangle([x * grid_size, y * grid_size, (x + 1) * grid_size, (y + 1) * grid_size], tile_colour_map[o]) (text_x_size, text_y_size) = draw.textsize(str(o), font=fnt) draw.text((x * grid_size + (grid_size - text_x_size) // 2, y * grid_size + (grid_size - text_y_size) // 2), str(o), font=fnt, fill=black) assert text_x_size < grid_size assert text_y_size < grid_size return np.asarray(pil_board) outfile = StringIO() if mode == 'ansi' else sys.stdout s = 'Score: {}\n'.format(self.score) s += 'Highest: {}\n'.format(self.highest()) npa = np.array(self.Matrix) grid = npa.reshape((self.size, self.size)) s += "{}\n".format(grid) outfile.write(s) return outfile # Implement 2048 game def add_tile(self): """Add a tile, probably a 2 but maybe a 4""" possible_tiles = np.array([2, 4]) tile_probabilities = np.array([0.9, 0.1]) val = self.np_random.choice(possible_tiles, 1, p=tile_probabilities)[0] empties = self.empties() assert empties.shape[0] empty_idx = self.np_random.choice(empties.shape[0]) empty = empties[empty_idx] logging.debug("Adding %s at %s", val, (empty[0], empty[1])) self.set(empty[0], empty[1], val) def get(self, x, y): """Return the value of one square.""" return self.Matrix[x, y] def set(self, x, y, val): """Set the value of one square.""" self.Matrix[x, y] = val def empties(self): """Return a 2d numpy array with the location of empty squares.""" return np.argwhere(self.Matrix == 0) def highest(self): """Report the highest tile on the board.""" return np.max(self.Matrix) def move(self, direction, trial=False): """Perform one move of the game. Shift things to one side then, combine. directions 0, 1, 2, 3 are up, right, down, left. Returns the score that [would have] got.""" if not trial: if direction == 0: logging.debug("Up") elif direction == 1: logging.debug("Right") elif direction == 2: logging.debug("Down") elif direction == 3: logging.debug("Left") changed = False move_score = 0 dir_div_two = int(direction / 2) dir_mod_two = int(direction % 2) shift_direction = dir_mod_two ^ dir_div_two # 0 for towards up left, 1 for towards bottom right # Construct a range for extracting row/column into a list rx = list(range(self.w)) ry = list(range(self.h)) if dir_mod_two == 0: # Up or down, split into columns for y in range(self.h): old = [self.get(x, y) for x in rx] (new, ms) = self.shift(old, shift_direction) move_score += ms if old != new: changed = True if not trial: for x in rx: self.set(x, y, new[x]) else: # Left or right, split into rows for x in range(self.w): old = [self.get(x, y) for y in ry] (new, ms) = self.shift(old, shift_direction) move_score += ms if old != new: changed = True if not trial: for y in ry: self.set(x, y, new[y]) if changed != True: raise IllegalMove return move_score def combine(self, shifted_row): """Combine same tiles when moving to one side. This function always shifts towards the left. Also count the score of combined tiles.""" move_score = 0 combined_row = [0] * self.size skip = False output_index = 0 for p in pairwise(shifted_row): if skip: skip = False continue combined_row[output_index] = p[0] if p[0] == p[1]: combined_row[output_index] += p[1] move_score += p[0] + p[1] # Skip the next thing in the list. skip = True output_index += 1 if shifted_row and not skip: combined_row[output_index] = shifted_row[-1] return (combined_row, move_score) def shift(self, row, direction): """Shift one row left (direction == 0) or right (direction == 1), combining if required.""" length = len(row) assert length == self.size assert direction == 0 or direction == 1 # Shift all non-zero digits up shifted_row = [i for i in row if i != 0] # Reverse list to handle shifting to the right if direction: shifted_row.reverse() (combined_row, move_score) = self.combine(shifted_row) # Reverse list to handle shifting to the right if direction: combined_row.reverse() assert len(combined_row) == self.size return (combined_row, move_score) def isend(self): """Has the game ended. Game ends if there is a tile equal to the limit or there are no legal moves. If there are empty spaces then there must be legal moves.""" if self.max_tile is not None and self.highest() == self.max_tile: return True for direction in range(4): try: self.move(direction, trial=True) # Not the end if we can do any move return False except IllegalMove: pass return True def get_board(self): """Retrieve the whole board, useful for testing.""" return self.Matrix def set_board(self, new_board): """Retrieve the whole board, useful for testing.""" self.Matrix = new_board4. 定义DQN算法DQN算法分了两部分构造,拟合函数部分-神经网络算法逻辑本身Replay Buffer部分神经网络结构包含三层卷积网络和一层全连接网络,输出维度为动作空间维度。 神经网络部分可自由设计,以训练出更好的效果。class Net(nn.Module): #obs是状态空间输入,available_actions_count为动作输出维度 def __init__(self, obs, available_actions_count): super(Net, self).__init__() self.conv1 = nn.Conv2d(obs, 128, kernel_size=2, stride=1) self.conv2 = nn.Conv2d(128, 64, kernel_size=2, stride=1) self.conv3 = nn.Conv2d(64, 16, kernel_size=2, stride=1) self.fc1 = nn.Linear(16, available_actions_count) self.relu = nn.ReLU(inplace=True) def forward(self, x): x = x.permute(0, 3, 1, 2) x = self.relu(self.conv1(x)) x = self.relu(self.conv2(x)) x = self.relu(self.conv3(x)) x = self.fc1(x.view(x.shape[0], -1)) return xDQN核心逻辑部分class DQN: def __init__(self, args, obs_dim, action_dim): # 是否加载预训练模型 if args.pre_train_model: print("Loading model from: ", args.pre_train_model) self.behaviour_model = torch.load(args.pre_train_model).to(device) # 如果采用Nature DQN,则需要额外定义target_network self.target_model = torch.load(args.pre_train_model).to(device) else: self.behaviour_model = Net(obs_dim, action_dim).to(device) self.target_model = Net(obs_dim, action_dim).to(device) self.optimizer = torch.optim.Adam(self.behaviour_model.parameters(), args.learning_rate) self.criterion = nn.MSELoss() # 动作维度 self.action_dim = action_dim # 统计学习步数 self.learn_step_counter = 0 self.args = args def learn(self, buffer): # 当replaybuffer中存储的数据大于batchsize时,从中随机采样一个batch的数据学习 if buffer.size >= self.args.batch_size: # 更新target_model的参数 if self.learn_step_counter % args.target_update_freq == 0: self.target_model.load_state_dict(self.behaviour_model.state_dict()) self.learn_step_counter += 1 # 从replaybuffer中随机采样一个五元组(当前观测值,动作,下一个观测值,是否一局结束,奖励值) s1, a, s2, done, r = buffer.get_sample(self.args.batch_size) s1 = torch.FloatTensor(s1).to(device) s2 = torch.FloatTensor(s2).to(device) r = torch.FloatTensor(r).to(device) a = torch.LongTensor(a).to(device) if args.use_nature_dqn: q = self.target_model(s2).detach() else: q = self.behaviour_model(s2) # 每个动作的q值=r+gamma*(1-0或1)*q_max target_q = r + torch.FloatTensor(args.gamma * (1 - done)).to(device) * q.max(1)[0] target_q = target_q.view(args.batch_size, 1) eval_q = self.behaviour_model(s1).gather(1, torch.reshape(a, shape=(a.size()[0], -1))) # 计算损失函数 loss = self.criterion(eval_q, target_q) self.optimizer.zero_grad() loss.backward() self.optimizer.step() def get_action(self, state, explore=True): # 判断是否探索,如果探索,则采用贪婪探索策略决定行为 if explore: if np.random.uniform() >= args.epsilon: action = randint(0, self.action_dim - 1) else: # Choose the best action according to the network. q = self.behaviour_model(torch.FloatTensor(state).to(device)) m, index = torch.max(q, 1) action = index.data.cpu().numpy()[0] else: q = self.behaviour_model(torch.FloatTensor(state).to(device)) m, index = torch.max(q, 1) action = index.data.cpu().numpy()[0] return actionreplay buffer数据存储部分class ReplayBuffer: def __init__(self, buffer_size, obs_space): self.s1 = np.zeros(obs_space, dtype=np.float32) self.s2 = np.zeros(obs_space, dtype=np.float32) self.a = np.zeros(buffer_size, dtype=np.int32) self.r = np.zeros(buffer_size, dtype=np.float32) self.done = np.zeros(buffer_size, dtype=np.float32) # replaybuffer大小 self.buffer_size = buffer_size self.size = 0 self.pos = 0 # 不断将数据存储入buffer def add_transition(self, s1, action, s2, done, reward): self.s1[self.pos] = s1 self.a[self.pos] = action if not done: self.s2[self.pos] = s2 self.done[self.pos] = done self.r[self.pos] = reward self.pos = (self.pos + 1) % self.buffer_size self.size = min(self.size + 1, self.buffer_size) # 随机采样一个batchsize def get_sample(self, sample_size): i = sample(range(0, self.size), sample_size) return self.s1[i], self.a[i], self.s2[i], self.done[i], self.r[i]5. 训练模型初始化环境和算法# 初始化环境env = Game2048Env()device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 初始化dqndqn = DQN(args, obs_dim=env.observation_space.shape[2], action_dim=env.action_space.n)# 初始化replay buffermemory = ReplayBuffer(buffer_size=args.buffer_size, obs_space=(args.buffer_size, env.observation_space.shape[0], env.observation_space.shape[1], env.observation_space.shape[2]))开始训练print('\ntraining...')begin_t = time.time()max_reward = 0for i_episode in range(args.epochs): # 每局开始,重置环境 s = env.reset() # 累计奖励值 ep_r = 0 while True: # 计算动作 a = dqn.get_action(np.expand_dims(s, axis=0)) # 执行动作 s_, r, done, info = env.step(a) # 存储信息 memory.add_transition(s, a, s_, done, r) ep_r += r # 学习优化过程 dqn.learn(memory) if done: print('Ep: ', i_episode, '| Ep_r: ', round(ep_r, 2)) if ep_r > max_reward: max_reward = ep_r print("current_max_reward {}".format(max_reward)) # 保存模型 torch.save(dqn.behaviour_model, "2048.pt") break s = s_print("finish! time cost is {}s".format(time.time() - begin_t))6. 使用模型推理游戏¶#加载模型model = torch.load("2048.pt").to(device)model.eval()s = env.reset()img = plt.imshow(env.render(mode='rgb_array'))while True: plt.axis("off") img.set_data(env.render(mode='rgb_array')) display.display(plt.gcf()) display.clear_output(wait=True) s = torch.FloatTensor(np.expand_dims(s, axis=0)).to(device) a = torch.argmax(model(s), dim=1).cpu().numpy()[0] # take action s_, r, done, info = env.step(a) time.sleep(0.1) if done: break s = s_env.close()plt.close()7. 作业请你调整步骤2中的训练参数,重新训练一个模型,使它在游戏中获得更好的表现。
  • [热门活动] 体验文字生成图片Stable Diffusion
    Stable Diffusion文字生成图像Stable Diffusion 是由 CompVis、Stability AI 和 LAION 共同开发的一个文本转图像模型,它通过 LAION-5B 子集大量的 512x512 图文模型进行训练,我们只要简单的输入一段文本,Stable Diffusion 就可以迅速将其转换为图像,同样我们也可以置入图片或视频,配合文本对其进行处理。这个活动简单又好玩Ta-Da!机会来啦!AI Gallery 正式上线了 AI 作画中最火的模型 “Stable Diffusion”,通过 ModelArts Notebook能力,即可实现【一键 AI 作画】,自动生成作品海报,人人都是大艺术家!https://developer.huaweicloud.com/develop/aigallery/notebook/detail?id=03aab198-dc21-4974-ab33-352e9f56939c&ticket=ST-193587-MgJGfa1fxl6GFZ77F7vFjRod-sso切换GPU免费规格Prompt框架:[图片的风格]+[内容主题]+[细节描述]+[绘画风格或者艺术家风格]图片的风格按照这个框架,简单构造一个图片风格,比如:可以是一幅美丽的画,或者是一幅美丽的山水画。内容的主体+详细描述主体可以是各种各样的选择。推荐一些可以激发大家灵感的事物,如山水,人物,建筑房屋,动物等等,尽可能细致刻画这些实体事物。如果是简单的输入“大海”两个字,模型不知道我们想要的风景是什么样子的,一段作品的相对准确的描述,比如:梦幻的大海,白沙滩岸边铺满了粉色的玫瑰花,月光轻柔的人洒在海面上,绿色发光的海浪,我们要去尽量用详细的语言,用细节清楚的描述我们幻想的场景。比如:云中的Skyrim风格的山,有一个照明螺栓击中尖端导致雪崩,山区风景。
  • [活动分享] 【HCSD】ModelBox实战营邀请活动,呼朋唤友学AIoT
    ModelBox实战营邀请活动,呼朋唤友学AIoTModelBox是高性能、高扩展、易用的端云协同AI应用开发框架,帮助开发者快速完成AI应用开发和部署到端边云设备上,30分钟完成AI应用开发,同时可以增加推理的数据吞吐量,降低AI分析耗时!(感兴趣的朋友可以点击链接参与:ModelBox实战营邀请活动,呼朋唤友学AIoT)以人体关键点检测案例为例,使用原生的ONNXRuntime API做开发,可以达到36fps;而ModelBox版本(推理框架同样是ONNXRuntime),则达到了79fps,大大提升了分析速率,详细的分析过程可参考ModelBox推理真的高效吗一文。今年华为云正式推出ModelBox框架,现诚邀华为云新老用户进行注册体验,凡是完成设备注册的华为云用户,凭注册截图可以领取代金券一份。完成体验的小伙伴,还可领取小礼品一份。若您邀请其他人完成体验后,可以额外获得礼品。【体验流程】环境要求:Win10/11电脑,每台电脑仅能注册一次。设备注册:点击操作指南进行注册: <--操作指南-->完成要求:提供注册成功截图(如下图,需包含状态、创建时间)体感小游戏体验:点击案例链接进行体验:<--案例链接-->完成要求:提供体验截图(如下图,需包含程序运行截图和华为云账号)
  • [热门活动] 【活动指南】DevRun低代码AI应用开发实战营,赢华为手机!
    欢迎参加,【DevRun】低代码AI应用开发实战营。下面请跟随小编的步伐,开始实战营之旅吧!首先,扫码进群,交流学习。(一定要进群,悄悄告诉你,有华为专家驻场,同时在群内会获得活动最新消息哦)​【活动流程】【活动环节】步骤一 · 报名和领取资源>>>立即报名报名成功,即可抽取华为定制精美礼品和超低价格购买超划算的华为云资源套餐包(仅报名用户可以够买,需要私聊微信群内小助手哦)抽取规则:活动结束后,会将报名名单导入第三方抽奖平台进行抽取,每20人抽取1份,封顶300份。奖品规则:华为定制帽子/数据线/扑克牌(三选一随机发货)点击下方链接,领取相应资源,免费体验,初步了解平台基础。>>点击开通AppCube免费版>>体验ModelArts步骤二 · 课程学习与提升本环节包含2个模块。①学习课程+课后测试,以选择题为主,通过将得到对应的官方证书。>>点击学习《【DevRun】低代码AI应用开发实战营》②直播课程(敬请期待)>>点击报名参加直播赢好礼步骤三 · 低代码AI开发体验按照操作指导,自由选择任一主题进行体验。完成完整体验后,即可享华为定制精美礼品和开发者认证券(价值500元)先到先得(限量50名)。(获得开发者认证券后,一定要私聊微信群内小助手哦)奖品规则:华为定制帽子/数据线/扑克牌(封顶50份,先到先得,三选一随机发货)>>点击查看操作指导及获奖规则步骤四 · 自主设计开发基于Gallery库中模型自由筛选,并通过AppCube完成完整应用开发。按要求将作品上传后。2022年12月15日0点前完成自主设计开发,前10名获得华为无线耳机。第11-50名获得华为移动电源。2022年12月15日0点后完成自主设计开发,获得华为定制精美礼品,限量50份。>>查看开发步骤及活动规则【开发者有奖活动】活动一 · 分享邀请点击报名后,点击“分享有礼”会生成你的相关链接等,分享给你的朋友。邀请说明:本环节设有邀请体验奖、邀请奖、邀请排名奖,完成即可有机会获得华为手机、无线蓝牙耳机、华为手环、华为手表、华为平板等超多奖品等着你!(加油喔!)因政策原因,本活动提前结束至2022年12月8日0点。>>查看活动详情>>第二期邀请活动开始啦,点击查看详情活动二 · 学习小组学习小组招募中,组团成功可获得京东卡等激励!组团截止时间:2022年12月8日0点前>>>查看学习小组招募详情活动三 · 心得体验输出输出你的体验心得、体会以及建议都可以,形式不限。发布到华为云博客,即可参与评选,获得精美礼品。>>点击发布华为云博客规则:发布文章时,需在标题前加:【我的低代码AI体验】活动四 · 开发者认证通过奖通过认证后,请私聊微信群内小助手登记,先到先得。奖品规则:2022年12月8日0点前通过获得:华为手环 7 标准版,限量18份。2022年12月8日0点后通过获得:华为定制精美礼品,限量20份。【活动整体奖项设置】​【活动礼品部分展示】仅做参考,实际奖品会根据库存有所调整,以等价值礼品替代【活动整体规则】本规则为【DevRun低代码AI应用开发实战营】整体规则,如用户参与其中的有奖子活动,需同时满足此规则和子活动要求的规则请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效);为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等影响活动公平性的行为,黑产用户不计入活动统计),利用资源从事违法违规行为的用户收回奖励资格,本次活动一个实名认证账号只能对应一个收件人(只能参加一次),如同一账号填写多个不同收件人,不予发放奖励,且每个账号只记录最早的一次回帖,多发无效。排名奖项若有并列,按照完成时间先后顺序排列;报名奖和应用开发体验奖统计时间截止到2022年12月15日。活动结束后7个工作日内会进行获奖名单公示,公示期为7天,如有疑问,请在此期间进行联系沟通,公示结束后不接受异议 。公示期间同时收集获奖人员收件等相关信息,逾期未完成信息填写,视为放弃获奖权益 。活动组织方有权提前结束活动,但需提前7个工作日进行公示。本活动规则由华为云在法律规定范围内进行解释。华为云保留不时更新、修改或删除本活动规则的权利。上述更新、修改或删除于公布时即时生效,用户应当主动查阅本活动规则的最新内容;所有参加本活动的用户,均视为认可并同意遵守《华为云用户协议》,包括以援引方式纳入《华为云用户协议》的《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(华为ModelArts服务声明、华为AppCube服务声明、SLA等),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。
  • [常见问题汇总帖] modelarts om initialize failure
    按照这个官方例子来做,做到最后部署报错。cid:link_0错误截图如下:详细日志参见附件。obs里生成的model目录如下:
  • [分享交流] ModelArts小试牛刀【玩转华为云】
    owla210月24日左右的时候,偶然看到了【向云而生•1024程序员节】技术市集活动合集,然后看到了ModelArts Workflow产品体验官活动,之前简单了解过,没有真正用过,所以想利用这个机会实践一下。任务一:ModelArts全局配置完成任务二:登录AI Gallery的Workflow案例库,选择并订阅一个Workflow,并进行运行,直至所有节点运行成功完成任务三:创建Notebook实例完成任务四:开发第一条Workflow,并分享至AI Gallery准备完成……结果遇到未知的问题只好发贴询问:等了几天没有人回复,只好加了官方小助手询问。小助手很热心,拉了个加群,问了两次后华为技术大佬晚上9点多直接加我微信沟通^^经过大佬确认,原来是例子的代码被动过~~应该是这样:而不是:所以后面经过重新发布:未完,待续……
  • [互动交流] git clone开启云上AI开发直播活动的问题
    我在直播体验过程中创建的测试训练任务扣费过多,已经购买了体验资源包仍然超出过多,可否退回呢?我的测试、体验都已经预先购买了10元的资源包,体验任务、体验数据集也和直播的教程完全相同,但是多使用的计算资源仍然很多,超出的价格超过了直播资源包的五倍还多,可不可以谅解一下呢
  • [其他] AI实践体验合集
    1.【DevRun AI应用开发】ModelBox实战营2022年09月05日 ~ 2022年11月08日地址:cid:link_5【活动背景】ModelBox是一套专门为AI开发者提供的易于使用,高效,高扩展的AI应用开发框架,它可以帮助AI开发者快速完成从模型文件到AI推理应用的开发和上线工作,降低AI算法落地门槛,同时带来AI应用的高稳定性和极致性能。ModelBox具备以下三大特点:屏蔽底层软硬件差异,一次开发,端边云多处部署智能调度,保证极致AI推理运行性能全场景灵活开发模式,可视化图编排和API开发2.华为云ModelArts关键AI能力宣讲会ModelArts 是面向开发者的一站式 AI 平台,为机器学习与深度学习提供海量数据预处理及交互式智能标注、大规模分布式训练、自动化模型生成,及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期 AI 工作流。活动地址:cid:link_43.ModelBox课程学习学ModelBox,玩转AIoT应用开发4.华为云-全国青年人工智能社会实践华为云-全国青年社会实践是由华为云EI针对广大青年发起的具有公益属性的线上社会实践活动,目前活动已成功举办两届。第三届华为云-全国青年社会实践活动,将基于“培养青年对科技的兴趣,提高青年科技创新能力” 为核心目的,进一步优化了活动内容;本次活动中将”免费包邮“为参与的青年派发纸质版实践证明,同时,为了更好的弘扬中国传统诗词文化,本次实践内容将把AI智能与传统诗词进行结合,从而让青年朋友感受到AI智能下传统诗词的魅力。5.华为云AI开发者活动,优秀案例火热征集中(有奖励)大家可以发布案例到AI Gallery,案例可以结合Github上面热门项目,也可以在AI Gallery原有案例的基础上升级改进,原创优先,欢迎大家投稿,一经采用,零一老师会根据案例的原创度、趣味性、实用性等维度评选,给出相应的奖励。6.Workflow产品体验官活动进行中在ModelArts平台上完成Workflow流程的4个任务,并按照要求成功反馈信息。即可获得不同奖励① 将在所有完成任务的用户中抽取 10 位开发者送出 无线鼠标1个② 在活动结束后将评选N名优秀开发者,奖励体脂秤1台。③ 华为云体验官开发者,完成任务可获得3分体验积分。点击报名华为云体验官活动时间:2022年10月10日-2022年11月30日欢迎大家前往AI Gallery体验实践,一起交流学习,感受AI的魅力!
  • [热门活动] 中文声音分类
    【中文声音分类】利用AI处理方法,从你的声音中识别出你的年龄。案例链接:cid:link_0参与步骤:1、开发者按照案例链接的提示完成体验;2、替换声音文件后,运行代码识别出人物的实际年龄;3、截图运行后的效果图(如下图所示),并发布到本帖评论区。
  • [其他] 1024活动大家冲冲冲啊
    一年一度的 1024 程序员节来啦!今年华为云 AI 社区为大家准备了多个优质案例供大家学习体验学习,同时也准备了精美的奖品给到认真学习的小伙伴!优质案例地址:让设计师“爱恨交织”的 AI 绘画:点此体验AI 美妆顾问:点此体验AI 体感游戏:点此体验AI 识别真假发票:点此体验魔幻黑科技,AI 换天造物!点击体验从零开始实现线性回归:点此体验VS Code 一键连接 Notebook:点此体验COCO 目前检测任务:点此体验Ascend 与 PyCharm 联合开发:点此体验
  • [其他] 解决模型发布失败问题
    出现此问题,一般是因为后台服务故障导致的,建议稍等片刻,然后重新创建训练作业。如果重试超过3次仍无法解决,请获取如下信息,并联系华为云技术支持协助解决故障。获取模型ID。进入“模型管理>模型”页面,在模型列表中找到自动学习任务中自动创建的模型,自动学习产生的模型都是以“exeML-”开头的。单击模型名称进入模型详情页面,在“基本信息”区域,获取“ID”的值。图1 获取模型ID获取模型事件信息。进入模型详情页面后,单击“事件”页签,将事件信息表截图后反馈给技术支持人员。图2 获取事件信息
  • [其他] 在JupyterLab中使用Git插件
    在JupyterLab中使用Git插件可以克隆GitHub开源代码仓库,快速查看及编辑内容,并提交修改后的内容。前提条件Notebook处于运行中状态。打开JupyterLab的git插件在Notebook列表中,选择一个实例,单击右侧的打开进入“JupyterLab”页面。所示图标,为JupyterLab的Git插件。图1 Git插件克隆GitHub的开源代码仓库图2 使用git插件克隆GitHub的开源代码仓库注:单击如下按钮也可以克隆GitHub的开源代码仓库。查看代码库信息在Name下方列表中,选中您希望使用的文件夹,双击打开,然后单击左侧git插件图标进入此文件夹对应的代码库。图3 打开文件夹后打开git插件即可看到当前代码库的信息,如仓库名称、分支、历史提交记录等。图4 查看代码库信息说明:Git插件一般默认克隆master分支,如果要切换分支可单击Current Branch展开所有分支,单击相应分支名称可完成切换。查看修改的内容如果修改代码库中的某个文件,在“Changes”页签的“Changed”下可以看到修改的文件,并单击修改文件名称右侧的“Diff this file”,可以看到修改的内容。图5 查看修改的内容提交修改的内容确认修改无误后,单击修改文件名称右侧的“Stage this change”,文件将进入Staged状态,相当于执行了git add命令。在左下方输入本次提交的Message,单击“Commit”,相当于执行了git commit命令。图6 提交修改内容此时,可以在“History”页签下看到本地提交已成功。图7 查看是否提交成功单击“push”按钮,相当于执行git push命令,即可提交代码到GitHub仓库中。提交成功后会提示“Successfully completed ”。若OAuth鉴权的token过期,则此时再push会弹框让输入用户的token或者帐户信息,按照提示输入即可。图8 提交代码至GitHub仓库完成上述操作后,可以在JupyterLab的git插件页面的History页签,看到“origin/HEAD”和“orgin/master”已指向最新一次的提交。同时在GitHub对应仓库的commit记录中也可以查找到对应的信息。
  • [热门活动] 1024 程序员节,参与 AI 实践赢取华为手机等好礼!
    Hi,各位 AI 小伙伴:一年一度的 1024 程序员节来啦!今年华为云 AI 社区为大家准备了多个优质案例供大家学习体验学习,同时也准备了精美的奖品给到认真学习的小伙伴!活动公示:本次公示期截止至2022年12月11日0点,如开发者对结果存在疑问可联系微信小助手:huaweiyunei2 进行沟通解决,公示期结束后不接受异议。邀请奖需要在公示期内填写收件信息,逾期未填视为放弃,体验奖及体验抽奖已事先收集,无需再次填写。本次活动中的各奖项对应公示结果如下:1. 体验送数据线/书籍结果:共收集问卷57份,有效问卷48份,有效的名单如下hw***52204li***9136m_***nehw***467273la***rt-97hw***08997ni***200hw***8613670410055_02hw***8613912569057_02hi***qfl9fwt7qfhejphi***gsxnev_rtvx1x8hz***zws***91320411hw***883213fa***n_ztwli***n6408hw***8615871053474_01ca***aoweihi***_w9dg_leuhuf8ohi***7tnl6yig1f-5kdhw***44389ka***620hi***1ecehdca1xgthjzm***41042su***ng1324mh***amqw***kqhw***qns694_3or1bk9hhi***6d2mupinga6gzshw***c7gbgw8wvl56bxshw***8613268981331_01hw***55899co***nimalsha***ayrighthw***28460Ak***inhw***13082xi***anhw***26922su***aobeiJa***0de***wanglefe***eier6CY***keli***uofengFI***reverad***445cs***zeke2. 体验抽奖结果公示:如上,有效体验48人,根据规则抽出4人获奖,抽奖使用开源工具:https://vitozyf.github.io/lucky-draw/index.html# 进行抽取,最终结果如下:hw***467273hw***08997hi***gsxnev_rtvx1x8zm***410423. 邀请好友体验结果公示:共有4人参与此次邀请,结果如下:账号邀请数最终有效邀请奖品级别hw0****072350不符合规则3hw5****5564929邀请奖20名hw7****137530不符合规则3hw8****6865454排名奖第1名,邀请奖30名请以上4位开发者填写收件信息进行发奖:《邀请体验获奖登记》优质案例地址:让设计师“爱恨交织”的 AI 绘画:点此体验AI 美妆顾问:点此体验AI 体感游戏:点此体验AI 识别真假发票:点此体验魔幻黑科技,AI 换天造物!点击体验从零开始实现线性回归:点此体验VS Code 一键连接 Notebook:点此体验COCO 目前检测任务:点此体验Ascend 与 PyCharm 联合开发:点此体验学习有奖活动规则① 体验即送 AI 开发书籍/数据线体验运行上方任一案例,即可获得 AI 开发学习书籍一本/数据线(随机发货)!限量 500 份,先到先得!完成后请在此填写收货地址:点击填写② 体验即可参与体脂秤/华为手环抽奖体验运行上方任一案例,即可获得抽奖资格,每满10个人抽一个体脂秤/华为音响/华为手环,最多 200 份,先到先得!抽奖形式:活动结束后,将参与数据导入第三方开源抽奖平台进行抽奖,抽奖过程全程透明公开。抽奖结束后将在此贴公布结果&收集收货信息。③ 邀请好友体验赢华为手机邀请好友体验运行上方任一案例,即可有奖:邀请8名:华为10000毫安移动电源/华为手环4邀请15名:罗技G603无线鼠标邀请20名:华为AX3 Pro路由器+200元京东卡邀请30名:华为AX3 Pro路由器+500元京东卡邀请满 50人以上即可参与邀请排名奖:第1名:华为 HUAWEI 畅享10 Plus 手机 +500元京东卡第2名:华为 GT2 手表 +500元京东卡第3名:华为蓝牙耳机 FreeBuds 3 + 500元京东卡邀请方式:请在此帖(点击访问)下方评论回复:已邀请好友参与。然后让被邀请的好友在您的评论下追加回复:已参与。请参考此楼层的示例:点击查看仅统计回复了你的评论的好友,不评论无法纳入统计,请知悉。邀请奖可以和邀请排名奖可以叠加,但邀请奖只可领取一次,不可叠加!如邀请了50人,领取了50人档位的奖励后,不可再领取30人档位的奖励,但仍可参与排名奖的奖励。体验有奖、抽奖、邀请奖可叠加获取。活动规则被邀请的好友仅限10月20日后注册的新用户,否则视为无效;单一账号不可被重复邀请,如A邀请了B,C又邀请了B,此时A和C中以最早邀请的为有效邀请;参与邀请活动的账号均需要提前完成任一 AI 案例体验,否则视为无效参与,不予发奖;邀请体验奖的每个梯度奖品均限量10份,先到先得,以邀请用户评论时间为判断标准。排名奖人数并列时,以最先达到的为获奖者;活动截止时间:2022年11月30日,活动公示时间:2022年12月5日-11日,发奖时间:2022年12月12日逐步放发请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效);为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等影响活动公平性的行为,黑产用户不计入活动统计),利用资源从事违法违规行为的用户收回奖励资格,本次活动一个实名认证账号只能对应一个收件人(只能参加一次),如同一账号填写多个不同收件人,不予发放奖励,且每个账号只记录最早的一次回帖,多发无效。排名奖项若有并列,按照完成时间先后顺序排列;本活动规则由华为云在法律规定范围内进行解释。华为云保留不时更新、修改或删除本活动规则的权利。上述更新、修改或删除于公布时即时生效,用户应当主动查阅本活动规则的最新内容;所有参加本活动的用户,均视为认可并同意遵守《华为云用户协议》,包括以援引方式纳入《华为云用户协议》的《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(华为ModelArts服务声明、SLA等),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。
总条数:3403 到第
上滑加载中