***************************************************

码字不易,收藏之余,别忘了给我点个赞吧!

***************************************************

---------Start

使用华为云MindSpore框架实现目标分类___实验报告(二)

华为云MindSpore框架是深度学习和机器学习过程中常用的框架之一,使用过程同Tensorflow,pytorch等框架技术类似,详细使用过程可参考官方API

实验介绍

本实验基于卷积神经网络实现五类花的识别,与传统图像分类方法不同,卷积神经网络无需人工提取特征,可以根据输入图像,自动学习包含丰富语义信息的特征,实验内容为搭建分类神经网络,实现网络的训练和预测过程。

实验环境

  • Pycharm工具
  • MindSpore1.2.1-CPU
  • numpy,matiplotlib

数据集介绍

链接:百度云
提取码:xxmy
该数据集包括5类花的图像数据,每个文件夹名代表一类花名,文件夹中包括该类花的图像信息。分别是 daisy(雏菊,633 张),dandelion(蒲公英,898 张),roses(玫瑰,641 张),sunflowers(向日葵,699 张),tulips(郁金香,799 张)总共 3670 张图像。

例:daisy雏菊

实验过程

  1. 加载数据集
  2. 定义网络结构
  3. 设置优化器,损失函数和回调函数
  4. 执行训练
  5. 验证集预测
  6. 单张图像预测

核心代码

