• [技术干货] 【开发者空间实践指导】基于TensorFlow的手写体识别
    一、实验介绍随着人工智能技术的飞速发展,图像识别技术在众多领域得到了广泛应用。手写体识别作为图像识别的一个重要分支,其在教育、金融、医疗等领域具有广泛的应用前景。本实验旨在利用深度学习框架TensorFlow,结合MNIST手写体数据集,构建一个高效、准确的手写体识别系统,本实验是在云主机中安装PyCharm,并且基于TensorFlow框架的手写体识别的案例。本实验采用的MNIST数据库(Modified National Institute of Standards and Technology  database)是一个大型数据库 的手写数字是通常用于训练 各种图像处理 系统。该数据库还广泛用于机器学习 领域的培训和测试。MNIST数据集共有训练数据60000项、测试数据10000项。每张图像的大小为28*28(像素),每张图像都为灰度图像,位深度为8(灰度图像是0-255)。二、 免费领取云主机如您还没有云主机,可点击链接,根据领取指南进行操作。如您已领取云主机,可直接开始实验。三、实验流程说明:① 下载并安装PyCharm;② 创建Python文件,部署TensorFlow;③ 编写代码,实现手写体识别;④ 运行代码,生成结果。四、实验资源云资源消耗/时时长开发者空间-云主机免费40分钟合计:0元五、实验步骤1、安装PyCharm1.1 下载PyCharm进入云主机,打开左侧Firefox浏览器,搜索https://www.jetbrains.com.cn/en-us/pycharm/download/download-thanks.html?platform=linux 点击下载PyCharm。下载好后是一个压缩文件,选择将文件压缩到此处。解压后目录内容显示如下。1.2 安装PyCharm双击进入bin目录,双击PyCharm图标打开PyCharm。在PyCharm的左下角单击图标打开终端。进入到终端后输入命令进入到bin目录下。cd 下载cd pycharm-2024.2.1cd bin输入命令执行脚本。sh ./pycharm.sh执行完命令后会自动弹出窗口,选择“开始30天免费试用”。2、下载TensorFlow框架2.1 新建目录打开PyCharm,单击左上角图标在弹出的菜单中选择“新建>目录”。目录名称输入:demo。2.2 新建文件在PyCharm左侧新建的demo目录单击鼠标右键,在打开的菜单中选择“新建>Python文件”。输入Python文件的名字,自定义即可。2.3 部署TensorFlow框架新建好后,在左侧找到新建好的Python文件双击打开。单击左下角图标打开终端。在终端输入命令,部署TensorFlow框架。pip3 install tensorflow3、编写代码3.1 创建和编写文件在demo目录下新建一个py文件进行代码编辑。import tensorflow as tffrom tensorflow.keras import layers, models, callbacksimport matplotlib.pyplot as pltimport numpy as np# 下载MNIST数据集mnist = tf.keras.datasets.mnist(x_train, y_train), (x_test, y_test) = mnist.load_data()# 归一化数据x_train, x_test = x_train / 255.0, x_test / 255.0# 拓展维度x_train = x_train[..., tf.newaxis].astype("float32")x_test = x_test[..., tf.newaxis].astype("float32")# 数据增强data_augmentation = tf.keras.Sequential([ layers.RandomRotation(0.1), layers.RandomZoom(0.1), layers.RandomTranslation(0.1, 0.1)])# 创建数据集对象,并设置每个批次的大小train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32)test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)# 构建模型model = models.Sequential([ data_augmentation, layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activation='relu'), layers.MaxPooling2D((2, 2)), layers.Conv2D(128, (3, 3), activation='relu'), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dropout(0.5), layers.Dense(128, activation='relu'), layers.Dense(10)])# 编译模型model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])# 回调模型reduce_lr = callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=0.0001)early_stopping = callbacks.EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)model_checkpoint = callbacks.ModelCheckpoint('best_model.keras', monitor='val_loss', save_best_only=True)# 训练模型history = model.fit(train_ds, epochs=10, validation_data=test_ds, callbacks=[reduce_lr, early_stopping, model_checkpoint])# 加载模型最佳权重model.load_weights('best_model.keras')# 评估模型test_loss, test_acc = model.evaluate(test_ds, verbose=2)print('\nTest accuracy:', test_acc)# 绘制实验的损失及准确率plt.figure(figsize=(12, 4))plt.subplot(1, 2, 1)plt.plot(history.history['loss'], label='Training Loss')plt.plot(history.history['val_loss'], label='Validation Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.legend(loc='upper right')plt.subplot(1, 2, 2)plt.plot(history.history['accuracy'], label='Training Accuracy')plt.plot(history.history['val_accuracy'], label='Validation Accuracy')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.legend(loc='lower right')plt.show()# 预测并绘制一些预测样本def plot_image(i, predictions_array, true_label, img): true_label, img = true_label[i], img[i].reshape((28, 28)) plt.grid(False) plt.xticks([]) plt.yticks([]) plt.imshow(img, cmap=plt.cm.binary) predicted_label = np.argmax(predictions_array) if predicted_label == true_label: color = 'blue' else: color = 'red' plt.xlabel("{} {:2.0f}% ({})".format(true_label, 100*np.max(predictions_array), predicted_label), color=color)# 预测测试样本集predictions = model.predict(test_ds)# 绘制前五个测试样本num_rows = 5num_cols = 3num_images = num_rows*num_colsplt.figure(figsize=(2*2*num_cols, 2*num_rows))for i in range(num_images): plt.subplot(num_rows, 2*num_cols, 2*i+1) plot_image(i, predictions[i], y_test, x_test)plt.tight_layout()plt.show()当代码编写完毕后,需要下载相应的Python包,在终端输入命令:pip3 install matplotlib 指令下载。3.2 代码部分讲解1)导入数据包;首先对于导包部分导入TensorFlow、matplotlib、numpy等库,用于进行深度学习模型的构建数据可视化。2)下载MNIST数据集;这段代码加载了MNIST数据集,这是一个包含手写体数字0到9的图片数据集,常用于图像识别的入门任务。数据集分为训练集和测试集。3)数据预处理;这里对图像数据进行了归一化处理,将像素值从0-255的范围缩放到0-1。这样做可以加快模型的训练速度并提高其性能。之后,通过增加一个维度,将数据形状调整为模型所需的格式(样本数量,高度,宽度,通道数),并将数据类型转换为float32.4)创建数据集对象;将训练和测试数据转换为TensorFlow的数据集对象,并设置批次大小为32。并对训练数据进行混洗。5)构建模型;构建一个顺序模型,包括数据增强层、三个卷积层(每个卷积层后跟一个池化层)、一个展平层、一个丢弃层以及两个全连接层。6)编译模型;配置模型的学习过程,选择Adam优化器、稀疏分类交叉熵损失函数,并设置评估指标为准确率。7)回调模型;定义三个回调函数,用于在学习工程中调整学习率、早停以及在验证损失改善时保存模型权重。8)训练模型;使用训练数据集训练模型,指定训练轮数为10,使用测试数据集进行验证,并应用之前定义的回调函数。9)加载模型最佳权重;在训练完成后,加载具有最佳验证的损失的模型权重。10)评估模型;在测试数据集上评估模型的性能,并打印准确率。11)可视化训练过程;使用matplotlib绘制训练和验证损失及准确率的变化曲线。12)预测并展示结果。定义plot_image函数:用于绘制单个预测结果,显示图像、真是标签、预测概率和预测标签;预测测试样本:使用model.predict对测试数据集进行预测;绘制预测结果:选择前几个测试样本,调用plot_image函数绘制预测结果。4、运行结果生成代码编写完毕后右击鼠标,点击运行。运行后会出现手写体识别的结果,上方图片是手写的字体,图片下方是模型预测的结果。运行结果中有loss损失函数,以及acc准确率,可以看到loss损失函数在慢慢的降低,而acc准确率在慢慢的升高。acc准确率提高的原因是因为训练轮数的不断增加,交叉熵损失衡量了模型预测与真实标签之间的差异。在训练过程中,优化器的目标是使损失函数最小化。随着训练轮数的增加,损失函数的值逐渐降低,这意味着模型的预测越来越接近真实标签,从而提高准确率。可以看到每一个epoch中每一秒的准确率以及损失率的变换。Loss损失率和acc准确率折线图,能供清楚的看到,loss损失率随着eopch的不断增加而减少,acc准确率则随着epoch的不断增加而不断提高。至此,实验完毕。想了解更多手写体识别的内容可以访问:https://yann.lecun.com/exdb/mnist/想了解更多关于TensorFlow框架的可以访问:关于TensorFlow | TensorFlow中 文官网
  • [热门活动] 【有奖互动】体验开发者空间趣味画图应用开发实践,晒出你的最美动漫头像,赢取神秘大礼哦!
    开发者空间体验重磅开启:华为面向广大开发者群体,打造的全球开发者专属空间,工具资源预置,成为开发者云上的“家”。本次PaaS联合开发者空间提供了最新的画图应用开发部署场景化体验案例,一起来探索吧!【参与形式】Step1:报名开发者空间活动:>活动报名入口<Step2:>免费领取云主机<Step3:有奖打卡:体验活动页开发者空间任意实践任务,将所画的图/ /生成的动漫头像(二选一即可),分享到此帖子的评论区,并对开发者空间或相关产品以及体验案例等提出自己的优化建议,或分享体验心得,筛选优质打卡内容,送出华为云云宝手办-单个盲盒(限5名)礼品参考展示:注意事项:1、请务必使用个人账号参与活动(IAM、企业账号等账号参与无效)2、活动获奖名单预计活动结束后10个工作日内完成公示,15个工作日内完成奖品发放,每个账号限领一次奖品,发放时间根据实际情况动态调整,如有延期敬请见谅;3、活动奖品如无库存,将以同价位其他奖品替换;4、本次活动参与用户需真实有效,如有虚假、黑产等行为,一律通报、剔除活动参与资格。
  • [活动公告] 【开发者空间】填调研问卷抽盲盒,更有有机会领取200元开发者礼包
    华为开发者空间用户使用体验调研活动开启啦!!!欢迎来提交你内心对开发者空间最真实的感受,填写问卷将获得一次抽奖机会,我们会在有效问卷中选择10名用户进行电话回访,受邀回访的用户可额外获得价值200元开发者定制礼包,名额有限,快叫上小伙伴一起来参加吧~【礼品激励】填写问卷:抽取云宝手办盲盒1个受邀访谈:本期计划访谈10位开发者,每人可获得价值200元开发者定制好礼(华为手环/开发者定制卫衣/防风服等随机发货)【调研时间】24年11月22日-27日【访谈时间】在调研问卷结束后一周内发起访谈【活动说明】礼品将于访谈结束后15天内一起发出
  • [热门活动] 【有奖征集】华为开发者空间一行代码快速上云,参与视频、文章投稿赢最高2000元开发者礼包
    华为开发者空间是华为云为全球开发者打造的专属开发空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等各项根技术的开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。在这里,开发者可以依照指引,轻松申领并激活专属的云主机工作桌面。每台主机都预装了直观的可视化操作系统,并集成了CodeArts IDE工具以及Java、Python等流行编程语言的运行时插件,解决本地开发环境中配置复杂、稳定性不足和依赖等问题,为开发者提供性能强大、安全、稳定、高效的开发环境。每月可享有15小时的云主机使用时长,5GB的个人存储空间和每月3小时的场景化沙箱资源。云主机内预置box,方便快捷触达社区学堂等技术知识交流学习阵地,让开发者拥有开箱即用的可延续工作空间,这片个人专属的天地,将成为项目开发的舞台,学习总结的笔记簿,以及个人智慧的宝库。为了方便各位开发者体验开发者空间,特举办《华为开发者空间一行代码快速上云》有奖征文及实践视频征集活动,免费领取一台云主机、一套开发工具及个人存储空间,马上开启您的专属开发空间!【如您在体验中发现任何体验不友好、产品Bug、文档页面错漏等情况,欢迎通过云声平台反馈给我们,还有机会领取云声专属礼品!】点击了解活动详情
  • [技术干货] 【开发者空间实践指导】基于鲲鹏服务器的打砖块小游戏部署
    一、 案例介绍鲲鹏服务器是基于鲲鹏处理器的新一代数据中心服务器,适用于大数据、分布式存储、高性能计算和数据库等应用。鲲鹏服务器具有高性能、低功耗、灵活的扩展能力,适合大数据分析、软件定义存储、Web等应用场景。本案例将指导开发者如何在鲲鹏服务器部署并运行web小游戏。二、免费领取云主机如您还没有云主机,可点击链接 ,领取专属云主机后进行操作。如您已领取云主机,可直接开始实验。三、实验流程说明:1、在案例中心下载项目;2、使用终端连接鲲鹏服务器;3、创建html文件;4、启动Web服务器;5、体验游戏。四、实验资源本次实验预计花费总计0元。资源名称规格单价(元)时长(h)云主机2vCPUs | 4GB RAM免费1五、自动部署鲲鹏服务器在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口。执行自动部署命令如下:hcd deploy --password 远端服务器密码 --time 1800# --password 待部署项目所在ECS的root用户密码(至少8个字符)# --time value 待部署资源的保留期(单位为秒,至少600秒,默认600秒)。当前实验预估需要20分钟,可以配置time为半小时保留期。该命令会自动部署鲲鹏服务器。首次部署会直接执行,旧资源未到期时重复部署,会提示是否删除前面创建的资源,可以删除旧资源再次部署。记录部署远端服务器公网IP,如截图中对应的就是:113.44.86.210。六、拷贝代码新打开一个命令窗口,在命令窗口中输入命令登录远端服务器,命令如下:ssh root@远端服务器公网IP输入密码(密码不会显示)。登录成功后创建文件夹用于存放html文件,命令如下:mkdir game cd game vi game.html进入到Vim编辑器,按下键盘的“i”键进入到插入模式下,复制下列代码粘贴到编辑器中。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Arkanoid game</title> <style> body { display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #f0f0f0; } canvas { border: 5px solid #3498db; border-radius: 10px; } /* game start cues */ .game-start-text { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 24px; color: green; background-color: rgba(255, 255, 255, 0.8); padding: 10px; border-radius: 5px; } /* score display style */ .score-display { position: absolute; top: 20px; left: 50%; transform: translateX(-50%); font-size: 18px; color: #333; font-weight: bold; background-color: rgba(255, 255, 255, 0.7); padding: 5px 10px; border-radius: 5px; } </style> </head> <body> <canvas id="gameCanvas" width="800" height="600"></canvas> <div class="score-display" id="scoreDisplay">score:0</div> <div id="gameStartText" class="game-start-text">start</div> <audio id="hitBrickSound" preload="auto"> <source src="hitBrick.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <audio id="hitPaddleSound" preload="auto"> <source src="hitPaddle.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <audio id="gameOverSound" preload="auto"> <source src="gameOver.mp3" type="audio/mpeg"> Your browser does not support the audio element. </audio> <script> const canvas = document.getElementById('gameCanvas'); const ctx = canvas.getContext('2d'); const ballRadius = 10; let x = canvas.width / 2; let y = canvas.height - 30; let dx = 3; let dy = -3; const paddleHeight = 10; const paddleWidth = 100; let paddleX = (canvas.width - paddleWidth) / 2; const brickRowCount = 10; const brickColumnCount = 15; const brickWidth = 48; const brickHeight = 20; const bricks = []; let score = 0; let gameStarted = false; for (let c = 0; c < brickColumnCount; c++) { bricks[c] = []; for (let r = 0; r < brickRowCount; r++) { bricks[c][r] = { x: 0, y: 0, status: 1 }; } } document.addEventListener('mousemove', mouseMoveHandler, false); document.addEventListener('click', startGame, false); function mouseMoveHandler(e) { if (gameStarted) { const relativeX = e.clientX - canvas.offsetLeft; if (relativeX > 0 && relativeX < canvas.width) { paddleX = relativeX - paddleWidth / 2; } } } function startGame() { if (!gameStarted) { gameStarted = true; document.getElementById('gameStartText').style.display = 'none'; draw(); } } function drawBall() { ctx.beginPath(); ctx.arc(x, y, ballRadius, 0, Math.PI * 2); ctx.fillStyle = '#0095DD'; ctx.fill(); ctx.closePath(); } function drawPaddle() { ctx.beginPath(); ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight); ctx.fillStyle = '#0095DD'; ctx.fill(); ctx.closePath(); } function drawBricks() { for (let c = 0; c < brickColumnCount; c++) { for (let r = 0; r < brickRowCount; r++) { if (bricks[c][r].status === 1) { const brickX = c * (brickWidth + 2) + 20; const brickY = r * (brickHeight + 2) + 20; bricks[c][r].x = brickX; bricks[c][r].y = brickY; ctx.beginPath(); ctx.rect(brickX, brickY, brickWidth, brickHeight); ctx.fillStyle = '#0095DD'; ctx.fill(); ctx.closePath(); } } } } function collisionDetection() { for (let c = 0; c < brickColumnCount; c++) { for (let r = 0; r < brickRowCount; r++) { const b = bricks[c][r]; if (b.status === 1) { if (x > b.x && x < b.x + brickWidth && y > b.y && y < b.y + brickHeight) { dy = -dy; b.status = 0; score++; document.getElementById('scoreDisplay').textContent = 'score:' + score; const hitBrickSound = document.getElementById('hitBrickSound'); hitBrickSound.play(); } } } } } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); if (gameStarted) { drawBricks(); drawBall(); drawPaddle(); collisionDetection(); x += dx; y += dy; if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) { dx = -dx; } if (y + dy < ballRadius) { dy = -dy; } else if (y + dy > canvas.height - ballRadius) { if (x > paddleX && x < paddleX + paddleWidth) { dy = -dy; const hitPaddleSound = document.getElementById('hitPaddleSound'); hitPaddleSound.play(); } else { const gameOverSound = document.getElementById('gameOverSound'); gameOverSound.play(); document.location.reload(); } } } requestAnimationFrame(draw); } draw(); </script> </body> </html>按下ESC按钮退出编辑模式,输入“:wq”,退出并保存game.html文件。实验代码也可以到案例中心 下载该文档项目,其中包含实验手册和代码。七、安装软件包安装Python3,命令如下:sudo yum install -y python3 安装成功后检查Python3版本确认是否安装成功。python3 --version八、浏览器访问在当前存放代码的路径下,使用Python3启动一个简单的Web服务器,命令如下:python3 -m http.server如下图所示,代表当前Web服务器已经启动。打开火狐浏览器,在地址栏输入“弹性云服务器IP:8000/game.html”即可体验游戏。至此实验全部完成。
  • [热门活动] 华为开发者空间应用构建活动:送你一台云主机,参与应用开发实践体验及设计,赢华为GT 5 PRO手表、无线耳机、冲锋衣、云宝等好礼!
    华为开发者空间,是为全球开发者打造的专属开发者空间,预置昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源。在华为开发者空间,每位开发者都可以免费领取一台云主机,每年享有数百小时的云主机使用权,配备5GB的云上存储空间,开发者可以进行关键资产保存和中转。为帮助开发者更好的掌握华为根生态技术,本次活动提供最新的场景化案例体验,一起开启实践探索吧!【活动时间】即日起—12月15日【评审及获奖名单公布】12月16日-12月25日【活动方式】(以下活动均可参与,奖励可叠加)活动一、二需在云主机中完成,还未领取云主机的开发者,点击链接领取,已领取的开发者可以直接开始实践。活动一:体验开发者空间案例或完成应用部署,赢价值50元开发者定制礼包在云主机中,完成以下任一实践体验或在云主机中完成应用部署,将体验截图上传至华为开发者空间-应用构建版块。活动结束后在参与名单中抽取获奖用户。(中奖小Tips:提交多个实验完成截图,可以增加中奖概率,同一实验完成截图提交多次仅计为1次)实践指导:(点击实验名称可直接查看) 1、一站式体验代码云上托管、构建、检查与修复2、基于云主机快速为Web项目添加AI助手3、基于Repo和流水线门禁的分支合并与部署4、基于FunctionGraph实现Gif动图制作应用开发5、鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移6、掌握Redis部署,轻松实现电商平台秒杀抢购!实验截图上传步骤:点击查看活动二:完成应用开发设计,赢华为GT 5PRO、无线耳机等礼品活动期间,在云主机中完成应用开发设计,并将您的应用开发步骤、截图上传至华为开发者空间-应用构建版块。提交完成后,将由华为开发者空间技术专家根据应用开发的完整度、难易程度进行评分。应用开发设计方向:围绕华为技术栈进行创新和实用性的应用设计,如:结合华为云的AI服务、FunctionGraph,CodeArts、设计智能客服机器人等。应用开发文档上传步骤:点击查看活动三:评论区互动,赢价值50元开发者定制礼包活动期间,将您在实践过程中的疑问、体验感受及建议发布在活动贴评论区,我们将抽取积极互动奖。活动四:投稿实践文章、视频,赢2000元定制开发者礼包即日起—12月18日,参与有奖征集文章、视频活动,将有机会赢取2000元定制开发者礼包,点击查看活动详情。【活动礼品】【奖项设置】活动规则抽奖方式:活动结束后,我们将从参与活动的用户中(华为云新老用户均可参与),通过巨公平台或Excel 函数形式抽取获奖用户。活动三的回帖仅限于对“华为开发者空间”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况。活动说明用户限制说明:1、参加本次社区活动的用户必须为华为云注册用户。同时为保证活动公平性,禁止用户以IAM账号身份参与活动,否则将视为无效。2、领取奖品的用户需为华为云实名用户,未完成实名认证的用户将不发放活动奖励。3、本次活动如一个实名认证对应多个账号,只有一个账号可领取奖励。如在同一概率活动中,同一账号重复获奖,只发放首先获奖奖品。4、本次活动一个实名认证账号只能对应一个收件人,如同一账号填写多个不同收件人,不予发放奖励。5、请开发者不要在活动期间随意修改社区昵称和华为云账号,由此产生的统计问题,如过了申诉期,小助手不再处理。(申诉期为活动结果公示3天内。)奖品发放说明:1、获奖开发者用户需在截止时间在获奖信息收集表中填写获奖信息,活动结束且开发者用户填写完整领奖信息后15个工作日内,将统一发出奖品,所有实物奖品包邮,不额外收取任何费用。华为云遵守《中华人民共和国个人信息保护法》规定,将以上个人信息仅用于礼品发放之目的,不会向任何第三方披露,所有信息将在华为云问卷系统留存2个月,礼品发放完毕后即删除。若由于获奖开发者用户自身原因(包括但不限于提供的联系方式有误、身份不符或者通知领奖后超过30天未领取等)造成奖品无法发送的,视为获奖开发者用户放弃领奖。2、为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等破坏活动公平性的行为),利用资源从事违法违规行为的开发者用户收回抽奖及奖励资格。3、若发放奖品时,出现库存不足,则优先发放等价值的其他奖品。4、所有参加本活动的开发者用户,均视为认可并同意遵守《华为云开发者用户协议》,包括以援引方式纳入《华为云开发者用户协议》、《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(SLA),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。5、如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。
  • [技术干货] 应用构建提交步骤
    1、申请构建登录个人华为账号,进入开发者空间应用构建申请界面,点击“立即申请”。2、提交构建参考下方信息填写构建信息,并提交构建申请。应用名称:填写活动推荐的实践之一或自己构建的应用名称;应用简介:体验开发者空间案例:填写“应用构建活动---’实践名称‘ “;应用开发设计:填写“应用介绍、使用的产品/插件、开发步骤 ”。完成实践后,截图提供应用运行结果、应用页面结果截图;根据实践实操,配置应用开发语言、开发框架、和涉及云服务。填写完内容后,点击提交构建。
  • [活动公告] 【云咖问答】第17期 与华为开发者空间技术专家深度对话,探索应用开发的无限可能,回帖赢开发者定制礼品!
    华为开发者空间,是为全球开发者打造的专属开发者空间,预置昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等各项华为根技术的开发工具资源。在华为开发者空间,每位开发者都可以免费领取一台云主机,每年享有数百小时的云主机使用权,配备5GB的云上存储空间,并提供配套的案例指导,帮助开发者从开发编码到应用调测,基于华为根技术生态高效便捷的学习和体验应用开发。欢迎各位开发者,免费领取一台云主机,开启云上应用开发之旅,领取链接。场景化案例体验,请进入案例中心查看。本期我们邀请了华为云开发者生态DTSE技术专家 孙老师坐阵,和大家一起探讨关于“华为开发者空间”的话题。【本期云咖】【问题参考】(包括不限于)1、华为开发者空间云主机CodeArts IDE支持扩展插件吗?可以安装CodeArts Snap插件吗?2、在华为开发者空间中可以使用哪些工具实现云原生应用及AI原生应用的全生命周期管理?3、华为开发者空间支持哪些操作系统?支持欧拉吗? 4、华为开发者空间支持哪些开发工具?支持Python、PHP、JS吗?对于华为开发者空间,你有哪些疑问呢?【活动时间】2024年11月8日-11月27日【参与方式】直接在此活动帖下方回帖提问即可。【获奖规则】参与云咖问答的提问我们会整理在问答专题中,你的提问将会帮助更多的开发者~欢迎大家踊跃提问,积极互动~【活动规则】1、开发者用户发布的提问,必须与本期产品相关,其他产品求助帖不参与此次活动,将视为无效内容,否则取消该用户获奖资格。(其他产品求助可发帖到相应的版块进行提问);2、本次活动不限用户的总提问数及连续提问数,但需保证提问质量,如华为云社区小编认定参与用户有恶意灌水嫌疑,则取消该用户获奖资格;3、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定; 4、每期活动预计于结束后10天内完成奖项公示,并于结束后30个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
  • [热门活动] 【华为开发者空间11.11超值钜惠来袭】专业会员仅需9.9元/月
    各位开发者小伙伴们~让人期待的11.11来啦~为了感谢大家对华为开发者空间一直以来的支持我们也是诚意满满的策划了本次活动~双十一期间只要9.9元 即可订阅1个月的专业版会员!畅享更加流畅,高效,快捷的专业版体验~没错,你真的没看错哦~9.9元!9.9元!9.9元!重要的事情说三遍!别犹豫了赶紧点击下方链接进行订阅吧~点击>>立即订阅
  • [技术干货] 【开发者空间实践指导】远程登录鲲鹏沙箱环境
    一、实践介绍本文档为您介绍如何使用华为开发空间提供的远程登录功能登录到您的鲲鹏沙箱环境上。二、约束与限制远程登录时,系统不支持直接的复制粘贴操作。鲲鹏资源创建完成后,有效使用时间为1900秒,时间结束后系统会自动释放相关资源。因此请您规划好沙箱实验内容。鲲鹏资源环境在释放后,只要您的开发资源使用时间仍有余额,可随时重新创建。三、前提条件您已完成鲲鹏沙箱环境的创建。四、登录方法1、点击远程登录。2、在浏览器展开的抽屉页面查看登录鲲鹏沙箱环境所使用的命令行工具。3、鲲鹏沙箱环境创建后,首次远程登录时,您可以通过使用右上角的【Input Commands】按钮,输入并发送一个回车键完成激活。4、如需切换界面语言,可通过点击页面上的 【English】按钮来切换。5、在看到命令行提示"login"后输入当前鲲鹏沙箱环境的账号和密码。6、点击鲲鹏沙箱环境选项卡中的登录信息来查看当前鲲鹏沙箱环境的账号和密码。​​​7、点击查看密码,同时使用账号和密码旁边的按钮来完成复制。8、通过使用右上角的【Input Commands】按钮,粘贴并发送您的账号和密码,发送后可以按回车键确认。​9、当看到如下图所示的"#"提示符时,表示已经完成了鲲鹏沙箱环境的认证操作。在您的鲲鹏沙箱被释放前,远程登录将不再需要重复认证。
  • [交流吐槽] 云主机(基础版)咨询
    创建的云主机,设置的是java工具集。但是【华为“云上先锋”实践赛·开发者空间赛道(Serverless赛题)】又是基于python的项目。根据云主机使用说明:云主机首次配置后CPU架构、规格、操作系统、系统镜像和工具选择安装后不可以再修改。那么我的Serverless实验项目,第三步里面跑不了了。求版主指引方向!
  • [热门活动] 华为云HCDG开发者城市行1024程序员节活动——智上云端 AI赋能创新未来在上海杉达学院嘉善校区成功举办
    2024年10月25日,华为云开发者社区组织HCDG在上海杉达学院嘉善校区举办了1024程序员节特别活动,以“智上云端,AI赋能创新未来”为主题,旨在将AI与云计算技术深入校园,帮助学生接触最前沿的技术应用和创新实践。此次活动不仅聚焦于鸿蒙系统与云、AI的深度结合,更将重点放在云主机实际操作和体验上,吸引了大量学生积极参与。探索鸿蒙与云技术,开创AI赋能未来活动以全新发布的HarmonyOS NEXT(5.0)操作系统为切入点,带领学生走进AI大模型时代下的鸿蒙智能应用场景,详细介绍了鸿蒙系统在智能化、互联互通方面的应用潜力和华为云技术的强大支持。通过讲解和互动环节,学生们对鸿蒙的开放生态和未来发展路径有了更清晰的认知,进一步激发了他们对自主创新和AI应用的兴趣。云主机申请与实践项目——从理论到实操活动的核心部分集中在云主机申请和项目实践环节。学生们在老师的指导下完成了云主机申请,首次亲身体验了云计算的基础操作。随后,学生们使用申请的云主机资源,结合华为云提供的FunctionGraph功能,开展了一个云空间实践项目。这个项目通过API Gateway作为前端入口,结合FunctionGraph实现了自动化的GIF头像制作功能,使学生们对如何利用云资源进行功能开发和应用部署有了直观理解。定制专属GIF头像,创意与技术的碰撞为了增加趣味性和互动感,活动还设计了“定制专属GIF头像”体验环节,学生们可以上传自己的短视频或图片,通过FunctionGraph处理生成个性化GIF头像。这一环节不仅让学生更深入地了解了API Gateway和FunctionGraph的实际应用流程,更锻炼了他们的动手能力,激发了创作热情。学生们纷纷参与,现场气氛热烈,通过互动中加深了对云服务应用场景的理解。学生积极参与,收获实战经验整个活动过程中,学生们参与热情高涨,积极互动,提出了许多关于云主机操作、API调用、项目部署等技术问题。通过此次活动,他们不仅学会了如何申请和使用云主机,也了解了云计算在个人项目中的应用潜力。活动中的云空间实践项目和GIF头像设计,更帮助他们在趣味操作中掌握了FunctionGraph的实际应用方法,积累了宝贵的实战经验。展望未来:AI赋能下的智能时代人才培养华为云1024程序员节活动的成功举办,为学生们搭建了一个接触和体验AI与云计算技术的桥梁。通过真实的云端应用场景和项目实践,学生们不仅在专业知识上得到了提升,也为今后在智能时代的职业发展奠定了扎实的技术基础。华为云将前沿科技引入校园,培养更多具备创新能力和实际操作能力的新时代人才。
  • [活动公告] 【开发者日南京站】产品体验官:在开发者空间基于FunctionGraph实现Gif动图制作应用开发
    华为云开发者日·南京站来啦!参加“基于FunctionGraph实现Gif动图制作应用开发”体验项目提出你的建议或使用体验有机会获得开发者盲盒礼包惊喜不容错过,快叫上小伙伴一起来参加吧~【体验项目】基于FunctionGraph实现Gif动图制作应用开发【活动时间】2024年10月25日-10月31日【参与方式】直接在此活动帖下方回帖提建议/提建议即可比如对产品功能的改进建议、对活动流程的感想、对现场活动的感悟等等PS:不要少于30字哦~【获奖规则】奖项设置有效回复楼层评选条件获奖名额激励礼品优质建议奖20对产品功能有改进价值的建议1名开发者盲盒礼品价值50-100元积极反馈奖20优质建议奖轮空的情况下进行抽取每满20层抽取1名开发者盲盒礼品价值50元【活动规则】1、本帖的回帖建议不少于30字,仅限于对“基于FunctionGraph实现Gif动图制作应用开发”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。2、本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况;以上奖品均为实物奖品,具体发放视出库情况而定;3、活动预计于结束后七天内完成奖项公示,并于结束后15个工作日内完成邮寄。【温馨提示】1、请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)。如一个实名认证对应多个账号,只有一个账号可领取奖励,若同一账号填写多个不同收件人或不同账号填写同一收件人,均不予发放奖励。2、所有获得奖品的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。
  • [热门活动] 【华为开发者空间】1024技术体验专场:免费领取云主机,T恤衫、云宝多重好礼等您拿!(活动已结束,奖品已邮寄)
    奖品已经寄出了哦,各位中奖的开发者注意查收顺丰快递~活动中奖名单公布如下,公示期7天(11月11日-11月17日)请中奖用户填写收货信息到此处【收货信息收集表】公示期结束后邮寄奖品如有问题请与开发者空间论坛版主【云起龙骧】联系感谢大家的关注,欢迎持续在开发者空间创新成长~(抽奖池名单请见文末附件)领取云主机中奖名单-奖品:定制渔夫帽序号华为云账号/昵称1yiyi****92hid__84****lfsm4np83w189****80004pi****ng5tan****gyuan6hz_g****0_hf7hw_0086****1315812_018hid_szj****g3pmlkyg9hid_6xc-****jtcp72110hid_****_inlsqtsrk311cc***c12how****undt13zd***7714huwei-gao****87494815scar****sic16hw02****72717hw0****734618k***_du19hw61****3920n****ot应用实践中奖名单-奖品:云宝手办盲盒序号华为云账号/昵称1enkilee2Ezio3Richard2174yd_454908205jfly_1236yd_2580988087yd_2872747818福州司马懿9iolink100210hw0****782811mia****23112hw0****360713hid****2z8--wh2_svo14hw5****21215hid****ahde8cjaznsw积极互动奖中奖名单-奖品:开发者定制鼠标垫序号华为云账号/昵称1yd_454908202Ezio用户建议有礼中奖名单-奖品:开发者定制Polo衫序号华为云账号/昵称1enkilee在数字时代,每一位程序员都是幕后的英雄,用代码编织梦想,用智慧点亮未来。1024,这个在二进制世界中代表着“2的10次方”的数字,象征着程序员们无限的创造力和对技术的热爱。在这个特别的日子里,我们向所有程序员致敬。在专属你们的节日里,华为开发者空间为您准备了专属礼品,等您查收。【活动时间】即日起—10月31日【活动方式】(以下活动均可参与,奖励可叠加)活动一:领取免费云主机,参与华为云开发者定制礼品抽奖活动期间,点击链接,领取您的专属云主机,活动结束后将在领取名单中抽奖。活动二:体验开发者空间案例,赢华为云开发者定制好礼在云主机中,完成以下任一实践体验,将实验完成截图发送在本活动贴评论区或上传至华为开发者空间-应用构建版块。活动结束后在参与名单中抽奖。实践指导:(点击下方链接进入)基于FunctionGraph实现Gif动图制作应用开发 链接鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移 链接掌握Redis部署,轻松实现电商平台秒杀抢购! 链接搭建可自动伸缩的Discuz!论坛网站 链接基于PyTorch的手写体识别 链接实验截图上传步骤:1、申请构建登录个人华为账号,进入开发者空间应用构建申请界面,点击“立即申请”。2、提交构建参考下方信息填写构建信息,并提交构建申请。应用名称:填写本次活动中推荐的五个实践之一;应用简介:填写“1024技术体验专场---’践名称‘ “;完成实践后,截图提供应用运行结果、应用页面结果截图;根据实践实操,配置应用开发语言、开发框架、和涉及云服务。填写完内容后,点击提交构建。​活动三:用户建议有礼反馈在活动期间,将您的使用建议、产品体验提升建议发布在云声建议,活动结束后在参与名单中抽奖。【互动福利】在活动期间,将您领取云主机截图、实验截图、用户建议等发布在活动贴评论区,我们将抽取积极互动奖。奖项设置有效回复楼层数需达到评选条件获奖名额积极互动奖10参与互动的全部开发者2203305408【活动奖品】礼品华为云云宝盲盒定制polo衫开发者定制渔夫帽定制雨伞定制鼠标垫数量1010101010【活动规则】抽奖方式:活动结束后,我们将从参与活动的用户中(华为云新老用户均可参与),通过巨公平台或Excel 函数形式抽取获奖用户。获奖名单将在活动结束后的5个工作日内公布。活动三的回帖建议不少于30字,仅限于对“华为开发者空间”体验项目,其他项目建议不参与此次活动,否则将视为无效内容。本次活动将根据实际参与情况发放奖励,包括但不限于用户百分之百中奖或奖项轮空的情况。【活动说明】用户限制说明:1、参加本次社区活动的用户必须为华为云注册用户。同时为保证活动公平性,禁止用户以IAM账号身份参与活动,否则将视为无效。2、领取奖品的用户需为华为云实名用户,未完成实名认证的用户将不发放活动奖励。3、本次活动如一个实名认证对应多个账号,只有一个账号可领取奖励。如在同一概率活动中,同一账号重复获奖,只发放首先获奖奖品。4、本次活动一个实名认证账号只能对应一个收件人,如同一账号填写多个不同收件人,不予发放奖励。5、请开发者不要在活动期间随意修改社区昵称和华为云账号,由此产生的统计问题,如过了申诉期,小助手不再处理。(申诉期为活动结果公示3天内。)奖品发放说明:1、获奖开发者用户需在截止时间在获奖信息收集表中填写获奖信息,活动结束且开发者用户填写完整领奖信息后15个工作日内,将统一发出奖品,所有实物奖品包邮,不额外收取任何费用。华为云遵守《中华人民共和国个人信息保护法》规定,将以上个人信息仅用于礼品发放之目的,不会向任何第三方披露,所有信息将在华为云问卷系统留存2个月,礼品发放完毕后即删除。若由于获奖开发者用户自身原因(包括但不限于提供的联系方式有误、身份不符或者通知领奖后超过30天未领取等)造成奖品无法发送的,视为获奖开发者用户放弃领奖。2、为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等破坏活动公平性的行为),利用资源从事违法违规行为的开发者用户收回抽奖及奖励资格。3、若发放奖品时,出现库存不足,则优先发放等价值的其他奖品。4、所有参加本活动的开发者用户,均视为认可并同意遵守《华为云开发者用户协议》,包括以援引方式纳入《华为云开发者用户协议》、《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(SLA),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。5、如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。
  • [技术干货] 【开发者空间实践指导】基于PyTorch的手写体识别
    一、 案例介绍随着人工智能技术的飞速发展,图像识别技术在众多领域得到了广泛应用。手写体识别作为图像识别的一个重要分支,其在教育、金融、医疗等领域具有广泛的应用前景。本实验旨在利用深度学习框架PyTorch,结合MNIST手写体数据集,构建一个高效、准确的手写体识别系统,本实验是在云主机中安装PyCharm,并且基于PyTorch框架的手写体识别的案例。本实验采用的MNIST数据库(Modified National Institute of Standards and Technology database)是一个大型数据库的手写数字是通常用于训练各种图像处理系统。该数据库还广泛用于机器学习领域的培训和测试。MNIST数据集共有训练数据60000项、测试数据10000项。每张图像的大小为28*28(像素),每张图像都为灰度图像,位深度为8(灰度图像是0-255)。二、 免费领取云主机如您还没有云主机,可点击链接,根据领取指南进行操作。如您已领取云主机,可直接开始实验。三、 实验流程说明:① 下载并安装PyCharm;② 创建Python文件,部署PyTorch;③ 下载测试数据集、训练数据集和验证数据集; ④ 编写代码,实现手写体识别;⑤ 运行代码,生成结果。四、 实验步骤4.1 安装PyCharm1.下载PyCharm进入云主机,打开左侧Firefox浏览器,搜索https://www.jetbrains.com.cn/en-us/pycharm/download/download-thanks.html?platform=linux点击下载PyCharm。下载好后是一个压缩文件,选择将文件压缩到此处。解压后目录内容显示如下。2.安装PyCharm双击进入bin目录,双击PyCharm图标打开PyCharm。在PyCharm的左下角单击图标打开终端。进入到终端后输入命令进入到bin目录下。cd 下载cd pycharm-2024.2.1cd bin输入命令执行脚本。sh ./pycharm.sh执行完命令后会自动弹出窗口,选择“开始30天免费试用”。4.2 下载PyTorch框架1.新建目录打开PyCharm,单击左上角图标在弹出的菜单中选择“新建>目录”。目录名称输入:demo。2.新建文件在PyCharm左侧新建的demo目录单击鼠标右键,在打开的菜单中选择“新建>Python文件”。输入Python文件的名字,自定义即可。3.部署Python框架新建好后,在左侧找到新建好的Python文件双击打开。单击左下角图标打开终端。在终端输入命令,部署Python框架。pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu4.3 数据集介绍1.创建目录在同一项目目录下创建文件夹data,在data目录下创建mnist目录。2.数据集详细介绍1)测试集图片,包含10000张图。t10k-images.idx3-ubyte2)标签集,包含10000张测试集图片所对应的标签。t10k-labels.idx1-ubyte3)训练集和验证集,包含55000张训练集和5000张验证集图片。train-images.idx3-ubyte4)标签集,包含训练集图片所对应的标签。train-labels.idx1-ubyte4.4 编写代码1.创建和编写文件在demo目录下新建一个py文件进行代码编辑。import torchimport numpy as npfrom matplotlib import pyplot as pltfrom torch.utils.data import DataLoaderfrom torchvision import transformsfrom torchvision import datasetsimport torch.nn.functional as F"""卷积运算 使用mnist数据集,和10-4,11类似的,只是这里:1.输出训练轮的acc 2.模型上使用torch.nn.Sequential"""batch_size = 64learning_rate = 0.01momentum = 0.5EPOCH = 10transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])# softmax归一化指数函数,其中0.1307是mean均值和0.3081是std标准差train_dataset = datasets.MNIST(root='./data/mnist', train=True, transform=transform,download=True) # 本地没有就加上download=Truetest_dataset = datasets.MNIST(root='./data/mnist', train=False, transform=transform,download=True) # train=True训练集,=False测试集train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)fig = plt.figure()for i in range(12): plt.subplot(3, 4, i+1) plt.tight_layout() plt.imshow(train_dataset.train_data[i], cmap='gray', interpolation='none') plt.title("Labels: {}".format(train_dataset.train_labels[i])) plt.xticks([]) plt.yticks([])plt.show()# 训练集乱序,测试集有序class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = torch.nn.Sequential( torch.nn.Conv2d(1, 10, kernel_size=5), torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2), ) self.conv2 = torch.nn.Sequential( torch.nn.Conv2d(10, 20, kernel_size=5), torch.nn.ReLU(), torch.nn.MaxPool2d(kernel_size=2), ) self.fc = torch.nn.Sequential( torch.nn.Linear(320, 50), torch.nn.Linear(50, 10), ) def forward(self, x): batch_size = x.size(0) x = self.conv1(x) # 一层卷积层,一层池化层,一层激活层(图是先卷积后激活再池化,差别不大) x = self.conv2(x) # 再来一次 x = x.view(batch_size, -1) # flatten 变成全连接网络需要的输入 (batch, 20,4,4) ==> (batch,320), -1 此处自动算出的是320 x = self.fc(x) return x # 最后输出的是维度为10的,也就是(对应数学符号的0~9)model = Net()# Construct loss and optimizer ------------------------------------------------------------------------------criterion = torch.nn.CrossEntropyLoss() # 交叉熵损失optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum) # lr学习率,momentum冲量# Train and Test CLASS --------------------------------------------------------------------------------------# 把单独的一轮一环封装在函数类里def train(epoch): running_loss = 0.0 # 这整个epoch的loss清零 running_total = 0 running_correct = 0 for batch_idx, data in enumerate(train_loader, 0): inputs, target = data optimizer.zero_grad() # forward + backward + update outputs = model(inputs) loss = criterion(outputs, target) loss.backward() optimizer.step() # 把运行中的loss累加起来,为了下面300次一除 running_loss += loss.item() # 把运行中的准确率acc算出来 _, predicted = torch.max(outputs.data, dim=1) running_total += inputs.shape[0] running_correct += (predicted == target).sum().item() if batch_idx % 300 == 299: # 不想要每一次都出loss,浪费时间,选择每300次出一个平均损失,和准确率 print('[%d, %5d]: loss: %.3f , acc: %.2f %%' % (epoch + 1, batch_idx + 1, running_loss / 300, 100 * running_correct / running_total)) running_loss = 0.0 # 这小批300的loss清零 running_total = 0 running_correct = 0 # 这小批300的acc清零 # torch.save(model.state_dict(), './model_Mnist.pth') # torch.save(optimizer.state_dict(), './optimizer_Mnist.pth')def test(): correct = 0 total = 0 with torch.no_grad(): # 测试集不用算梯度 for data in test_loader: images, labels = data outputs = model(images) _, predicted = torch.max(outputs.data, dim=1) # dim = 1 列是第0个维度,行是第1个维度,沿着行(第1个维度)去找1.最大值和2.最大值的下标 total += labels.size(0) # 张量之间的比较运算 correct += (predicted == labels).sum().item() acc = correct / total print('[%d / %d]: Accuracy on test set: %.1f %% ' % (epoch+1, EPOCH, 100 * acc)) # 求测试的准确率,正确数/总数 return acc# Start train and Test --------------------------------------------------------------------------------------if __name__ == '__main__': acc_list_test = [] for epoch in range(EPOCH): train(epoch) # if epoch % 10 == 9: #每训练10轮 测试1次 acc_test = test() acc_list_test.append(acc_test) plt.plot(acc_list_test) plt.xlabel('Epoch') plt.ylabel('Accuracy On TestSet') plt.show()当代码编写完毕后在导包的部分会出现爆红(在包名下面会出现红色波浪线)的情况,直接将鼠标放到爆红(代码下方会出现)部分,会自动弹出下载,然后点击“下载”即可。如果没有弹出下载,请打开终端,在终端输入命令:pip3 install matplotlib 指令下载。2.代码部分讲解1)导入数据包首先对于导包部分导入,Pytorch、NumPy、Matplotlib等库,用于进行深度学习模型的构建数据可视化。2)设置超参数这里定义了几个训练过程中的重要参数:batch_size:每次训练的样本数量;Learning_rate:学习率,用于控制模型权重更新的幅度;momentum:动量,用于加速训练过程中的权重更新;EPOCH:训练的总轮数。3)数据预处理这一串代码定义了数据预处理的流程,包括将图片转换为张量,并进行标准理。加载MNIST数据集,并将其分为训练集和测试集,同时用DataLoader来批量加载数据集。使用Matplotlib显示部分训练数据,以便直观地了解数据集。4)创建模型和函数定义一个卷积神经网络模型NET,包括两个卷积层和两个全连接层。创建模型实例,交叉熵损失函数和梯度下降的优化器。定义训练和测试的函数,分别用于训练模型和在测试集上评估模型性能训练函数。编写测试函数。最后是主函数,这里:1.对模型进行指定轮数的训练;2.在每个训练轮数后,测试模型性能,并将其准确记录下来;3.最后绘制测试集准确率随着训练轮数的变化图。4.5 运行结果生成代码编写完毕后右击鼠标,点击运行。运行后会出现手写体识别的结果,可以看到在数据集图片上放有Labels字样,后面紧跟着就是手写体识别后识别出来的数字。​运行结果中有loss损失函数,以及acc准确率,可以看到loss损失函数在慢慢的降低,而acc准确率在慢慢的升高。acc准确率提高的原因是因为训练轮数的不断增加,交叉熵损失衡量了模型预测与真实标签之间的差异。在训练过程中,优化器的目标是使损失函数最小化。随着训练轮数的增加,损失函数的值逐渐降低,这意味着模型的预测越来越接近真实标签,从而提高准确率。acc准确率折线图,横轴表示训练轮次,纵轴表示准确率,acc准确率的提高因为训练轮数的不断增加,模型通过不断地优化参数,逐步学习到数据中的特征和模式,减少预测误差,从而提高在测试集上的准确率。​至此,实验完毕。想了解更多手写体识别的内容可以访问:https://yann.lecun.com/exdb/mnist/想了解更多关于PyTorch框架的可以访问:https://pytorch.org/