• [技术干货] Dreambooth:一键生成你想要的人物画像
    Dreambooth:一键生成你想要的人物画像Dreambooth是谷歌发布的一种通过向模型注入自定义的主题来fine-tune diffusion model的技术,可以生成不同场景下的图片。本文将演示在AI Gallery中使用自定义数据集微调Stable Diffusion,一键生成你想要的人画图像!1. 准备工作首先下载3~10人像照片,最好是不同角度的人物图像,这里我从网上搜集了5张庄达菲的图片作为输入:2. 运行案例本案例需使用 Pytorch-2.0.1 GPU-V100 及以上规格,点击Run in ModelArts在Notebook中一键体验:3. 模型训练首先下载代码模型并配置运行环境,然后下载原始数据集wh11e.zip压缩包,替换为自己的图片并上传压缩包:模型训练配置和参数保持不变,之后启动训练,一般耗时10min:# --pretrained_model_name_or_path: 模型路径,这里使用我下载的离线权重SD1.5# --pretrained_vae_name_or_path: vae路径,这里使用我下载的离线权重# --output_dir: 输出路径# --resolution: 分辨率# --save_sample_prompt: 保存样本的提示语# --concepts_list: 配置json路径!python3 ./tools/train_dreambooth.py \ --pretrained_model_name_or_path=$model_sd \ --pretrained_vae_name_or_path="vae-ft-mse" \ --output_dir=$output_dir \ --revision="fp16" \ --with_prior_preservation --prior_loss_weight=1.0 \ --seed=777 \ --resolution=512 \ --train_batch_size=1 \ --train_text_encoder \ --mixed_precision="fp16" \ --use_8bit_adam \ --gradient_accumulation_steps=1 \ --learning_rate=$learning_rate \ --lr_scheduler="constant" \ --lr_warmup_steps=80 \ --num_class_images=$num_class_images \ --sample_batch_size=4 \ --max_train_steps=$max_num_steps \ --save_interval=10000 \ --save_sample_prompt="a photo of wh11e person" \ --concepts_list="./training_data/concepts_list.json"查看模型输出的样本:from natsort import natsortedfrom glob import glob# 查看模型输出的样本saved_weights_dir = natsorted(glob(output_dir + os.sep + '*'))[-1]saved_weights_dir'dreambooth_wh11e/500'4. 模型推理运行Gradio应用,修改输入提示词生成不同场景的人物画像:import torch import numpy as npimport gradio as grfrom diffusers import StableDiffusionPipeline# 加载模型pipe = StableDiffusionPipeline.from_pretrained(saved_weights_dir, torch_dtype=torch.float16)# 配置GPUpipe = pipe.to('cuda')pipe.enable_attention_slicing() # 开启注意力切片,节约显存pipe.enable_xformers_memory_efficient_attention() # 开启Xformers的内存优化注意力,节约显存# 更换schedulerfrom diffusers import DDIMSchedulerpipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config)negative_prompt = "bad anatomy, ugly, deformed, desfigured, distorted face, poorly drawn hands, poorly drawn face, poorly drawn feet, blurry, low quality, low definition, lowres, out of frame, out of image, cropped, cut off, signature, watermark"num_samples = 1guidance_scale = 7.5num_inference_steps = 30height = 512width = 512def generate_image(prompt, steps): image = pipe(prompt, output_type='numpy', negative_prompt=negative_prompt, height=height, width=width, num_images_per_prompt=num_samples, num_inference_steps=steps, guidance_scale=guidance_scale ).images image = np.uint8(image[0] * 255) return imagewith gr.Blocks() as demo: gr.HTML("""<h1 align="center">Dreambooth</h1>""") with gr.Tab("Generate Image"): with gr.Row(): with gr.Column(): text_input = gr.Textbox(value="a photo of wh11e person", label="prompts", lines=4) steps = gr.Slider(30, 50, step=1, label="steps") gr.Examples( examples=[ ["face portrait of wh11e in the snow, realistic, hd, vivid, sunset"], ["photo of wh11e person, closeup, mountain fuji in the background, natural lighting"], ["photo of wh11e person in the desert, closeup, pyramids in the background, natural lighting, frontal face"] ], inputs=[text_input] ) image_output = gr.Image(height=400, width=400) image_button = gr.Button("submit") image_button.click(generate_image, [text_input, steps], [image_output]) demo.launch(share=True)Loading pipeline components...: 100%|██████████| 6/6 [00:01<00:00, 4.09it/s]You have disabled the safety checker for <class 'diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline'> by passing `safety_checker=None`. Ensure that you abide to the conditions of the Stable Diffusion license and do not expose unfiltered results in services or applications open to the public. Both the diffusers team and Hugging Face strongly recommend to keep the safety filter enabled in all public facing circumstances, disabling it only for use-cases that involve analyzing network behavior or auditing its results. For more information, please have a look at https://github.com/huggingface/diffusers/pull/254 .Running on local URL: http://127.0.0.1:7860IMPORTANT: You are using gradio version 4.0.2, however version 4.29.0 is available, please upgrade.--------Running on public URL: https://0706d8a2cf7260863f.gradio.liveThis share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)
  • [技术干货] CNN-VIT 视频动态手势识别
    CNN-VIT 视频动态手势识别人工智能的发展日新月异,也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式,在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是,当操作者做出某个手势动作后,计算机能够快速准确的判断出该手势的类型。本文将使用ModelArts开发训练一个视频动态手势识别的算法模型,对上滑、下滑、左滑、右滑、打开、关闭等动态手势类别进行检测,实现类似华为手机隔空手势的功能。算法简介CNN-VIT 视频动态手势识别算法首先使用预训练网络InceptionResNetV2逐帧提取视频动作片段特征,然后输入Transformer Encoder进行分类。我们使用动态手势识别样例数据集对算法进行测试,总共包含108段视频,数据集包含无效手势、上滑、下滑、左滑、右滑、打开、关闭等7种手势的视频,具体操作流程如下:首先我们将采集的视频文件解码抽取关键帧,每隔4帧保存一次,然后对图像进行中心裁剪和预处理,代码如下:def load_video(file_name): cap = cv2.VideoCapture(file_name) # 每隔多少帧抽取一次 frame_interval = 4 frames = [] count = 0 while True: ret, frame = cap.read() if not ret: break # 每隔frame_interval帧保存一次 if count % frame_interval == 0: # 中心裁剪 frame = crop_center_square(frame) # 缩放 frame = cv2.resize(frame, (IMG_SIZE, IMG_SIZE)) # BGR -> RGB [0,1,2] -> [2,1,0] frame = frame[:, :, [2, 1, 0]] frames.append(frame) count += 1 return np.array(frames) 然后我们创建图像特征提取器,使用预训练模型InceptionResNetV2提取图像特征,代码如下:def get_feature_extractor(): feature_extractor = keras.applications.inception_resnet_v2.InceptionResNetV2( weights = 'imagenet', include_top = False, pooling = 'avg', input_shape = (IMG_SIZE, IMG_SIZE, 3) ) preprocess_input = keras.applications.inception_resnet_v2.preprocess_input inputs = keras.Input((IMG_SIZE, IMG_SIZE, 3)) preprocessed = preprocess_input(inputs) outputs = feature_extractor(preprocessed) model = keras.Model(inputs, outputs, name = 'feature_extractor') return model接着提取视频特征向量,如果视频不足40帧就创建全0数组进行补白:def load_data(videos, labels): video_features = [] for video in tqdm(videos): frames = load_video(video) counts = len(frames) # 如果帧数小于MAX_SEQUENCE_LENGTH if counts < MAX_SEQUENCE_LENGTH: # 补白 diff = MAX_SEQUENCE_LENGTH - counts # 创建全0的numpy数组 padding = np.zeros((diff, IMG_SIZE, IMG_SIZE, 3)) # 数组拼接 frames = np.concatenate((frames, padding)) # 获取前MAX_SEQUENCE_LENGTH帧画面 frames = frames[:MAX_SEQUENCE_LENGTH, :] # 批量提取特征 video_feature = feature_extractor.predict(frames) video_features.append(video_feature) return np.array(video_features), np.array(labels)最后创建VIT Model,代码如下:# 位置编码 class PositionalEmbedding(layers.Layer): def __init__(self, seq_length, output_dim): super().__init__() # 构造从0~MAX_SEQUENCE_LENGTH的列表 self.positions = tf.range(0, limit=MAX_SEQUENCE_LENGTH) self.positional_embedding = layers.Embedding(input_dim=seq_length, output_dim=output_dim) def call(self,x): # 位置编码 positions_embedding = self.positional_embedding(self.positions) # 输入相加 return x + positions_embedding # 编码器 class TransformerEncoder(layers.Layer): def __init__(self, num_heads, embed_dim): super().__init__() self.p_embedding = PositionalEmbedding(MAX_SEQUENCE_LENGTH, NUM_FEATURES) self.attention = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim, dropout=0.1) self.layernorm = layers.LayerNormalization() def call(self,x): # positional embedding positional_embedding = self.p_embedding(x) # self attention attention_out = self.attention( query = positional_embedding, value = positional_embedding, key = positional_embedding, attention_mask = None ) # layer norm with residual connection output = self.layernorm(positional_embedding + attention_out) return output def video_cls_model(class_vocab): # 类别数量 classes_num = len(class_vocab) # 定义模型 model = keras.Sequential([ layers.InputLayer(input_shape=(MAX_SEQUENCE_LENGTH, NUM_FEATURES)), TransformerEncoder(2, NUM_FEATURES), layers.GlobalMaxPooling1D(), layers.Dropout(0.1), layers.Dense(classes_num, activation="softmax") ]) # 编译模型 model.compile(optimizer = keras.optimizers.Adam(1e-5), loss = keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics = ['accuracy'] ) return model模型训练完整体验可以点击Run in ModelArts一键运行我发布的Notebook:最终模型在整个数据集上的准确率达到87%,即在小数据集上训练取得了较为不错的结果。视频推理首先加载VIT Model,获取视频类别索引标签:import random # 加载模型 model = tf.keras.models.load_model('saved_model') # 类别标签 label_to_name = {0:'无效手势', 1:'上滑', 2:'下滑', 3:'左滑', 4:'右滑', 5:'打开', 6:'关闭', 7:'放大', 8:'缩小'}然后使用图像特征提取器InceptionResNetV2提取视频特征:# 获取视频特征 def getVideoFeat(frames): frames_count = len(frames) # 如果帧数小于MAX_SEQUENCE_LENGTH if frames_count < MAX_SEQUENCE_LENGTH: # 补白 diff = MAX_SEQUENCE_LENGTH - frames_count # 创建全0的numpy数组 padding = np.zeros((diff, IMG_SIZE, IMG_SIZE, 3)) # 数组拼接 frames = np.concatenate((frames, padding)) # 取前MAX_SEQ_LENGTH帧 frames = frames[:MAX_SEQUENCE_LENGTH,:] # 计算视频特征 N, 1536 video_feat = feature_extractor.predict(frames) return video_feat最后将视频序列的特征向量输入Transformer Encoder进行预测:# 视频预测 def testVideo(): test_file = random.sample(videos, 1)[0] label = test_file.split('_')[-2] print('文件名:{}'.format(test_file) ) print('真实类别:{}'.format(label_to_name.get(int(label))) ) # 读取视频每一帧 frames = load_video(test_file) # 挑选前帧MAX_SEQUENCE_LENGTH显示 frames = frames[:MAX_SEQUENCE_LENGTH].astype(np.uint8) # 保存为GIF imageio.mimsave('animation.gif', frames, duration=10) # 获取特征 feat = getVideoFeat(frames) # 模型推理 prob = model.predict(tf.expand_dims(feat, axis=0))[0] print('预测类别:') for i in np.argsort(prob)[::-1][:5]: print('{}: {}%'.format(label_to_name[i], round(prob[i]*100, 2))) return display(Image(open('animation.gif', 'rb').read()))模型预测结果:文件名:hand_gesture/woman_014_0_7.mp4 真实类别:无效手势 预测类别: 无效手势: 99.82% 下滑: 0.12% 关闭: 0.04% 左滑: 0.01% 打开: 0.01%
  • [其他] 2024年,你最期待AI在哪个方面的革命
    2024年,你最期待AI在哪个方面的革命
  • [问题求助] 如何在modelarts中利用AI gallery提供的算法进行准确性输出?
    我在modelarts中的AI gallery中订阅了如下算法:根据对应算法提供的训练说明进行训练,并最后部署为在线服务(期间遇到的各种问题都通过工单方式解决👍🏻),但输出的结果始终不对,如下所示(算法为:Llama-7B-预训练-全参微调):想问各位大佬,这种情况我应该如何解决?AI gallery提供的算法准确性如何?我目前只想跑通一个开源大模型算法的训练流程并输出对应正确的结果,有推荐的算法么?
  • [技术干货] AI Gallery在线分析影评情感基调
    1.AI Gallery1.1 AI Gallery简介AI Gallery是在ModelArts的基础上构建的开发者生态社区,提供了Notebook代码样例、数据集、算法、模型、Workflow等AI数字资产的共享,为高校科研机构、AI应用开发商、解决方案集成商、企业级/个人开发者等群体,提供安全、开放的共享及交易环节,加速AI资产的开发与落地,保障AI开发生态链上各参与方高效地实现各自的商业价值。AI Gallery文档:cid:link_0AI Gallery中的代码样例平台:cid:link_11.2 AI Gallery前提准备1.2.1 输入中文电影进行样例搜索1.2.2 点击Run in ModelArts1.2.3 选择环境1.3 AI Gallery在线分析影评情感基调样例代码使用1.3.1 准备代码和数据相关代码、数据和模型都已存放在OBS中,执行下面一段代码即可将其拷贝到Notebook中import osimport moxing as moxif not os.path.exists("/home/ma-user/work/xx"): mox.file.copy_parallel('obs://modelarts-labs-bj4-v2/case_zoo/bert_ch_movie_reviews/bert_movie_ch.zip',"/home/ma-user/work/bert_movie_ch.zip") os.system("cd /home/ma-user/work;unzip bert_movie_ch.zip;rm bert_movie_ch.zip") if os.path.exists("/home/ma-user/work/bert_movie_ch"): print('Download success') else: raise Exception('Download Failed')else: print("Project already exists")执行完成之后会出现Download success。1.3.2 安装所需要的python模块1.3.3 导包及超参设置导包import numpy as npimport randomimport torchimport matplotlib.pyplot as pltfrom torch.nn.utils import clip_grad_norm_from torch.utils.data import TensorDataset, DataLoader, RandomSampler, SequentialSamplerfrom transformers import BertTokenizer, BertForSequenceClassification, AdamWfrom transformers import get_linear_schedule_with_warmupimport warningswarnings.filterwarnings('ignore')切换路径# 进入项目路径%cd /home/ma-user/work/bert_movie_ch超参数设置# 超参数设置SEED = 123BATCH_SIZE = 16LEARNING_RATE = 2e-5WEIGHT_DECAY = 1e-2EPSILON = 1e-8random.seed(SEED)np.random.seed(SEED)torch.manual_seed(SEED)1.3.4 数据处理1.3.4.1 获取文本内容# 读取文件,返回文件内容def readfile(filename): with open(filename, encoding="utf-8") as f: content = f.readlines() return content# 正负情感语料pos_text = readfile('./data/pos.txt')neg_text = readfile('./data/neg.txt')sentences = pos_text + neg_textpos_textlen(pos_text)1.3.4.2 转换成数组长度# label encoderpos_targets = np.ones((len(pos_text))) # -->1neg_targets = np.zeros((len(neg_text))) # -->0targets = np.concatenate((pos_targets, neg_targets), axis=0).reshape(-1, 1) targets.shapepos_targetsneg_targets# 转换为tensortotal_targets = torch.tensor(targets)total_targets.shape1.3.4.3 加载模型进行分词# 从预训练模型中加载bert-base-chinese# [UNK] 特征 [CLS]起始 [SEP]结束tokenizer = BertTokenizer.from_pretrained('bert-base-chinese', cache_dir="./transformer_file/")tokenizerprint(pos_text[1])# 进行分词print(tokenizer.tokenize(pos_text[1]))# bert编码,会增加开始[CLS]--101 和 结束[SEP]--102标记print(tokenizer.encode(pos_text[1]))# 将bert编码转换为 字print(tokenizer.convert_ids_to_tokens(tokenizer.encode(pos_text[1])))tokenizer.encode("我")1.3.4.4 句子转数字进行编码#将每个句子转成数字(大于126做截断,小于126做PADDING,加上首尾两个标识,长度总共等于128)def convert_text_to_token(tokenizer, sentence, limit_size=126): tokens = tokenizer.encode(sentence[:limit_size]) # 直接截断 if len(tokens) < limit_size + 2: # 补齐(pad的索引号就是0) tokens.extend([0] * (limit_size + 2 - len(tokens))) return tokens# 对每个句子进行编码input_ids = [convert_text_to_token(tokenizer, x) for x in sentences]# 放到tensor中input_tokens = torch.tensor(input_ids)print(input_tokens.shape)input_tokens[1]1.3.4.5 建立mask# 建立maskdef attention_masks(input_ids): atten_masks = [] for seq in input_ids: # 如果有编码(>0)即为1, pad为0 seq_mask = [float(x>0) for x in seq] atten_masks.append(seq_mask) return atten_masks# 生成attention_masksatten_masks = attention_masks(input_ids)# 将atten_masks放到tensor中attention_tokens = torch.tensor(atten_masks)print(attention_tokens)print(attention_tokens.size())print('input_tokens:\n', input_tokens) # shape=[7360, 128]print('total_targets:\n', total_targets) # shape=[7360, 1]print('attention_tokens:\n', attention_tokens) # shape=[7360, 128]1.3.4.6 切分from sklearn.model_selection import train_test_split# 使用random_state固定切分方式,切分 train_inputs, train_labels, train_masks,train_inputs, test_inputs, train_labels, test_labels = train_test_split(input_tokens, total_targets, random_state=2022, test_size=0.2)train_masks, test_masks, _, _ = train_test_split(attention_tokens, input_tokens, random_state=2022, test_size=0.2)print(train_inputs.shape, test_inputs.shape) #torch.Size([8000, 128]) torch.Size([2000, 128])print(train_masks.shape, test_masks.shape) #torch.Size([8000, 128])和train_inputs形状一样print(train_inputs[0])print(train_masks[0])1.3.4.7 打包# 使用TensorDataset对tensor进行打包train_data = TensorDataset(train_inputs, train_masks, train_labels)# 无放回地随机采样样本元素train_sampler = RandomSampler(train_data)train_dataloader = DataLoader(train_data, sampler=train_sampler, batch_size=BATCH_SIZE)test_data = TensorDataset(test_inputs, test_masks, test_labels)test_sampler = SequentialSampler(test_data)test_dataloader = DataLoader(test_data, sampler=test_sampler, batch_size=BATCH_SIZE)# 查看dataloader内容for i, (train, mask, label) in enumerate(train_dataloader): #torch.Size([16, 128]) torch.Size([16, 128]) torch.Size([16, 1]) print(train) print(mask) print(label) print(train.shape, mask.shape, label.shape) breakprint('len(train_dataloader)=', len(train_dataloader)) #368# 二分类结果评估def binary_acc(preds, labels): #preds.shape=(16, 2) labels.shape=torch.Size([16, 1]) # eq里面的两个参数的shape=torch.Size([16]) correct = torch.eq(torch.max(preds, dim=1)[1], labels.flatten()).float() if 0: print('binary acc ********') print('preds = ', preds) print('labels = ', labels) print('correct = ', correct) acc = correct.sum().item() / len(correct) return accimport timeimport datetime# 时间格式化def format_time(elapsed): elapsed_rounded = int(round((elapsed))) return str(datetime.timedelta(seconds=elapsed_rounded)) #返回 hh:mm:ss 形式的时间1.3.5 训练和评估1.3.5.1 加载预训练模型# 加载预训练模型, num_labels表示2个分类,好评和差评model = BertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels = 2)# 使用GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")model.to(device)1.3.5.2 定义优化器# 定义优化器 AdamW, eps默认就为1e-8(增加分母的数值,用来提高数值稳定性)no_decay = ['bias', 'LayerNorm.weight']optimizer_grouped_parameters = [ {'params': [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], 'weight_decay': WEIGHT_DECAY}, {'params': [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], 'weight_decay': 0.0}]optimizer = AdamW(optimizer_grouped_parameters, lr = LEARNING_RATE, eps = EPSILON)epochs = 2 #迭代次数# training steps 的数量: [number of batches] x [number of epochs].total_steps = len(train_dataloader) * epochs# 设计 learning rate scheduler.scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps = 0, num_training_steps = total_steps)1.3.5.3 定义模型训练# 定义模型训练def train(model, optimizer): t0 = time.time() # 记录当前时刻 avg_loss, avg_acc = [],[] # 开启训练模式 model.train() for step, batch in enumerate(train_dataloader): # 每隔40个batch 输出一下所用时间. if step % 40 == 0 and not step == 0: elapsed = format_time(time.time() - t0) print(' Batch {:>5,} of {:>5,}. Elapsed: {:}.'.format(step, len(train_dataloader), elapsed)) # 从batch中取数据,并放到GPU中 b_input_ids, b_input_mask, b_labels = batch[0].long().to(device), batch[1].long().to(device), batch[2].long().to(device) output = model(b_input_ids, token_type_ids=None, attention_mask=b_input_mask, labels=b_labels) loss, logits = output[0], output[1] avg_loss.append(loss.item()) acc = binary_acc(logits, b_labels) avg_acc.append(acc) optimizer.zero_grad() loss.backward() clip_grad_norm_(model.parameters(), 1.0) optimizer.step() scheduler.step() avg_loss = np.array(avg_loss).mean() avg_acc = np.array(avg_acc).mean() return avg_loss, avg_acc1.3.5.4 训练 & 评估# 训练 & 评估for epoch in range(epochs): # 模型训练 train_loss, train_acc = train(model, optimizer) print('epoch={},train_acc={},loss={}'.format(epoch, train_acc, train_loss)) # 模型评估 test_acc = evaluate(model) print("epoch={},test_acc={}".format(epoch, test_acc))1.3.6 预测def predict(sen): # 将sen 转换为id input_id = convert_text_to_token(tokenizer, sen) # print(input_id) # 放到tensor中 input_token = torch.tensor(input_id).long().to(device) #torch.Size([128]) # 统计有id的部分,即为 1(mask),并且转换为float类型 atten_mask = [float(i>0) for i in input_id] # 将mask放到tensor中 attention_token = torch.tensor(atten_mask).long().to(device) #torch.Size([128]) # 转换格式 size= [1,128], torch.Size([128])->torch.Size([1, 128])否则会报错 attention_mask = attention_token.view(1, -1) output = model(input_token.view(1, -1), token_type_ids=None, attention_mask=attention_mask) return torch.max(output[0], dim=1)[1]label = predict('掏钱看这部电影,才是真正被杀猪盘了。。。')print('好评' if label==1 else '差评')label = predict('我觉得挺不错的。在中国看来算是最好的科幻大片了.毕竟国产。支持一下!')print('好评' if label==1 else '差评')label = predict('但是影片制作“略显”粗糙。包括但不限于演员演技拉胯,剧情尴尬,情节设计不合理。期待值最高的王千源完全像没睡醒,全片无论扮演什么身份或处于什么场景,表情就没变过。身体力行的告诉了我们,演员最重要不是演什么像什么,而是演什么就换什么衣服。除了人物身份的切换是靠换衣服外和张光北演对手戏完全就像是在看着提词器念台词,俩下对比尴尬到都能扣出个三室一厅。女配“陈茜”和“刘美美”一个没看到“孤身入虎穴”的作用在哪里,一个则是完全没必要出现。随着故事的递进加情节设计的不合理导致整片完全垮掉。或者你把俩女配的情节递进处理好了也行,但是很显然,导演完全不具备这种能力。不仅宏观叙事的能力差,主题把控的能力也欠缺。看似这个电影是宣传反诈,实则是披着反诈的外衣,上演了正派和反派间弱智般的“强强”对决。就以反诈题材来说做的都不如b站up主录制的几分缅北诈骗集团的小视频更有警示意义。我们搞反诈宣传的目的不就是为了避免群众上当受骗,同时告诉大家警惕国外高薪工作,不去从事诈骗活动吗?当然我要吐槽的包括但不限于以上这些,麻烦各位导演在拍偏主旋律电影的时候不要用类似于本片抓捕大boos时说的:“现在中国太强大了,怎么怎么地类似的台词了,把这份荣誉留给吴京吧!最后,本片唯一的亮点就是王迅和前三分之一节奏感还不错。哎,特价买的票以为我赚了,没想到是我被“杀猪盘了”。')print('好评' if label==1 else '差评')转载原文链接:【云驻共创】华为云AI之《情感专家》在线分析影评情感基调_云汉ai顾问 情感板块-CSDN博客
  • [AI Gallery] 个人是否可以上传modelarts开发环境镜像到ai Gallery?
    在modelarts里创建notebook时,可以到ai gallery里取市场里选择镜像,但是好像都是官方提供的?都是官方镜像吧:那么我的问题是,个人创建的镜像,是否能够传到ai gallery供他人使用呢?目前看到的好像是不可以?因为自定义的镜像没有发现有分享到 ai gallery的功能。
  • [其他] AI Gallery换域名了
    有一段时间没有逛ai gallery了,最近看到一个大模型的活动,又去看了一下。发现变化挺大的。而且,域名也换了,是pangu开头的,这也许预示着,ai gallery会将大模型作为一个新的方向,并且这个方向会是一个主要的方向。
  • [AI Gallery] 如何将自己训练好的模型分享到AI Gallery上?
    如何将自己训练好的模型分享到AI Gallery上?
  • [AI Gallery] 如何将自己开发的算法分享到AI Gallery中?
    如何将自己开发的算法分享到AI Gallery中?
  • [AI Gallery] AI HUB里已有的Resnet50算法,跑290epoch时报模型存储路径错误
    跑290epoch时报模型存储路径错误,前面都正常
  • 资讯|盘古大模型,跑在铁路上
    “双节”货物运输繁忙如何保证货运列车始终“在状态”那就不得不提这一双双“火眼金睛”啦想象一下依靠强大的AI科技一列货运列车的上万个零部件十几分钟内便可完成检查这个超厉害的“AI检车”系统是国铁集团郑州北车辆段使用的经华为云盘古大模型“AI训练”后的TFDS系统2022年12月,“AI检车”系统正式投入试用。该段对处于京广铁路、陇海铁路、京九铁路等干线位置的6个TFDS探测站进行了升级,采取“AI检车”作业,同时对“AI检车”识别预警的故障进行人工复核。相较于人工检车,通过“AI检车”结合人工复核的方式:作业时长由平均17分钟减少至14分钟;作业人数由4-5人减少至2-3人;故障识别准确率由98.26%提高至99.89%。经过10个月的试用“AI检车”系统实现了以铁路货车拦停重点故障为主的400+余种故障的智能识别已大大优于人工作业效率更高、可靠性更强,当前已逐步推广到全国多个路局试用。这个“AI检车”系统究竟啥来头?这套系统叫TFDS,即货车故障轨边图像检测系统。一列货车只要从探测站通过,电子眼就会高速拍摄、动态采集车底配件和车体侧部状态等4800余张图像,实时传输到动态检车室。传统的TFDS系统,需要动态检车员及时分析每一张图片,发现车辆故障隐患,并将故障部位图片反馈至一线检车员。“AI训练”后的TFDS系统,能够利用“AI”技术,实时分析采集的图像,自动识别各种不同类型的铁路货车故障。为啥要对郑州北车辆段的TFDS进行“AI”升级?这里“太忙”该段管内京广线、陇海线、京九线货物运输任务繁忙,5T检测车间的80个检测工位,每天要完成4万多辆货车、280多万张图片的检查任务。重要课题落户2021年,国铁集团货车事业部把TFDS故障图像智能识别项目作为国铁集团第一批科研计划“揭榜挂帅”课题,指定郑州局集团公司郑州北车辆段5T检测车间作为该项目的试点单位,和华为公司、慧铁科技公司共同研究、联手推进TFDS故障图像智能识别项目。自此,“AI检车”系统升级试点“花落”郑州北车辆段。“AI训练”后TFDS系统有多厉害?专家博士联合推进为保证研发进度和效果,该段5T检测车间组建经验丰富的“专家”团队,结合近年典型故障案例,从故障分类、判断方式等方面提供数据,从而提升算法精准度、降低误报率。算法模型世界领先对TFDS系统进行“AI训练”,采用的是目前业界最大的视觉预训练模型华为云盘古CV大模型,其训练、推理速度均处于世界领先水平。同时,这套基于盘古大模型的“AI检车”系统根据大量的数据样本,自动总结部件特征,自动寻找故障规律,并在实际试用中持续改善分析效果,实现从整体到局部、再到故障细节特征的逐步精细识别。TFDS检测遇到的另一个问题是故障样本稀缺。随着我国铁路安全水平的不断提升,很多故障已经极少发生,多数人都没有见过,但是这样的故障一旦发生通常都是大故障。对AI模型来讲,小样本无样本也会制约模型精度提升。郑州北站在段修车间模拟制造了大量的故障样本的同时,华为云基于小样本学习技术和样本生成技术,生成了大量的训练样本提升模型质量。比如摇枕心盘脱出的故障,全国范围内只找到一张故障样本,但是通过小样本学习,目前已经能正确识别这个故障。近年来铁路部门不断加大科技投入力度这些新设备、新技术的投用已经重塑了现场职工的作业模式期待未来有更多的科技手段应用到铁路运输生产各环节转自华为云公众号
  • 提高模型性能的有效方法笔记
    领域微调是一种通过使用少量特定用例的增量数据对基础模型进行进一步训练的方法,以改变其神经网络中的参数权重。它适用于任务或领域定义明确且具有足够标记数据的场景,比如风格微调。目前,常用的领域微调方法包括Freeze、P-tuning和LoRA。在领域微调中,Freeze是一种常见的方法。它的核心思想是固定基础模型的一部分参数,只对特定任务的相关参数进行微调。通过冻结一部分参数,可以保留基础模型在通用任务上的学习能力,同时针对特定任务进行有针对性的微调,以提高模型在该领域中的性能。另一种常见的微调方法是P-tuning。P-tuning通过引入一个专门的控制参数来控制基础模型的学习能力。这个控制参数可以根据特定任务的需求进行调整,从而实现对基础模型的微调。P-tuning的优势在于可以根据具体任务的特点和要求进行灵活的调整,提高模型在特定领域中的表现。LoRA是一种基于语言重要性的领域微调方法。它通过对不同领域的语言重要性进行建模,对基础模型进行微调。具体而言,LoRA通过引入一个领域相关的语言权重参数,来调整基础模型对不同领域中不同语言的重视程度。这样,模型可以更好地适应不同领域的语言特点,提高在特定领域的性能。领域微调的应用非常广泛。在自然语言处理领域,领域微调可以用于情感分析、命名实体识别、机器翻译等任务,通过微调模型,使其更好地适应特定领域的语言特点和任务需求。在计算机视觉领域,领域微调可以用于目标检测、图像分类等任务,通过微调模型,提高在特定领域中的准确性和鲁棒性。然而,领域微调也面临一些挑战。首先,微调需要有足够的标记数据来进行训练,但在某些领域中,获取大量标记数据可能是困难的。其次,微调可能导致过拟合问题,即模型在特定领域中表现良好,但在其他领域中性能下降。因此,如何在微调过程中平衡模型的泛化能力和领域特定性能是一个重要的问题。
  • 有效的数据增强方法以改善模型的泛化能力
    1数据增强数据增强是一种通过对训练数据进行一系列变换来扩增数据集的方法。数据增强可以有效地提高模型的泛化性能,因为它可以帮助模型更好地学习数据的不变性和鲁棒性。例如,在图像分类任务中,可以通过旋转、平移、缩放等方式对图像进行变换,从而增加数据集的多样性,提高模型的泛化性能。2正则化正则化是一种在损失函数中引入额外项的方法,用于惩罚模型的复杂度。正则化可以约束模型的参数,从而避免模型在训练过程中过拟合。过拟合是指模型在训练数据上表现很好,但在新的测试数据上表现较差的现象。常见的正则化方法包括L1正则化、L2正则化和Dropout等。3模型集成模型集成是一种将多个模型的预测结果进行融合的方法。模型集成可以帮助消除单个模型的缺点,并提高模型的泛化性能。常见的模型集成方法包括Bagging、Boosting和Stacking等。Bagging和Boosting是两种集成方法,它们通过对训练数据进行不同的采样和加权来训练多个模型,并将它们的预测结果进行平均或加权融合。Stacking是一种更加复杂的集成方法,它将多个模型的预测结果作为输入,并使用另一个模型来预测最终的输出。4领域自适应领域自适应是一种将已有的模型应用到新的领域中的方法。在新的领域中,训练数据往往不足或分布不同,因此在这种情况下,直接使用已有的模型可能会导致泛化性能下降。领域自适应方法可以通过在已有模型中引入领域自适应机制,来适应新的领域数据。例如,在自然语言处理中,可以使用基于预训练语言模型的领域自适应方法。5对抗训练对抗训练是一种将对抗性样本引入训练数据中的方法,用于提高模型的鲁棒性。对抗性样本是指经过有意制造的变化,使得模型在处理该样本时出错的样本。对抗训练可以通过训练模型在对抗性样本上的鲁棒性,来提高模型的泛化性能。例如,在图像分类任务中,可以通过添加噪声或扰动来生成对抗性样本。
  • 模型优化以减少内存和计算资源的笔记分享
    机器学习模型在许多应用场景中发挥着重要作用,但是模型的存储和计算资源消耗往往是带来挑战的关键因素。为了提高模型的性能和效率,在模型设计和优化过程中需要重点考虑如何减少存储和计算资源的消耗。①模型压缩和精简②模型结构优化③模型量化和加速④基于剪枝的可由实施算法一、模型压缩和精简模型压缩是一种减少存储资源消耗的重要技术。通过压缩模型的参数、权重和结构,可以减小模型的存储空间。常见的模型压缩方法包括剪枝、量化和低秩分解。剪枝是指通过减少模型中不重要的连接权重来降低模型的复杂度。量化是指将模型中的参数从高精度表示转换为低精度表示,以减小存储需求。而低秩分解则是将模型的权重矩阵分解为低秩近似矩阵,以减少存储和计算开销。二、模型结构优化模型结构优化是进一步减少计算资源消耗的关键步骤。通过精心设计模型的结构,可以降低计算复杂度和存储需求。常见的模型结构优化方法包括卷积操作优化、网络剪枝和特征选择。卷积操作优化是指通过引入空洞卷积、深度可分离卷积等技术,减少卷积操作的计算量和存储需求。网络剪枝是指通过去除低重要性的通道和层来减小网络的尺寸和计算复杂度。而特征选择则是在模型训练过程中,选择对任务有重要影响的特征,舍弃冗余信息,减小存储和计算开销。三、模型量化和加速除了以上提到的方法外,模型量化和加速也是减少计算资源消耗的重要手段。通过对模型进行量化,将模型参数从浮点表示转换为定点表示,可以降低计算的复杂度和存储需求。此外,使用专门的硬件加速器例如GPU、TPU等可以提供更高的计算能力,加速模型的推理过程。另外,将模型部署到分布式计算环境中,可以通过并行计算来提高计算效率。四、基于剪枝的可由实施算法剪枝是一种有效的模型优化技术,可以减小模型的计算和存储开销。此外,通过剪枝可以提升模型的泛化能力和鲁棒性。基于剪枝的可由实施算法包括层级剪枝算法、通道剪枝算法和权重剪枝算法。层级剪枝算法是指通过移除整个层或通道来减小模型的计算量和存储需求。通道剪枝算法是指通过剔除某些通道来减少计算复杂度,而权重剪枝算法是指通过移除模型中小于某个阈值的权重来简化和优化模型。总结起来,优化机器学习模型的存储和计算资源消耗是一个复杂而关键的任务。通过模型压缩和精简、模型结构优化、模型量化和加速以及基于剪枝的可由实施算法等方法和技术,可以减少存储和计算开销,提高模型的性能和效率。这些优化措施可以在不降低模型准确性的情况下,提供快速高效的机器学习应用。随着技术的不断发展,更多创新方法和工具将进一步推动机器学习模型的存储和计算资源消耗的优化。
  • [问题求助] 关于AI Gallery平台成长值兑换平台专项算力资源的活动什么时候上线啊?
    2023年AI Gallery不同等级开发者权益及细则技术等级的不断升级,除了可以解锁对应的权益外,还能获得额外的成长值奖励。您可以使用成长值兑换AI GalleryAI课程,兑换AI Gallery平台专项算力资源,也可以兑换礼品(兑换专区请待上线)。
总条数:71 到第
上滑加载中