配置训练过程参数
#配置参数
cfg = EasyDict({'data_path':r'H:/dataset/flower_data/flower_photos/',#数据集路径'data_size':3670,#数据总量(张)'image_width':100,#图像宽'image_height':100,#图像高'batch_size':32,#每个batch的大小'channel':3,#输入图像通道数'num_class':5,#数据集类别数'weight_decay':0.01,#权重衰减'lr':0.001,#学习率'dropout_ratio': 0.5,#dropout比率'epoch_size': 1,  # 训练次数'sigma': 0.01,#权重初始化参数'save_checkpoint_steps': 1,  # 多少步保存一次模型'keep_checkpoint_max': 1,  # 最多保存多少个模型'output_directory': './',  # 保存模型路径'output_prefix': "checkpoint_classification"  # 保存模型文件名字
})
加载数据集(载入、裁剪、维度变换,类型转换、打乱、切分、打包)
de_dataset = ds.ImageFolderDataset(dataset_dir=cfg.data_path,class_indexing={'daisy':0,'dandelion':1,'roses':2,'sunflowers':3,'tulips':4})
#裁剪输入图像为统一大小
transform_img = CV.RandomCropDecodeResize(size=[cfg.image_width,cfg.image_height])
#图像形状调整(H,W,C)->(C,H,W)
hwc2chw_op = CV.HWC2CHW()
#类型调整
type_cast_op = C.TypeCast(mstype.float32)
#将操作应用在数据集上
de_dataset = de_dataset.map(input_columns='image',num_parallel_workers=3,operations=transform_img)
de_dataset = de_dataset.map(input_columns='image',num_parallel_workers=3,operations=hwc2chw_op)
de_dataset = de_dataset.map(input_columns='image',num_parallel_workers=3,operations=type_cast_op)
#打乱数据
de_dataset = de_dataset.shuffle(buffer_size=cfg.data_size)
#数据集划分为训练集和验证集(9:1)
(de_train,de_test) = de_dataset.split([0.9,0.1])
print("训练集(张):"+str(de_train.count))
print("验证集(张):"+str(de_test.count))
#数据集按照batch_size大小打包
de_train = de_train.batch(batch_size=cfg.batch_size,drop_remainder=True)
de_test = de_test.batch(batch_size=cfg.batch_size,drop_remainder=True)
定义神经网络结构
#定义神经网络结构
print('---------------定义网络结构-------------')
class Our_Net(nn.Cell):def __init__(self,num_class=5,channel=3,dropout_ratio=0.5,init_sigma=0.01):super(Our_Net,self).__init__()self.num_class = num_classself.channel = channelself.dropout_ratio = dropout_ratio#(3*5*5+1)*32=2432self.conv1 = nn.Conv2d(in_channels=self.channel,out_channels=32,kernel_size=5,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))self.relu = nn.ReLU()self.max_pool = nn.MaxPool2d(kernel_size=2,stride=2,pad_mode='valid')#(32*5*5+1)*64=51264self.conv2 = nn.Conv2d(in_channels=32,out_channels=64,kernel_size=5,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))#(64*3*3+1)*128=73856self.conv3 = nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))#(128*3*3+1)*128=147584self.conv4 = nn.Conv2d(in_channels=128,out_channels=128,kernel_size=3,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))self.flatten = nn.Flatten()self.fc1 = nn.Dense(6*6*128,1024,weight_init= TruncatedNormal(sigma=init_sigma),bias_init=0.1)#471,9616self.dropout = nn.Dropout(self.dropout_ratio)#52,4800self.fc2 = nn.Dense(1024,512,weight_init= TruncatedNormal(sigma=init_sigma),bias_init=0.1)#2565self.fc3 = nn.Dense(512,self.num_class,weight_init= TruncatedNormal(sigma=init_sigma),bias_init=0.1)def construct(self,x):x = self.conv1(x) #100*100*32x = self.relu(x)x = self.max_pool(x) #50*50*32x = self.conv2(x)  # 50*50*64x = self.relu(x)x = self.max_pool(x)  # 25*25*64x = self.conv3(x) #25*25*128x = self.max_pool(x) #12*12*128x = self.conv4(x) #12*12*128x = self.max_pool(x) #6*6*128x = self.flatten(x)x = self.fc1(x)x = self.relu(x)x = self.dropout(x)x = self.fc2(x)x = self.relu(x)x = self.dropout(x)x = self.fc3(x)return  x
net = Our_Net(num_class=cfg.num_class,channel=cfg.channel,dropout_ratio=cfg.dropout_ratio,init_sigma=cfg.sigma)
实例化网络结构
#定义损失函数
loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True,reduction="mean")
#定义优化器(待更新的参数,学习率,权重衰减)
net_opt = nn.Adam(params=net.trainable_params(), learning_rate=cfg.lr, weight_decay=0.0)
#实例化模型对象(网络结构,损失函数,优化器,评价指标)
model = Model(network=net,loss_fn=loss,optimizer=net_opt,metrics={"acc"})
计算验证集准确率的回调函数
#回调计算验证集准确率,继承Callback类。
class valAccCallback(Callback):'''网络完成一个batch训练后的回调(自定义)'''def __init__(self, net, eval_data):self.net = netself.eval_data = eval_datadef step_end(self, run_context):metric = self.net.eval(self.eval_data)print('验证集准确率:',metric)
#实例化回调对象
valAcc_cb = valAccCallback(model,de_test)
配置模型权重输出
#实例化loss记录对象
loss_cb = LossMonitor(per_print_times=1)
#实例化权重配置对象
config_ck = CheckpointConfig(save_checkpoint_steps=cfg.save_checkpoint_steps,keep_checkpoint_max=cfg.keep_checkpoint_max)
#实例化权重对象对象
ckpoint_cb = ModelCheckpoint(prefix=cfg.output_prefix, directory=cfg.output_directory, config=config_ck)
开始训练
print('---------------开始训练-------------')
model.train(cfg.epoch_size, de_train, callbacks=[loss_cb, ckpoint_cb,valAcc_cb], dataset_sink_mode=False)
print('---------------训练结束-------------')
训练结束,计算验证集准确率。
# 使用验证集评估模型,打印总体准确率
metric = model.eval(de_test)
print(metric)

训练代码

只需要修改数据集对应的路径,单击鼠标右键run即可运行。

