-
最近大家肯定被各种AI大模型刷屏了,从ChatGPT到Alpaca,从ChatGLM到Bloom,各种大模型层出不穷,给人感觉“再不上车就来不及了”。然而要上车大模型可不简单,首先,得准备至少几百张炼丹卡,或者直接上超算,普通人看看预算就自觉放弃了。但是,AI时代已经来临,时代从来不会抛弃那些跟不上时代的人,而是直接从他们身上碾压过去。因此,普通人也有必要学习一点AI知识。网上很多铺天盖地地在很高的层次大讲特讲人工智能对产业和人类的影响,看完后没有收获知识,但收获了焦虑。本文和热点网文则不同,本文以工程师的视角从零开始搭建并运行一个AI小模型,并把它完全运行起来以理解AI的工作原理,非常接地气。AI模型是如何工作的神经网络是AI的一种重要的计算模型,深度学习是通过神经网络实现特征学习和模式分析,大量用于图像识别等领域。我们以最基础的手写数字识别为例,看看一个神经网络的AI模型是如何工作的。MNIST(Modified National Institute of Stands and Technology)是一个开源的数据集,它包含了6万个手写的数字图像,每个图像都是28x28黑底白字:有了这个开源的数据集,我们就可以训练一个识别手写数字的AI模型,这个练习堪称AI界的“Hello, world”。要编写这个AI模型,我们需要使用一种称为卷积神经网络(CNN:Convolutional Neural Network)的神经网络结构,具体到代码层面,则需要使用PyTorch这样的训练框架。PyTorch底层用C++开发,外层用Python调用,非常方便易用。先确保机器安装了Python3,然后,安装PyTorch 2:pip install torch torchvision torchaudio如果本机有CUDA环境,也可以安装GPU版本,训练速度更快。编写模型准备好环境后,我们开始编写模型。先让AI写一个用CNN识别MNIST数据集的PyTorch代码:import torch.nn as nnclass NeuralNetwork(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(1, 32, 3, 1) self.conv2 = nn.Conv2d(32, 64, 3, 1) self.fc1 = nn.Linear(in_features=64 * 5 * 5, out_features=128) self.fc2 = nn.Linear(in_features=128, out_features=10) def forward(self, x): x = nn.functional.relu(self.conv1(x)) x = nn.functional.max_pool2d(x, kernel_size=2) x = nn.functional.relu(self.conv2(x)) x = nn.functional.max_pool2d(x, kernel_size=2) x = x.view(-1, 64 * 5 * 5) x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return x看不懂不要紧,可以接着问AI,它会告诉我们,这个神经网络定义了两个CNN卷积层和两个全连接层,总的来说就是,这个模型定义了2层卷积网络加2层全连接层,输入为1通道图片,经过卷积和池化后进入全连接层,最后输出10个分类结果,分别代表0~9这10个数字。训练接下来我们要使用MNIST数据集来训练这个模型。受益于PyTorch这个框架,我们连下载和读取数据集都省了,因为PyTorch已经集成了这个数据集,直接下载、加载、训练,一步到位:from time import timeimport torchimport torch.nn as nnimport torch.optim as optimfrom torchvision import datasetsfrom torch.utils.data import DataLoaderfrom torchvision.transforms import ToTensorfrom model import NeuralNetworkdef train(dataloader, device, model, loss_fn, optimizer): model.train() running_loss = 0.0 for batch, (inputs, labels) in enumerate(dataloader): inputs = inputs.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = model(inputs) loss = loss_fn(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f'loss: {running_loss/len(dataloader):>0.3f}')def test(dataloader, device, model): model.eval() correct = 0 total = 0 with torch.no_grad(): for inputs, labels in dataloader: inputs = inputs.to(device) labels = labels.to(device) outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print(f'accuracy: {100.0*correct/total:>0.2f} %')def main(): print('loading training data...') train_data = datasets.MNIST( root='./data', train=True, download=True, transform=ToTensor()) print('loading test data...') test_data = datasets.MNIST( root='./data', train=False, download=True, transform=ToTensor()) train_dataloader = DataLoader(train_data, batch_size=64) test_dataloader = DataLoader(test_data, batch_size=64) device = 'cuda' if torch.cuda.is_available() else 'cpu' print(f'using {device}') model = NeuralNetwork().to(device) print(model) loss_fn = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) epochs = 5 for t in range(epochs): start_time = time() print(f'epoch {t+1} / {epochs}\n--------------------') train(train_dataloader, device, model, loss_fn, optimizer) test(test_dataloader, device, model) end_time = time() print(f'time: {end_time-start_time:>0.2f} seconds') print('done!') path = 'mnist.pth' torch.save(model.state_dict(), path) print(f'model saved: {path}')if __name__ == '__main__': main()数据集分两部分:一个用于训练,一个用于测试训练效果,用PyTorch的datasets.MNIST()自动下载、解压并加载数据集(解压后约55M数据,仅第一次需要下载)。然后,定义损失函数和优化器,用train()做训练,用test()测试训练效果,训练5次,运行结果如下:$ python3 train.pyloading training data...Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...第一次运行会自动下载数据到data目录并解压...loading test data...using cpuNeuralNetwork( (conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1)) (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1)) (fc1): Linear(in_features=1600, out_features=128, bias=True) (fc2): Linear(in_features=128, out_features=10, bias=True))epoch 1 / 5--------------------loss: 0.177accuracy: 97.21 %time: 30.96 secondsepoch 2 / 5--------------------loss: 0.053accuracy: 98.62 %time: 32.24 secondsepoch 3 / 5--------------------loss: 0.035accuracy: 98.70 %time: 33.70 secondsepoch 4 / 5--------------------loss: 0.025accuracy: 98.90 %time: 35.10 secondsepoch 5 / 5--------------------loss: 0.018accuracy: 98.95 %time: 32.02 secondsdone!model saved: mnist.pth经过5轮训练,每轮耗时约30秒(这里用CPU训练,如果是GPU则可以大大提速),准确率可以达到99%。训练结束后,将模型保存至mnist.pth文件。使用模型有了预训练的模型后,我们就可以用实际的手写图片测试一下。用PS手绘几张手写数字图片,测试代码如下:import torchfrom torchvision import transformsfrom PIL import Image, ImageOpsfrom model import NeuralNetworkdevice = 'cuda' if torch.cuda.is_available() else 'cpu'print(f'using {device}')model = NeuralNetwork().to(device)path = './mnist.pth'model.load_state_dict(torch.load(path))print(f'loaded model from {path}')print(model)def test(path): print(f'test {path}...') image = Image.open(path).convert('RGB').resize((28, 28)) image = ImageOps.invert(image) trans = transforms.Compose([ transforms.Grayscale(1), transforms.ToTensor() ]) image_tensor = trans(image).unsqueeze(0).to(device) model.eval() with torch.no_grad(): output = model(image_tensor) probs = torch.nn.functional.softmax(output[0], 0) predict = torch.argmax(probs).item() return predict, probs[predict], probsdef main(): for i in range(10): predict, prob, probs = test(f'./input/test-{i}.png') print(f'expected {i}, actual {predict}, {prob}, {probs}')if __name__ == '__main__': main()因为训练时输入的图片是黑底白字,而测试图片是白底黑字,所以先用PIL把图片处理成28x28的黑底白字,再测试,结果如下:$ python3 test.py using cpuloaded model from ./mnist.pthNeuralNetwork( (conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1)) (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1)) (fc1): Linear(in_features=1600, out_features=128, bias=True) (fc2): Linear(in_features=128, out_features=10, bias=True))test ./input/test-0.png...expected 0, actual 0, 0.9999996423721313, tensor([1.0000e+00, 2.3184e-10, 1.7075e-08, 7.6250e-16, 1.2966e-12, 5.7179e-11, 2.1766e-07, 1.8820e-12, 1.1260e-07, 2.2463e-09])...以图片0为例,我们要使用模型,需要把输入图片变成模型可接受的参数,实际上是一个Tensor(张量),可以理解为任意维度的数组,而模型的输出也是一个Tensor,它是一个包含10个元素的1维数组,分别表示每个输出的概率。对图片0的输出如下:1.0000e+002.3184e-101.7075e-087.6250e-161.2966e-125.7179e-112.1766e-071.8820e-121.1260e-072.2463e-09除了第一个输出为1,其他输出都非常接近于0,可见模型以99.99996423721313%的概率认为图片是0,是其他数字的概率低到接近于0。因此,这个MNIST模型实际上是一个图片分类器,或者说预测器,它针对任意图片输入,都会以概率形式给出10个预测,我们找出接近于1的输出,就是分类器给出的预测。产品化虽然我们已经有了预训练模型,也可以用模型进行手写数字识别,但是,要让用户能方便地使用这个模型,还需要进一步优化,至少需要提供一个UI。我们让AI写一个简单的页面,允许用户在页面用鼠标手写数字,然后,通过API获得识别结果:因此,最后一步是把模型的输入输出用API封装一下。因为模型基于PyTorch,所以使用Python的Flask框架是最简单的。API实现如下:import base64import torchfrom io import BytesIOfrom PIL import Imagefrom flask import Flask, request, redirect, jsonifyfrom torchvision import transformsfrom model import NeuralNetworkdevice = 'cuda' if torch.cuda.is_available() else 'cpu'print(f'using {device}')model = NeuralNetwork().to(device)path = './mnist.pth'model.load_state_dict(torch.load(path))print(f'loaded model from {path}')print(model)params = model.state_dict()print(params)app = Flask(__name__)@app.route('/')def index(): return redirect('/static/index.html')@app.route('/api', methods=['POST'])def api(): data = request.get_json() image_data = base64.b64decode(data['image']) image = Image.open(BytesIO(image_data)) trans = transforms.Compose([ transforms.Grayscale(1), transforms.ToTensor() ]) image_tensor = trans(image).unsqueeze(0).to(device) model.eval() with torch.no_grad(): output = model(image_tensor) probs = torch.nn.functional.softmax(output[0], 0) predict = torch.argmax(probs).item() prob = probs[predict] print(f'predict: {predict}, prob: {prob}, probs: {probs}') return jsonify({ 'result': predict, 'probability': prob.item() })if __name__ == '__main__': app.run(port=5000)上述代码实现了一个简单的API服务,注意尚未对并发访问做处理,所以只能算一个可用的DEMO。思考对于AI程序,我们发现,模型定义非常简单,一共也就20行代码。训练代码也很少,不超过100行。它和传统的程序最大的区别在哪呢?无论是传统的程序,还是AI程序,在计算机看来,本质上是一样的,即给定一个输入,通过一个函数计算,获得输出。不同点在于,对于传统程序,输入是非常简单的,例如用户注册,仅仅需要几个字段,而处理函数少则几千行,多则几十万行。虽然代码量很大,但执行路径却非常清晰,通过跟踪执行,能轻易获得一个确定的执行路径,从而最终获得一个确定性的结果。确定性就是传统程序的特点,或者说,传统程序的代码量虽然大,但输入简单,路径清晰:f(x1, x2, x3) │ ▼ ┌─┐◀─┐ └─┘ │ │ │ ▼ │ ┌─┐ │ └─┘ │ │ │ ▼ │ ┌─┐──┘ └─┘ │ ▼ ┌─┐ └─┘AI程序则不同,它只经过几层计算,复杂的大模型也就100来层,就可以输出结果。但是,它的输入数据量大,每一层的数据量更大,就像一个扁平的巨大函数: f(x1, x2, x3, ... , x998, x999, x1000) │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ │ │ │ │ │ │ │ │ │ ┌───┬───┼───┼───┼───┼───┼───┼───┼───┼───┼───┬───┐ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐└─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ │ │ │ │ │ │ │ │ │ │ │ │ │ └───┴───┴───┴───┼───┼───┼───┼───┼───┴───┴───┴───┘ ▼ ▼ ▼ ▼ ▼ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ └─┘ └─┘ └─┘ └─┘ └─┘这个函数的计算并不复杂,每一层都是简单的矩阵计算,但并行程度很高,所以需要用GPU加速。复杂度在于每一层都有大量的参数,这些参数不是开发者写死的,而是通过训练确定的,每次对参数进行微调,然后根据效果是变得更好还是更坏决定微调方向。我们这个简单的神经网络模型参数仅几万个,训练的目的实际上就是为了把这几万个参数确定下来,目标是使得识别率最高。训练这几万个参数就花了几分钟时间,如果是几亿个甚至几百亿个参数,可想而知训练所需的时间和算力都需要百万倍的增长,所以,AI模型的代码并不复杂,模型规模大但本身结构并不复杂,但为了确定模型中每一层的成千上万个参数,时间和算力主要消耗在训练上。比较一下传统程序和AI程序的差异:传统程序AI程序代码量大少输入参数少多输出结果精确输出不确定性输出代码参数由开发设定由训练决定执行层次可达数百万行仅若干层网络执行路径能精确跟踪无法跟踪并行串行或少量并行大规模并行计算以CPU为主以GPU为主开发时间主要消耗在编写代码主要消耗在训练数据主要存储用户产生的数据需要预备大量训练数据程序质量取决于设计架构、代码优化等取决于神经网络模型和训练数据质量传统程序的特点是精确性:精确的输入可以实现精确地执行路径,最终获得精确的结果。而AI程序则是一种概率输出,由于模型的参数是训练生成的,因此,就连开发者自己也无法知道训练后的某个参数比如0.123究竟是什么意义,调大或者调小对输出有什么影响。传统程序的逻辑是白盒,AI程序的逻辑就是黑盒,只能通过调整神经网络的规模、层次、训练集和训练方式来评估输出结果,无法事先给出一个准确的预估。转自: https://www.liaoxuefeng.com/article/1543329456062498
-
参与活动前请先报名HDC.Cloud2023开发者社区活动【点击报名】活动奖励:本次活动结束后,如参与技术梦工厂相关体验活动人数≥200人,将由华为云工作人员将符合抽奖条件的用户名单优先导入至巨公摇号平台(https://www.jugong.wang/random-portal/)内,抽取各奖项,并截屏公示抽奖过程。如您不同意此抽奖规则,请勿参加本次活动。将抽取80位符合条件的开发者,每人奖励无线鼠标1个,以及1位幸运开发者,获取总价值4000元终极电子产品礼包(HUAWEI Sound X 智能音箱、任天堂 Nintendo Switch 国行游戏机)。活动时间:6月20日-7月16日 参与方式:开发者根据案例指导体验AI涂鸦生图,并将最后运行的结果截图(如下所示)回复至活动帖内,视为完成本次任务。【点击立即体验AI涂鸦生图案例】活动规则:回复非示例要求图片或其他无效信息,视为无效楼层,并取消抽奖资格。 Tips:1、请务必使用个人账号参与活动(IAM、企业账号等账号参与无效)。2、所有获得奖项的获奖用户,请于获奖后3日内完成实名认证,否则视为放弃奖励。3、收货信息填写说明:1)为保证您顺利领取活动奖品,请您提前填写奖品收货信息,如您没有填写,视为放弃奖励。收货信息请【点击此处填写】2)填写时间截至2023年8月1日3)在【2023】HDC.Cloud开发者社区活动获奖信息收集表中完成一次填写即可。我们最终将会按照您填写的信息发放奖励。4、活动规则请戳cid:link_3
-
kkkkkkkkkkkkkkkkkkkkkkkk
-
山水 水墨 动漫 粒子 五行
-
AI-这是抽象的日出
-
AI Gallery算法、镜像、模型、Workflow等AI数字资产的共享,为高校科研机构、AI应用开发商、解决方案集成商、企业级/个人开发者等群体,提供安全、开放的共享及交易环节,加速AI资产的开发与落地,保障AI开发生态链上各参与方高效地实现各自的商业价值。AI说介绍AI Gallery的AI说模块为开发者提供自由分享各类AI领域内知识和经验的平台。开发者既可以发布个人技术文章,也可以阅读和学习他人分享的技术文章。案例库介绍AI Gallery的案例库是面向场景化交付的AI资产的组合和使用案例。案例中沉淀了基于业务场景的AI知识、经验和部分通用的业务逻辑,能够为某些具体的业务场景提供AI环节的解决方案。AI Gallery使用限制 目前自动学习产生的模型暂不支持发布到AI Gallery。 订阅或购买主要是获取AI资产的使用配额和使用权,支持在配额定义的约束下,有限地使用AI资产。 使用AI资产时,可能需要消耗硬件资源,硬件资源费用将根据实际使用情况,由华为云ModelArts等管理控制台向使用方收取。 已发布的AI资产,如果不需要在资产列表中展示该资产,可以将资产下架。下架后,已发布资产仅发布者可见。已经被订阅的资产,即便资产下架后,基于配额资源的约束,仍然可有效使用该资产,不会因为该资产的下架而产生使用问题。AI Gallery中,“资产集市”支持Notebook代码样例、数据集、算法、镜像、模型、Workflow等AI资产的共享。 “资产集市 > Notebook”:共享了Notebook代码样例。 AI Gallery的Notebook模块为开发者提供免费分享和灵活使用Notebook代码样例的功能。您可以将优秀的Notebook代码样例发布在AI Gallery社区,供其他开发者学习使用;也可以在AI Gallery上查看其他人共享的Notebook案例的详细描述、代码信息等,通过“Run in ModelArts”将Notebook案例在ModelArts控制台快速打开、运行以及进行二次开发等操作。 “资产集市 > 数据集”:共享了数据集。 AI Gallery的数据模块支持数据集的共享和下载。在AI Gallery的“数据”中,可以查找并下载满足业务需要的数据集。也可以将自己本地的数据集发布至AI Gallery中,共享给其他用户使用。 “资产集市 > 算法”:共享了算法。 AI Gallery的算法模块支持算法的共享和订阅。在AI Gallery的“算法”中,可以查找您想要的算法,订阅满足业务需要的资产,最后推送至ModelArts控制台中使用。也可以将个人开发的算法分享发布至AI Gallery中,共享给其他用户使用。 “资产集市 > 镜像”:共享了ModelArts镜像。 AI Gallery的ModelArts镜像支持发布和使用共享的镜像。在AI Gallrey的“镜像”中,可以查找您想要的ModelArts镜像,最后在ModelArts管理控制台中使用。也可以将个人开发的ModelArts镜像分享发布至AI Gallery中,共享给其他用户使用。 “资产集市 > 模型”:共享了ModelArts模型和HiLens技能。 AI Gallery的模型模块包括ModelArts模型和HiLens技能,支持发布和订阅共享的模型。在AI Gallery的“模型”中,可以查找您想要的ModelArts模型或HiLens技能,订阅满足业务需要的资产,最后推送至ModelArts或HiLens等管理控制台中使用。也可以将个人开发的ModelArts模型或HiLens技能分享发布至AI Gallery中,共享给其他用户使用。其中,HiLens技能为HiLens服务的技能市场功能,详细指导请参见《HiLens用户指南》。 “资产集市 > Workflow”:共享了Workflow。 AI Gallery的Workflow模块支持Workflow的共享和订阅。在AI Gallery的Workflow中,可以查找您想要的Workflow,订阅满足业务需要的资产,最后推送至ModelArts控制台中使用。也可以将个人开发的Workflow分享发布至AI Gallery中,共享给其他用户使用。
-
循环神经网络算法(RNN)是一种人工神经网络模型,主要用于处理序列数据,例如文本、语音、视频等。RNN的循环指的是在网络中存在反馈连接,即当前时刻的输出不仅与当前输入有关,还与之前时刻的输入有关。这种反馈机制使得RNN能够记忆之前的信息,从而在处理序列数据时能够更好地捕捉时序信息。RNN的应用非常广泛,其中最成功的应用之一是自然语言处理领域。在自然语言处理中,RNN常常被用于序列标注、机器翻译、文本生成等任务。此外,RNN还被广泛应用于语音识别、图像描述生成、视频分析等领域。以机器翻译为例,传统的翻译系统需要先对源文本进行分词、语法分析等预处理,然后进行翻译,最后再将翻译结果重新组合成合法的目标语言文本。这种方法忽略了源文本中蕴含的时序信息,导致翻译结果不够准确。而使用RNN的机器翻译系统可以将源文本输入到网络中,通过网络自动学习到翻译模型,然后将翻译结果直接输出到目标语言文本中,避免了繁琐的预处理过程。在RNN的基础上,还有一些改进的算法,如长短时记忆网络(LSTM)、门控循环单元(GRU)等,它们都在自然语言处理领域取得了很好的效果。其中,LSTM是一种能够更好地处理长序列信息的RNN变体,它在自然语言处理、语音识别、图像分析等领域都得到了广泛应用。GRU是一种比LSTM更简单、更高效的循环神经网络算法,也在许多应用中取得了良好的效果。
-
自组织映射算法(SOM)是一种无导师学习方法,它模拟了人脑对信号处理的特点,通过神经网络的自组织能力对输入数据进行分类和可视化。SOM 模型将输入数据映射到二维或三维的网格中,每个节点都有一个权重,表示该节点在数据中的位置。当新的输入数据到来时,算法会将其分配到最接近的节点,这个过程称为竞争。节点会不断地更新自己的权重,以使自己在未来的竞争中更有优势。这个过程模拟了大脑皮层中的神经元之间的连接形成过程。SOM 的应用非常广泛,包括模式识别、信号处理、数据挖掘等。由于该算法具有简单易用、可视化效果好等优点,因此在实际应用中得到了广泛的应用和研究。SOM 可以用于发现数据中的规律和模式,同时也可以将高维数据可视化。例如,在数据分析中,SOM 可以将高维数据降低到二维或三维空间,从而方便地进行可视化分析。此外,SOM 还可以用于聚类分析、异常检测、预测模型等方面。SOM 的工作原理包括竞争和合作两个过程。竞争过程是指输入数据被映射到网络节点,节点根据其权重值和距离计算得到一个相似度得分,从而确定其在竞争中的胜负。合作过程是指节点根据竞争结果调整其权重值,使得权重值相近的节点互相连接,从而形成神经元之间的连接。这个过程不断迭代,直到网络达到稳定状态,即节点之间的权重值不再发生变化。SOM 的优点包括简单易用、可视化效果好、能够自动进行特征提取、能够处理噪声数据等。缺点包括需要手动调整网络结构、难以进行在线学习、容易受到初始化权重的影响等。
-
生成对抗网络(GAN,Generative Adversarial Networks)是一种深度学习模型,主要用于生成与真实数据相似的人工数据。GAN包括两个神经网络,即生成器和判别器。生成器从随机向量中生成假数据,而判别器负责判断输入的数据是真实的还是伪造的。通过不断迭代训练过程,GAN可以生成与真实数据相似的新数据。GAN的基本思想是通过对抗训练来生成与真实数据相似的人工数据。生成器生成的假数据会被判别器判断,如果判别器无法区分真假数据,那么生成器就成功了。GAN的训练过程包括两个步骤。首先训练判别器,通过给定真实数据和生成器的输出,训练判别器来区分真实数据和伪造数据。然后训练生成器,通过利用判别器的输出来调整生成器的参数,使得它生成的假数据能够欺骗判别器。GAN可以应用于各种领域,如图像生成、图像修复、图像增强等。它还可以用于自然语言处理中的文本生成和对话生成。GAN的主要优点是可以生成与真实数据相似的新数据,缺点是训练不稳定,容易陷入局部最优解。GAN的应用非常广泛,例如可以使用GAN来生成图像的水印、头像、手写字体等,也可以用于生成音乐、诗歌、故事等。GAN的优点是可以生成与真实数据相似的人工数据,因此可以用于各种创意产业中。同时,GAN也可以用于图像修复、图像增强、图像合成等任务中。然而,GAN的训练过程比较复杂,需要仔细地选择超参数和训练策略,否则容易陷入局部最优解或出现其他问题。此外,GAN的训练结果也具有一定的不确定性,因此需要多次训练和尝试来获得满意的结果。总之,GAN是一种强大的深度学习模型,可以用于生成各种类型的数据。尽管它的训练过程比较复杂,但它的应用前景非常广阔,可以为许多领域带来创新性的解决方案。
-
逻辑回归是一种用于分类和预测的算法,通过使用逻辑函数将线性回归的结果映射到(0,1)的范围内,从而显示概率。它是属于广义线性回归的一种,可以用来描述二分类或多分类问题。逻辑回归原理:逻辑回归是一种线性分类模型,通过将线性回归的结果映射到(0,1)的范围内,从而显示概率。它使用逻辑函数作为联系函数,将线性回归的结果映射到(0,1)的范围内。逻辑函数的表达式如下:Sigmoid(Score)=1/(1+e^(-Score))其中Score是线性回归的结果,Sigmoid是逻辑函数。逻辑回归与线性回归的联系与区别:联系:逻辑回归和线性回归都是用来描述自变量x和因变量Y之间的关系,或者说自变量X对因变量Y的影响程度。区别:线性回归是用来描述数值变量之间的关系的,而逻辑回归是用来描述分类变量之间的关系的。逻辑回归算法的应用场景:二分类问题:逻辑回归最常用于二分类问题,例如垃圾邮件过滤、医学诊断等。多分类问题:逻辑回归也可以用于多分类问题,通过将多个逻辑回归模型组合在一起来解决多分类问题。预测问题:逻辑回归可以用于预测问题,例如在市场营销领域中进行客户行为的预测。总之,逻辑回归算法是一种强大的工具,可以用于解决各种分类和预测问题。
-
随机森林(Random Forest)是一种机器学习算法,它是由多个决策树组成的集成学习算法。随机森林的主要思想是利用随机扰动来增加数据的特征维度和降低特征之间的相关性,从而提高模型的稳定性和准确性。随机森林的构建过程如下:从原始数据中随机选择一部分作为训练数据集。对于每个决策树,从训练数据集中随机选择一部分特征进行构建。构建决策树,对于每个节点,从剩余特征中选择最具有分类能力的特征进行划分。重复步骤2和3,直到构建完整个决策树。重复步骤2到4,构建多棵决策树,并将它们合并成一个随机森林。随机森林的优点包括:随机扰动增加了数据的特征维度和降低了特征之间的相关性,从而提高了模型的稳定性和准确性。可以通过控制决策树的数量和每个决策树的最大深度来控制模型的复杂度和泛化能力。可以处理高维数据和大规模数据集,并且不需要进行特征选择和数据预处理等预处理操作。可以输出每个特征对于分类或回归的重要性,以及哪些特征对模型的预测能力有更大的贡献。随机森林的缺点包括:需要大量的内存和计算资源来构建,因为需要同时构建多棵决策树。在处理高维数据时,可能会遇到维度灾难问题,因为每个决策树都需要处理所有的特征。对于一些非平衡的数据集,可能会导致随机森林的预测性能较差。总之,随机森林是一种强大的机器学习算法,可以用于分类、回归和聚类等任务,广泛应用于文本分类、图像分类、生物信息学、金融预测等领域。
-
创建OBS桶ModelArts使用对象存储服务(Object Storage Service,简称OBS)进行数据存储以及模型的备份和快照,实现安全、高可靠和低成本的存储需求。因此,建议您在使用ModelArts之前先创建一个OBS桶,然后在OBS桶中创建文件夹用于存放数据。OBS简介对象存储服务OBS是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力。对象存储服务OBS的基本组成是桶和对象。桶是OBS中存储对象的容器,每个桶都有自己的存储类别、访问权限、所属区域等属性,用户在互联网上通过桶的访问域名来定位桶。对象是OBS中数据存储的基本单位。对ModelArts来说,OBS服务是一个数据存储中心,因为ModelArts本身目前没有数据存储的功能。AI 开发过程中的输入数据、输出数据、中间缓存数据都可以在OBS桶中进行存储、读取。因此,在使用ModelArts之前您需要创建一个OBS桶,然后在OBS桶中创建文件夹用于存放数据。对象存储服务OBS操作步骤 登录OBS管理控制台,在桶列表页面右上角单击“创建桶”,创建OBS桶。例如,创建名称为“c-flowers”的OBS桶。 创建桶 说明: 创建桶的区域需要与ModelArts所在的区域一致。例如:当前ModelArts在华北-北京一区域,在对象存储服务创建桶时,请选择华北-北京一。如何查看OBS桶与ModelArts的所处区域,请参见查看OBS桶与ModelArts是否在同一区域。 请勿开启桶加密,ModelArts不支持加密的OBS桶,会导致ModelArts读取OBS中的数据失败。 在桶列表页面,单击桶名称,进入该桶的概览页面。 桶列表 单击左侧导航的“对象”,在对象页面单击新建文件夹,创建OBS文件夹。例如,在已创建的OBS桶“c-flowers”中新建一个文件夹“flowers”。具体请参见新建文件夹夹章节。 新建文件夹常见问题 在ModelArts中选择OBS路径时,找不到已创建的OBS桶? 原因是已创建的OBS桶和使用的ModelArts服务不在同一个区域。 如何查看ModelArts与OBS桶是否在同一区域? 查看创建的OBS桶所在区域。 登录OBS管理控制台。 进入“对象存储”界面,可在桶列表的“桶名称”列查找,或在右上方的搜索框中输入已经创建的桶名称搜索,找到您创建的OBS桶。 在“区域”列可查看创建的OBS桶的所在区域。 OBS桶所在区域 查看ModelArts所在区域。 登录ModelArts控制台,在控制台左上角可查看ModelArts所在区域。 比对您创建的OBS桶所在区域与ModelArts所在区域是否一致。务必保证OBS桶与ModelArts所在区域一致。
-
项目创建完成后,将会自动跳转至新版自动学习页面,并开始运行,当数据标注节点的状态变为“等待操作”时,需要手动进行确认数据集中的数据标注情况,也可以对数据集中的数据进行标签的修改,数据的增加或删减。数据标注节点状态音频标注 在新版自动学习页面单击“实例详情”按钮,前往数据标注页面。单击任意一张图片,进入音频标注页面。 音频标注在“音频标注”页面单击“未标注”页签,此页面展示所有未标注的音频数据。依次单击选中待标注的音频,或勾选“选择当前页”选中该页面所有音频,在页面右侧进行标注。 音频标注添加标注。先对音频进行播放识别,然后选中音频文件,在右侧“标签”区域,输入“标签名”或从下拉列表中选择已添加的标签,同时可在下拉菜单中选择标签“快捷键”。单击“确定”,完成选中音频的标注操作。声音分类音频标注当目录中所有音频都完成标注后,您可以在“已标注”页签下查看已完成标注的音频,或者通过右侧的“全部标签”列表,了解当前已完成的标签名称和标签数量。同步或添加音频在“数据标注”节点单击“实例详情”进入“音频标注”页面。声音分类项目创建时,音频来源有两种,通过本地添加或同步OBS中的数据。修改标注当数据完成标注后,您还可以进入“已标注”页签,对已标注的数据进行修改。 基于音频修改 在数据集详情页,单击“已标注”页签,然后在音频列表中选中待修改的音频(选择一个或多个)。在右侧标签信息区域中对标签进行修改。 修改标签:在“选中文件标签”区域中,单击操作列的编辑图标,然后在文本框中输入正确的标签名,然后单击确定图标完成修改。 删除标签:在“选中文件标签”区域中,单击操作列的删除图标,在弹出的对话框中单击“确定”删除该标签。 基于标签修改 在数据标注页面,单击“标签管理”页签,在标签管理页,显示全部标签的信息。全部标签的信息 修改标签:单击操作列的“修改”按钮,在弹出的对话框中输入修改后的标签名、选择修改后的快捷键,然后单击“确定”完成修改。修改后,之前添加了此标签的音频,都将被标注为新的标签名称。删除标签:单击操作列的“删除”按钮,在弹出的对话框中,根据提示选择删除对象,然后单击“确定”。
-
背景说明WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket协议在2011年由IETF标准化为RFC 6455,后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以建立持久性的连接,并进行双向数据传输。前提条件在线服务部署时需选择“升级为WebSocket”。在线服务中的AI应用导入选择的镜像需支持WebSocket协议。约束与限制WebSocket协议只支持部署在线服务。只支持自定义镜像导入AI应用部署的在线服务。WebSocket在线服务调用WebSocket协议本身不提供额外的认证方式。不管自定义镜像里面是ws还是wss,经过ModelArts平台出去的websocket协议都是wss的。同时wss只支持客户端对服务端的单向认证,不支持服务端对客户端的双向认证。可以使用ModelArts提供的以下认证方式:token认证AK/SKAPP认证WebSocket服务调用步骤如下(以图形界面的软件Postman进行预测,token认证为例):WebSocket连接的建立WebSocket客户端和服务端双向传输数据WebSocket连接的建立打开Postman(需选择8.5 以上版本,以10.12.0为例)工具,单击左上角,选择“File>New”,弹出新建对话框,选择“WebSocket Request”(当前为beta版本)功能:图1 选择WebSocket Request功能在新建的窗口中填入WebSocket连接信息:左上角选择Raw,不要选择Socket.IO(一种WebSocket实现,要求客户端跟服务端都要基于Socket.IO),地址栏中填入从服务详情页“调用指南”页签中获取“API接口调用公网地址”后面的地址。如果自定义镜像中有更细粒度的地址,则在地址后面追加该URL。如果有queryString,那么在params栏中添加参数。在header中添加认证信息(不同认证方式有不同header,跟https的推理服务相同)。选择单击右上的connect按钮,建立WebSocket连接。图2 获取API接口调用公网地址连接成功后结果如下:图3 连接成功WebSocket客户端和服务端双向传输数据连接建立后,WebSocket使用TCP完成全双工通信。WebSocket的客户端可以往服务端发送数据,客户端有不同的实现,同一种语言也存在不同的lib包的实现,这里不考虑实现的不同种类。客户端发送的内容在协议的角度不限定格式,Postman支持Text/Json/XML/HTML/Binary,以text为例,在输入框中输入要发送的文本,单击右侧中部的Send按钮即可将请求发往服务端,当文本内容过长,可能会导致postman工具卡住。
-
华为云Al技术全揭秘,深度解读关键技术能力。从自研芯片、开源框架到开发平台、技能市场,技术解读华为云的AI实力 。本期集合了 AI的一些关键技术,感兴趣的小伙伴可以了解一下。【ModelArts】深度解读华为云 AI 开发平台 ModelArts 技术架构简介:在竞争激烈的AI框架和平台市场下,技术解读ModelArts如何脱颖而出?【MoXing】华为云深度学习模型API,助你迅速上手AI开发简介:MoXing是华为云深度学习服务提供的网络模型开发API,它让模型的代码编写更加简单。【昇腾AI】华为秀AI硬件实力,发布算力最强AI处理器简介:昇腾910、MindSpore的推出,意味着华为已完成全栈全场景AI解决方案的构建。【昇腾AI】华为发布昇腾AI全栈软件平台,跨越算力应用鸿沟简介:异构计算架构CANN 3.0、全流程开发工具链MindStudio和MindX,覆盖了基础软件到应用使能。【AI芯片】深度解读达芬奇架构:华为AI芯片的“秘密武器”简介:达芬奇架构是华为自研的面向AI计算特征的全新计算架构,具备高算力、高能效、灵活可裁剪特性。【OCR】华为云OCR关键技术、能力分析,让产品落地做到极致简介:硬件的底层优化、自研算子、优化数据模型,华为OCR背后的技术创新。【对话机器人】从架构、API到应用,华为云如何全局践行AI落地?简介:华为云详解如何更好地实现云上强大AI能力的价值落地。【开源框架】MindSpore!这款刚刚开源的深度学习框架我爱了!简介:通过两个实际应用案例介绍开源框架 MindSpore。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签