# -*- coding: utf-8 -*-
# @Time    : 2021-10-25 17:04
# @Author  : Anle
# @FileName: pro_2.py.py
# @Software: PyCharm
# @Email :2212086365@qq.com
import mindspore
import numpy as np
from easydict import EasyDict
import mindspore.dataset as ds
import mindspore.dataset.vision.c_transforms as CV#数据增强模块
import mindspore.dataset.transforms.c_transforms as C
from mindspore.common import dtype as mstype
from mindspore.common.initializer import TruncatedNormal
from mindspore import nn
from mindspore.train import Model
from mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor, TimeMonitor, Callback#配置参数
cfg = EasyDict({'data_path':r'H:/dataset/flower_data/flower_photos/',#数据集路径'data_size':3670,#数据总量(张)'image_width':100,#图像宽'image_height':100,#图像高'batch_size':32,#每个batch的大小'channel':3,输入图像的通道数'num_class':5,#网预测的类别数'weight_decay':0.01,#权重衰减'lr':0.001,#学习率'dropout_ratio': 0.5,#dropout比率'epoch_size': 1,  # 训练次数'sigma': 0.01,#权重初始化参数'save_checkpoint_steps': 1,  # 多少步保存一次模型'keep_checkpoint_max': 1,  # 最多保存多少个模型'output_directory': './',  # 保存模型路径'output_prefix': "checkpoint_classification"  # 保存模型文件名字
})print("--------------数据集读入--------------")
#按文件夹读入数据,并将文件夹名字映射成类别号
de_dataset = ds.ImageFolderDataset(dataset_dir=cfg.data_path,class_indexing={'daisy':0,'dandelion':1,'roses':2,'sunflowers':3,'tulips':4})
#裁剪输入图像为统一大小
transform_img = CV.RandomCropDecodeResize(size=[cfg.image_width,cfg.image_height])
#图像形状调整(H,W,C)->(C,H,W)
hwc2chw_op = CV.HWC2CHW()
#类型调整
type_cast_op = C.TypeCast(mstype.float32)
#将操作应用在数据集上
de_dataset = de_dataset.map(input_columns='image',num_parallel_workers=3,operations=transform_img)
de_dataset = de_dataset.map(input_columns='image',num_parallel_workers=3,operations=hwc2chw_op)
de_dataset = de_dataset.map(input_columns='image',num_parallel_workers=3,operations=type_cast_op)
#打乱数据
de_dataset = de_dataset.shuffle(buffer_size=cfg.data_size)
#数据集划分为训练集和验证集(9:1)
(de_train,de_test) = de_dataset.split([0.9,0.1])
print("训练集(张):"+str(de_train.count))
print("验证集(张):"+str(de_test.count))
#数据集按照batch_size大小打包
de_train = de_train.batch(batch_size=cfg.batch_size,drop_remainder=True)
de_test = de_test.batch(batch_size=cfg.batch_size,drop_remainder=True)#定义神经网络结构
print('---------------定义网络结构-------------')
class Our_Net(nn.Cell):def __init__(self,num_class=5,channel=3,dropout_ratio=0.5,init_sigma=0.01):super(Our_Net,self).__init__()self.num_class = num_classself.channel = channelself.dropout_ratio = dropout_ratio#(3*5*5+1)*32=2432self.conv1 = nn.Conv2d(in_channels=self.channel,out_channels=32,kernel_size=5,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))self.relu = nn.ReLU()self.max_pool = nn.MaxPool2d(kernel_size=2,stride=2,pad_mode='valid')#(32*5*5+1)*64=51264self.conv2 = nn.Conv2d(in_channels=32,out_channels=64,kernel_size=5,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))#(64*3*3+1)*128=73856self.conv3 = nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))#(128*3*3+1)*128=147584self.conv4 = nn.Conv2d(in_channels=128,out_channels=128,kernel_size=3,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))self.flatten = nn.Flatten()self.fc1 = nn.Dense(6*6*128,1024,weight_init= TruncatedNormal(sigma=init_sigma),bias_init=0.1)#471,9616self.dropout = nn.Dropout(self.dropout_ratio)#52,4800self.fc2 = nn.Dense(1024,512,weight_init= TruncatedNormal(sigma=init_sigma),bias_init=0.1)#2565self.fc3 = nn.Dense(512,self.num_class,weight_init= TruncatedNormal(sigma=init_sigma),bias_init=0.1)def construct(self,x):x = self.conv1(x) #100*100*32x = self.relu(x)x = self.max_pool(x) #50*50*32x = self.conv2(x)  # 50*50*64x = self.relu(x)x = self.max_pool(x)  # 25*25*64x = self.conv3(x) #25*25*128x = self.max_pool(x) #12*12*128x = self.conv4(x) #12*12*128x = self.max_pool(x) #6*6*128x = self.flatten(x)x = self.fc1(x)x = self.relu(x)x = self.dropout(x)x = self.fc2(x)x = self.relu(x)x = self.dropout(x)x = self.fc3(x)return  x
net = Our_Net(num_class=cfg.num_class,channel=cfg.channel,dropout_ratio=cfg.dropout_ratio,init_sigma=cfg.sigma)
#计算网络结构的总参数量
total_params = 0
for param in net.trainable_params():total_params += np.prod(param.shape)
print('参数量:',total_params)
#定义损失函数
loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True,reduction="mean")
#定义优化器(待更新的参数,学习率,权重衰减)
net_opt = nn.Adam(params=net.trainable_params(), learning_rate=cfg.lr, weight_decay=0.0)
#实例化模型对象(网络结构,损失函数,优化器,评价指标)
model = Model(network=net,loss_fn=loss,optimizer=net_opt,metrics={"acc"})#回调计算验证集准确率,继承Callback类。
class valAccCallback(Callback):'''网络完成一个batch训练后的回调(自定义)'''def __init__(self, net, eval_data):self.net = netself.eval_data = eval_datadef step_end(self, run_context):metric = self.net.eval(self.eval_data)print('验证集准确率:',metric)
#实例化回调对象
valAcc_cb = valAccCallback(model,de_test)
#实例化loss记录对象
loss_cb = LossMonitor(per_print_times=1)
#实例化权重配置对象
config_ck = CheckpointConfig(save_checkpoint_steps=cfg.save_checkpoint_steps,keep_checkpoint_max=cfg.keep_checkpoint_max)
#实例化权重对象对象
ckpoint_cb = ModelCheckpoint(prefix=cfg.output_prefix, directory=cfg.output_directory, config=config_ck)print('---------------开始训练-------------')
model.train(cfg.epoch_size, de_train, callbacks=[loss_cb, ckpoint_cb,valAcc_cb], dataset_sink_mode=False)
print('---------------训练结束-------------')
# 使用验证集评估模型,打印总体准确率
metric = model.eval(de_test)
print(metric)
加载单张图像,并调整至网络输入需要的格式。
   img_path = input('Enter Path:')try:#读取图像img = Image.open(fp=img_path)#调整大小temp = img.resize((100, 100))#转换成numpy格式temp = np.array(temp)#将HWC格式转化成CHW格式temp = temp.transpose(2, 0, 1)#增加一个batch维度temp = np.expand_dims(temp, 0)#将图像转成向量img_tensor = Tensor(temp, dtype=mindspore.float32)
加载网络权重,实例化网络模型

权重文件是华为云ModelArts上训练任务完成后自动生成的,下载到本地即可使用。

 #权重路径CKPT = os.path.join('./checkpoint_classification-200_104.ckpt')#实例化网络结构net = Our_Net(num_class=cfg.num_class,channel=cfg.channel,dropout_ratio=cfg.dropout_ratio)#网络加载权重load_checkpoint(CKPT, net=net)#实例化模型model = Model(net)
预测图像类别,输出结果。
 #五类花分别对应的标签值class_names = {0: 'daisy', 1: 'dandelion', 2: 'roses', 3: 'sunflowers', 4: 'tulips'}#网络预测predictions = model.predict(img_tensor)#将预测结果转成numpy格式predictions = predictions.asnumpy()#获取预测结果最大值所对应的索引,根据索引获取类别名称label = class_names[np.argmax(predictions)]#展示预测结果plt.title("预测结果:{}".format(label))#展示图像信息plt.imshow(np.array(img))plt.show()

预测全部代码

单键鼠标右键点击run即可执行该文件。

# -*- coding: utf-8 -*-
# @Time    : 2021-11-13 14:30
# @Author  : Anle
# @FileName: pro_2_predict.py
# @Software: PyCharm
# @Email :2212086365@qq.com
import os
import tracebackimport matplotlib.pyplot as plt
import mindspore
from easydict import EasyDict
import numpy as np
from mindspore.common.initializer import TruncatedNormal
from mindspore import nn, load_checkpoint, Model
from PIL import Image
from mindspore import context, Tensor
plt.rcParams['font.sans-serif'] = ['SimHei']#显示中文处理
plt.rcParams['axes.unicode_minus'] = False
#配置参数
cfg = EasyDict({'data_path':'H:/dataset/flower_data/flower_photos/','data_size':3670,#数据量'image_width':100,#宽'image_height':100,#高'batch_size':32,'channel':3,#通道'num_class':5,#类别数'weight_decay':0.01,#权重衰减'lr':0.0001,#学习率'dropout_ratio': 0.5,'epoch_size': 1,  # 训练次数'sigma': 0.01,'save_checkpoint_steps': 1,  # 多少步保存一次模型'keep_checkpoint_max': 1,  # 最多保存多少个模型'output_directory': './',  # 保存模型路径'output_prefix': "checkpoint_classification"  # 保存模型文件名字})#定义神经网络结构
class Our_Net(nn.Cell):def __init__(self,num_class=5,channel=3,dropout_ratio=0.5,init_sigma=0.01):super(Our_Net,self).__init__()self.num_class = num_classself.channel = channelself.dropout_ratio = dropout_ratio#(3*5*5+1)*32=2432self.conv1 = nn.Conv2d(in_channels=self.channel,out_channels=32,kernel_size=5,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))self.relu = nn.ReLU()self.max_pool = nn.MaxPool2d(kernel_size=2,stride=2,pad_mode='valid')#(32*5*5+1)*64=51264self.conv2 = nn.Conv2d(in_channels=32,out_channels=64,kernel_size=5,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))#(64*3*3+1)*128=73856self.conv3 = nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))#(128*3*3+1)*128=147584self.conv4 = nn.Conv2d(in_channels=128,out_channels=128,kernel_size=3,stride=1,padding=0,has_bias=True,pad_mode='same',bias_init='zeros',weight_init= TruncatedNormal(sigma=init_sigma))self.flatten = nn.Flatten()self.fc1 = nn.Dense(6*6*128,1024,weight_init= TruncatedNormal(sigma=init_sigma),bias_init=0.1)#471,9616self.dropout = nn.Dropout(self.dropout_ratio)#52,4800self.fc2 = nn.Dense(1024,512,weight_init= TruncatedNormal(sigma=init_sigma),bias_init=0.1)#2565self.fc3 = nn.Dense(512,self.num_class,weight_init= TruncatedNormal(sigma=init_sigma),bias_init=0.1)def construct(self,x):x = self.conv1(x) #100*100*32x = self.relu(x)x = self.max_pool(x) #50*50*32x = self.conv2(x)  # 50*50*64x = self.relu(x)x = self.max_pool(x)  # 25*25*64x = self.conv3(x) #25*25*128x = self.max_pool(x) #12*12*128x = self.conv4(x) #12*12*128x = self.max_pool(x) #6*6*128x = self.flatten(x)x = self.fc1(x)x = self.relu(x)x = self.dropout(x)x = self.fc2(x)x = self.relu(x)x = self.dropout(x)x = self.fc3(x)return  xwhile(True):img_path = input('Enter Path:')try:#读取图像img = Image.open(fp=img_path)#调整大小temp = img.resize((100, 100))#转换成numpy格式temp = np.array(temp)#将HWC格式转化成CHW格式temp = temp.transpose(2, 0, 1)#增加一个batch维度temp = np.expand_dims(temp, 0)#将图像转成向量img_tensor = Tensor(temp, dtype=mindspore.float32)#权重路径CKPT = os.path.join('./checkpoint_classification-200_104.ckpt')#实例化网络结构net = Our_Net(num_class=cfg.num_class,channel=cfg.channel,dropout_ratio=cfg.dropout_ratio)#网络加载权重load_checkpoint(CKPT, net=net)#实例化模型model = Model(net)#五类花分别对应的标签值class_names = {0: 'daisy', 1: 'dandelion', 2: 'roses', 3: 'sunflowers', 4: 'tulips'}#网络预测predictions = model.predict(img_tensor)#将预测结果转成numpy格式predictions = predictions.asnumpy()#获取预测结果最大值所对应的索引,根据索引获取类别名称label = class_names[np.argmax(predictions)]#展示预测结果plt.title("预测结果:{}".format(label))#展示图像信息plt.imshow(np.array(img))plt.show()except:traceback.print_exc()print("路径有误,请重新输入!")

【使用华为云MindSpore框架实现目标分类___实验报告(二)】相关推荐

  1. 【使用华为云MindSpore框架实现线性函数拟合___实验报告(一)】

    *************************************************** 码字不易,收藏之余,别忘了给我点个赞吧! *************************** ...

  2. 基于华为云 IOT 设计智能称重系统 (STM32)【二】结尾有资料

    3.5 主题订阅与发布 通过 MQTT 客户端软件模拟上报测试: 查看控制台页面,数据已经上传成功了. 3.6 应用侧开发 为了更方便的展示设备数据,与设备完成交互,还需要开发一个配套的上位机,官方提 ...

  3. 微信小程序连接华为云ModelArts的方法以及一些小坑(二)

    首先打开ModelArts的部署上线-在线服务查看项目接口API, 这里的输入参数就是微信小程序请求中要传递的参数,这里类型为file,传输时是MIME/MULTIPART-FORM-DATA类型,微 ...

  4. 华为云服务产品之精华问题大集烩(二)

    播报播报,继续继续 华为虚拟私有云(VPC) 虚拟私有云(Virtual Private Cloud)是基于华为企业云构建隔离的.用户自主配置和管理的虚拟网络环境,提升用户公有云中的资源的安全性,简化 ...

  5. 华为云中文预训练模型发布:全球最大、千亿参数,逼近人类神经元

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 还是熟悉的华为开发者大会 (HDC),还是熟悉的余承东. 也还是一贯地擅长宣布"世界第一": 业界首个千亿级生成与理解中 ...

  6. 解密华为云原生媒体网络如何保障实时音视频服务质量

    随着5G和AI的发展,内容表达视频化成为了当今的主流,很多行业对视频分发有非常旺盛的需求.我们非常荣幸地请到了华为云的资深视频架构师黄挺,为大家介绍基于互联网的实时音视频服务所面临的挑战,分享华为云原 ...

  7. 保障实时音视频服务体验,华为云原生媒体网络有7大秘籍

    摘要:如何保障实时音视频服务体验的实践?我们为什么需要一张媒体网络?我们如何改善实时音视频体验方面的实践? 本文分享自华为云社区<解密华为云原生媒体网络如何保障实时音视频服务质量>,原文作 ...

  8. 向云计算要技术红利,华为云定义云原生2.0时代

    进入2020年以来,以容器.Kubernetes和微服务为代表的云原生技术,开始颠覆业界对从2006年开始的云计算技术和产业的认知.在2019年的时候,业界还对云原生技术处于热议阶段,主流厂商纷纷推出 ...

  9. 华为云发布三大生态举措,携手伙伴及开发者共创新价值

    摘要:2022年是华为云与开发者.伙伴共同加速成长的一年.目前,华为云生态已聚合了全球超过350万开发者,相比去年同期增长1.3倍:汇聚41000多家合作伙伴,相比去年增长1.4倍:越来越多的开发者和 ...

最新文章

  1. [How TO]-堡垒机快捷登陆SSH服务器-expect自动输密码
  2. centos7 安装教程 图文流程安装后包含界面
  3. Java黑皮书课后题第7章:*7.30(模式识别:四个连续相等的数)编写下面的方法,测试某数组是否有四个连续相同值的数。编写测试程序,提示用户输入一个整数列表,调用方法看是否有4个连续且相等的数
  4. Circle HDU - 6550 (数学)
  5. hibernate级联操作详解
  6. qt5python gui cookbook_Python GUI Programming Cookbook学习笔记
  7. 大哥你需求里说只要工作流引擎组件,怎么真正需要的东西这么.悲剧了,客户需求无止境...
  8. python中out什么意思_ref和out的使用与区别|python基础教程|python入门|python教程
  9. 免费python全套视频教学-有哪些优质的Python全系列视频教程推荐,免费的收费的都可以?...
  10. 全球免费开放的电子图书馆
  11. 第二周博客作业西北师范大学|李晓婷
  12. COLLADAMaxNew插件,opencollada导出DAE文件格式 for 3dmax2019
  13. nyoj 239 月老的难题 【二分匹配之匈牙利】
  14. Python PaddleNLP实现自动生成虎年藏头诗
  15. Deepin V20 安装 佳能 Canon LBP 2900打印机
  16. Verilog基础语法--运算符【常用的几种】
  17. 软件过程与管理:configuration management
  18. 在阿里工作几年,女友跑路,晋升无望,买不起房,我活成了一个笑话~
  19. java ssssss_javassssss
  20. ros-noetic安装教程

热门文章

  1. CPG 固体支持物研究:Lumiprobe通用 CPG II 型
  2. WV.21-大数阶乘算法1-序
  3. 20200228华为手机安装谷歌商店,Download the latest Google Play Store APK
  4. 建模师的工资一般是多少
  5. 【activiti】流程变量
  6. C语言编程题————编写代码,演示多个字符从两边移动,向中间聚拢
  7. Django如何实现点赞、收藏以及浏览量增减
  8. webug 4.0 第二十二关 越权修改密码
  9. sql运算顺序及其运算模型
  10. orcle 删除表报正在使用_oracle删除正在连接的用户,解除锁定的表