• [分享交流] Tensorflow 2.0保存和加载模型
    Tensorflow 2.0保存和加载模型模型进度可以在训练期间和训练后保存。这意味着模型可以在它停止的地方继续,并避免长时间的训练。保存还意味着您可以共享您的模型,其他人可以重新创建您的工作。当发布研究模型和技术时,大多数机器学习实践者共享:l  用于创建模型的代码l  以及模型的训练权重或参数共享此数据有助于其他人了解模型的工作原理,并使用新数据自行尝试。注意:小心不受信任的代码(TensorFlow模型是代码)。有关详细信息,请参阅安全使用TensorFlow 。选项:保存TensorFlow模型有多种方法,具体取决于你使用的API。本章节使用tf.keras(一个高级API,用于TensorFlow中构建和训练模型),有关其他方法,请参阅TensorFlow保存和还原指南或保存在eager中。1.    设置1.1. 安装和导入需要安装和导入TensorFlow和依赖项pip install h5py pyyaml1.2. 获取样本数据集我们将使用MNIST数据集来训练我们的模型以演示保存权重,要加速这些演示运行,请只使用前1000个样本数据:from __future__ import absolute_import, division, print_function, unicode_literals   import os   import tensorflow as tf   try:     import tensorflow.keras as keras   except:     import tensorflow.python.keras as keras     #获取样本数据集   (train_images, train_labels), (test_images, test_labels) = keras.datasets.mnist.load_data() train_labels = train_labels[:1000] test_labels = test_labels[:1000] train_images = train_images[:1000].reshape(-1, 28 * 28) / 255.0   test_images = test_images[:1000].reshape(-1, 28 * 28) / 255.01.3. 定义模型让我们构建一个简单的模型,我们将用它来演示保存和加载权重。#定义模型 # 返回一个简短的序列模型   def create_model():   model = tf.keras.models.Sequential([     keras.layers.Dense(512, activation='relu', input_shape=(784,)),     keras.layers.Dropout(0.2),     keras.layers.Dense(10, activation='softmax')   ])   model.compile(optimizer='adam',                 loss='sparse_categorical_crossentropy',                 metrics=['accuracy'])   return model   # 创建基本模型实例   model = create_model()   print(model.summary()) Model: "sequential"_________________________________________________________________Layer (type)                 Output Shape              Param #=================================================================dense (Dense)                (None, 512)               401920_________________________________________________________________dropout (Dropout)            (None, 512)               0_________________________________________________________________dense_1 (Dense)              (None, 10)                5130=================================================================Total params: 407,050Trainable params: 407,050Non-trainable params: 0_________________________________________________________________2.    在训练期间保存检查点主要用例是在训练期间和训练结束时自动保存检查点,通过这种方式,您可以使用训练有素的模型,而无需重新训练,或者在您离开的地方继续训练,以防止训练过程中断。tf.keras.callbacks.ModelCheckpoint是执行此任务的回调,回调需要几个参数来配置检查点。2.1. 检查点回调使用情况训练模型并将其传递给 ModelCheckpoint回调#在训练期间保存检查点   checkpoint_path = "training_1/cp.ckpt"   checkpoint_dir = os.path.dirname(checkpoint_path)   # 创建一个检查点回调   cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path,                                                  save_weights_only=True,                                                  verbose=1)   model = create_model() model.fit(train_images, train_labels,  epochs = 10,           validation_data = (test_images,test_labels),           callbacks = [cp_callback])  # pass callback to training   Train on 1000 samples, validate on 1000 samples  ......  Epoch 10/10  960/1000 [===========================>..] - ETA: 0s - loss: 0.0392 - accuracy: 1.0000  Epoch 00010: saving model to training_1/cp.ckpt  1000/1000 [==============================] - 0s 207us/sample - loss: 0.0393 - accuracy: 1.0000 - val_loss: 0.3976 - val_accuracy: 0.8750   <tensorflow.python.keras.callbacks.History at 0x7efc3eba7358>这将创建一个TensorFlow检查点文件集合,这些文件在每个周期结束时更新。文件夹checkpoint_dir下的内容如下:(Linux系统使用 ls命令查看)checkpoint  cp.ckpt.data-00000-of-00001  cp.ckpt.index创建一个新的未经训练的模型,仅从权重恢复模型时,必须具有与原始模型具有相同体系结构的模型,由于它是相同的模型架构,我们可以共享权重,尽管它是模型的不同示例。现在重建一个新的,未经训练的模型,并在测试集中评估它。未经训练的模型将在随机水平(约10%的准确率):model = create_model() loss, acc = model.evaluate(test_images, test_labels)   print("Untrained model, accuracy: {:5.2f}%".format(100*acc)) 1000/1000 [==============================] - 0s 107us/sample - loss: 2.3224 - accuracy: 0.1230Untrained model, accuracy: 12.30%然后从检查点加载权重,并重新评估:model.load_weights(checkpoint_path) loss,acc = model.evaluate(test_images, test_labels)   print("Restored model, accuracy: {:5.2f}%".format(100*acc))1000/1000 [==============================] - 0s 48us/sample - loss: 0.3976 - accuracy: 0.8750Restored model, accuracy: 87.50%2.2. 检查点选项回调提供了几个选项,可以为生成的检查点提供唯一的名称,并调整检查点频率。训练一个新模型,每5个周期保存一次唯一命名的检查点:# 在文件名中包含周期数. (使用 `str.format`)   checkpoint_path = "training_2/cp-{epoch:04d}.ckpt"   checkpoint_dir = os.path.dirname(checkpoint_path)   cp_callback = tf.keras.callbacks.ModelCheckpoint(     checkpoint_path, verbose=1, save_weights_only=True,     # 每5个周期保存一次权重     period=5)   model = create_model() model.save_weights(checkpoint_path.format(epoch=0)) model.fit(train_images, train_labels,           epochs = 50, callbacks = [cp_callback],           validation_data = (test_images,test_labels),           verbose=0)  Epoch 00005: saving model to training_2/cp-0005.ckpt......Epoch 00050: saving model to training_2/cp-0050.ckpt<tensorflow.python.keras.callbacks.History at 0x7efc7c3bbd30>现在,查看生成的检查点并选择最新的检查点:#现在,查看生成的检查点并选择最新的检查点:   latest = tf.train.latest_checkpoint(checkpoint_dir)   print(latest)       'training_2/cp-0050.ckpt'注意:默认的tensorflow格式仅保存最近的5个检查点。要测试,请重置模型并加载最新的检查点:model = create_model() model.load_weights(latest) loss, acc = model.evaluate(test_images, test_labels)   print("Restored model, accuracy: {:5.2f}%".format(100*acc))       1000/1000 [==============================] - 0s 84us/sample - loss: 0.4695 - accuracy: 0.8810      Restored model, accuracy: 88.10%3.    这些文件是什么?上述代码将权重存储到检查点)格式的文件集合中,这些文件仅包含二进制格式的训练权重.检查点包含:一个或多个包含模型权重的分片;索引文件,指示哪些权重存储在哪个分片。如果您只在一台机器上训练模型,那么您将有一个带有后缀的分片:.data-00000-of-000014.    手动保存权重上面你看到了如何将权重加载到模型中。手动保存权重同样简单,使用Model.save_weights方法。# 保存权重   model.save_weights('./checkpoints/my_checkpoint')   # 加载权重   model = create_model() model.load_weights('./checkpoints/my_checkpoint') loss,acc = model.evaluate(test_images, test_labels)   print("Restored model, accuracy: {:5.2f}%".format(100*acc))5.    保存整个模型模型和优化器可以保存到包含其状态(权重和变量)和模型配置的文件中,这允许您导出模型,以便可以在不访问原始python代码的情况下使用它。由于恢复了优化器状态,您甚至可以从中断的位置恢复训练。保存完整的模型非常有用,您可以在TensorFlow.js(HDF5, Saved Model) 中加载它们,然后在Web浏览器中训练和运行它们,或者使用TensorFlow Lite(HDF5, Saved Model)将它们转换为在移动设备上运行。5.1. 作为HDF5文件Keras使用HDF5标准提供基本保存格式,出于我们的目的,可以将保存的模型视为单个二进制blob。#保存整个模型 #Keras使用HDF5标准提供基本保存格式,出于我们的目的,可以将保存的模型视为单个二进制blob。   model = create_model() model.fit(train_images, train_labels, epochs=5)   # 保存整个模型到HDF5文件   model.save('my_model.h5')现在从该文件重新创建模型:# 重新创建完全相同的模型,包括权重和优化器   new_model = keras.models.load_model('my_model.h5')   print(new_model.summary()) Model: "sequential_6"_________________________________________________________________Layer (type)                 Output Shape              Param #=================================================================dense_12 (Dense)             (None, 512)               401920_________________________________________________________________dropout_6 (Dropout)          (None, 512)               0_________________________________________________________________dense_13 (Dense)             (None, 10)                5130=================================================================Total params: 407,050Trainable params: 407,050Non-trainable params: 0_________________________________________________________________检查模型的准确率:#检查模型的准确率:   loss, acc = new_model.evaluate(test_images, test_labels)   print("Restored model, accuracy: {:5.2f}%".format(100*acc))1000/1000 [==============================] - 0s 94us/sample - loss: 0.4137 - accuracy: 0.8540Restored model, accuracy: 85.40%此方法可保存模型的所有东西:权重值模型的配置(架构)优化器配置Keras通过检查架构来保存模型,目前它无法保存TensorFlow优化器(来自tf.train)。使用这些时,您需要在加载后重新编译模型,否则您将失去优化程序的状态。5.2. 作为 saved_model注意:这种保存tf.keras模型的方法是实验性的,在将来的版本中可能会有所改变。创建一个新的模型:model = create_model() model.fit(train_images, train_labels, epochs=5) 创建saved_model,并将其放在带时间戳的目录中:import time saved_model_path = "./saved_models/{}".format(int(time.time())) tf.keras.experimental.export_saved_model(model, saved_model_path)   print(saved_model_path)     './saved_models/1555630614'从保存的模型重新加载新的keras模型:new_model = tf.keras.experimental.load_from_saved_model(saved_model_path)   print(new_model.summary()) Model: "sequential_7"_________________________________________________________________Layer (type)                 Output Shape              Param #=================================================================dense_14 (Dense)             (None, 512)               401920_________________________________________________________________dropout_7 (Dropout)          (None, 512)               0_________________________________________________________________dense_15 (Dense)             (None, 10)                5130=================================================================Total params: 407,050Trainable params: 407,050Non-trainable params: 0_________________________________________________________________运行加载的模型进行预测:model.predict(test_images).shape  (1000, 10)new_model.compile(optimizer=model.optimizer,  # keep the optimizer that was loaded               loss='sparse_categorical_crossentropy',               metrics=['accuracy'])   # 评估加载后的模型   loss, acc = new_model.evaluate(test_images, test_labels)   print("Restored model, accuracy: {:5.2f}%".format(100*acc))      1000/1000 [==============================] - 0s 102us/sample - loss: 0.4367 - accuracy: 0.8570      Restored model, accuracy: 85.70% 本实验利用网上已有的北京房价数据集预测了北京的房价,实现了TensorFlow的线性回归应用。更多的技术内容,请访问腾科公司网站 www.togogo.net
  • [分享交流] TensorFlow 2.0 简介
    TensorFlow 2.0 简介1.    TensorFlow简介TensorFlow是目前最为流行的深度学习框架,是人工智能领域第一主要工具,迭代版本共有0.1,1.0,和2.0三个版本,本章主要针对最新的2.0版本进行讲解和学习。它是一个用于机器学习和深度学习的端到端开源平台。15年9月发布0.1版本;17年2月发布1.0版本;19年3月发布2.0版本。15年同类型框架:l  Ski-learn: Machine Learning, 不支持GPU; l  Caffe: 第一个面向深度学习的框架,但不支持自动求导; l  Keras: 只提供API接口; l  Torch: Lua语言; l  Teano: 开发调试难。当下同类型框架:l  Caffe: Facebookl  Caffe2: PyTorch(最新版本的Caffe2 作为PyTorch的C++后端已经并入到PyTorch里去)。l  Torch--PyTorch。PyTorch当下非常流行的框架,集合了Torch和Caffe2,Facebook主推。 l  Teano: Google推出 Tensorflow1.0 ----Tensorflow2.0。2.    V1.0与PyTorch1.0对比l  与Tensorflow1.0版本同一时期PyTorch1.0版本发布。l  Tensorflow1.0与PyTorch1.0版本的对比:3.    V1.0的弊端l  TensorFlow1.0里在创建了Tensor之后,不能直接返回结果。 而是需要创建session会话机制,包含graph的概念在里面,而且需要session.run 才能运行。 这种风格更像是一种硬件编程语言VHDL。l  与PyTorch等一些简单的框架相比,TensorFlow1.0 徒增了以上概念,用户使用起来非常的困扰。l  TensorFlow1.0调试困难,API混乱,入门困难。入了门使用起来依旧困难,导致很多研究人员转向了PyTorch。4.    V2.0 comingl  TF+Keras:最大的特性(Easy to use): 去掉了graph 和session机制。变的像Python,PyTorch一样所见即所得。l  主要改进点:p  Session.run:图和会话机制;p  Tf.control_dependencies:实时控制的概念;p  Tf.global_variables_initializer;p  Tf.cond:分支控制的概念原本可以通过python中if,else等语句来完成;p  Tf.while_loop 。对比发现跟PyTorch的风格很相似:import TensorFlow as tfa=tf.constant(1.)b=tf.constant(3.)c=tf.add(a,b)print(float(c))l  TensorFlow1.0会将大量的时间花费在这些冗余的概念编写上,而忽略对深度学习算法的研究。诸如以下所列出的抽象的概念将一去不复返。p  计算图Graphp  会话Sessionp  变量管理Variable Scope与共享reusep  Define-and-runl  本课程假设你对TensorFlow一无所知,即使知道一些TensorFlow1.0中的概念,但是在2.0中基本上用不到。因此今后不需要我们对TensorFlow1.0再进行学习和了解。5.    TensorFlow2.0简介l  TensorFlow2.0包括了TensorFlow核心库,JavaScript, Lite, Extended。构成了TensorFlow的一个完整的生态系统。l  TensorFlow核心库:p  使初学者和专家可以轻松的创建机器学习模型。p  TensorFlow的高级API基于Keras API标准,用于定义和训练神经网络。p  Keras通过用户友好的API实现快速原型设计,最先进的研究和生产。5.1. JavaScriptl  TensorFlow.js:是一个用于在JavaScript中开发和训练ML模型,并在浏览器或Node.js上部署的库。p  运行现有模型:使用官方TensorFlow.js模型或者转换Python模型。p  重新训练现有模型:使用Transfer Learning自定义模型。p  使用JavaScript开发ML:使用灵活直观的API直接在JavaScript中构建和训练模型,TensorFlow.js。5.2. TensorFlow Litel  TensorFlow Lite:是一个用于设备推理的开源深度学习框架。它可以满足在移动和物联网设备上部署机器学习模型。p  选择一个模型:选择新模型或者重新训练现有模型p  兑换:使用TensorFlow Lite转换器将TensorFlow模型转换为压缩的平缓冲区p  部署:获取压缩的.tflite文件并将其加载到移动或嵌入式设备中。p  优化:通过将32位浮点数转换为更高效的8位整数或在GPU上运行来进行量化。5.3. TensorFlow Extendedl  TensorFlow Extended (TFX):是用于部署生产ML管道的端到端平台,当训练好的模型准备从研究转移到生产时,使用TFX创建和管理生产管道。p  TensorFlow数据验证:TFDV可帮助开发人员大规模了解,验证和监控其ML数据。p  TensorFlow变换:将数据预处理成合适的格式。p  TensorFlow模型分析:TFMA使开发人员能够计算和可视化模型的评估指标。p  TensorFlow服务:轻松部署新算法和实验,同时保持相同的服务器架构和API。6.    为什么使用TensorFlowl  TensorFlow最为当下最流行的框架主要因为一下几个优势:p  支持GPU加速p  支持自动求导p  深度学习API7.    使用TensorFlow7.1. GPU加速l  支持GPU加速:对矩阵的加减乘除有一个并行的运算加速。7.2. 自动求导l  TensorFlow框架的另一个优势就是自动求导:7.3. 深度学习APIl  TensorFlow框架提供大量深度学习API:                                  Ø  tf.matmul                              Ø  tf.nn.conv2dØ  tf.nn.reluØ  tf.nn.maxpool2dØ  tf.nn.sigmoidØ  tf.nn.softmaxØ  layers.DenseØ  layers.Conv2DØ  layers.LSTMØ  layers.ReLUØ  layers.MaxPool2D 下一节会给大家介绍tensorflow2.0基础操作,更多的技术内容,请访问腾科公司网站 www.togogo.net
  • [分享交流] TensorFlow 变量
    TensorFlow 变量1.    变量概念变量维护图执行过程中的状态信息。如在神经网络中,用于标识w、b等系数。变量其实是Python中的Variable对象。TensorFlow中变量的初始值可以设置成随机数、常数或者是通过其他变量的初始值计算得到。在TensorFlow中,变量(Variable)是特殊的张量(Tensor),它的值可以是一个任何类型和形状的张量。与其他张量不同,变量存在于单个 session.run 调用的上下文之外,也就是说,变量存储的是持久张量,当训练模型时,用变量来存储和更新参数。变量包含张量 (Tensor)存放于内存的缓存区。建模时它们需要被明确地初始化,模型训练后它们必须被存储到磁盘。这些变量的值可在之后模型训练和分析是被加载。除此之外,在调用op之前,所有变量都应被显式地初始化过。2.    创建变量当创建一个变量时,你将一个张量作为初始值传入构造函数Variable()。TensorFlow提供了一系列操作符来初始化张量,初始值是常量或是随机值。注意,所有这些操作符都需要你指定张量的shape。那个形状自动成为变量的shape。变量的shape通常是固定的,但TensorFlow提供了高级的机制来重新调整其行列数。# 创建两个变量.weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")biases = tf.Variable(tf.zeros([200]), name="biases")调用tf.Variable()添加一些操作(Op, operation)到graph:l  一个Variable操作存放变量的值。l  一个初始化op将变量设置为初始值。这事实上是一个tf.assign操作.l  初始值的操作,例如示例中对biases变量的zeros操作也被加入了graph。tf.Variable的返回值是Python的tf.Variable类的一个实例。3.    变量初始化创建好变量之后,变量必须初始化。变量的初始化必须在模型的其它操作运行之前先明确地完成。最简单的方法就是添加一个给所有变量初始化的操作,并在使用模型之前首先运行那个操作。你或者可以从检查点文件中重新获取变量值,详见下文。使用tf.initialize_all_variables()添加一个操作对变量做初始化。记得在完全构建好模型并加载之后再运行那个操作。# 创建两个变量.weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")biases = tf.Variable(tf.zeros([200]), name="biases")...# 初始化变量init_op = tf.initialize_all_variables() # Later, when launching the modelwith tf.Session() as sess:  #运行初始化操作.  sess.run(init_op)  ...  # Use the model  ...4.    保存和加载最简单的保存和恢复模型的方法是使用tf.train.Saver对象。构造器给graph的所有变量,或是定义在列表里的变量,添加save和restoreops。saver对象提供了方法来运行这些ops,定义检查点文件的读写路径。5.    检查点文件变量存储在二进制文件里,主要包含从变量名到tensor值的映射关系。当你创建一个Saver对象时,你可以选择性地为检查点文件中的变量挑选变量名。默认情况下,将每个变量Variable.name属性的值。6.    保存变量用tf.train.Saver()创建一个Saver来管理模型中的所有变量。# Create some variables.v1 = tf.Variable(..., name="v1")v2 = tf.Variable(..., name="v2")...# Add an op to initialize the variables.init_op = tf.initialize_all_variables() # Add ops to save and restore all the variables.saver = tf.train.Saver() # Later, launch the model, initialize the variables, do some work, save the# variables to disk.with tf.Session() as sess:  sess.run(init_op)  # Do some work with the model.  ..  # Save the variables to disk.  save_path = saver.save(sess, "/tmp/model.ckpt")  print "Model saved in file: ", save_path7.    恢复变量用同一个Saver对象来恢复变量。注意,当你从文件中恢复变量时,不需要事先对它们做初始化。# Create some variables.v1 = tf.Variable(..., name="v1")v2 = tf.Variable(..., name="v2")...# Add ops to save and restore all the variables.saver = tf.train.Saver() # Later, launch the model, use the saver to restore variables from disk, and# do some work with the model.with tf.Session() as sess:  # Restore variables from disk.  saver.restore(sess, "/tmp/model.ckpt")  print "Model restored."  # Do some work with the model  ...8.    选择存储和恢复哪些变量如果你不给tf.train.Saver()传入任何参数,那么saver将处理graph中的所有变量。其中每一个变量都以变量创建时传入的名称被保存。有时候在检查点文件中明确定义变量的名称很有用。举个例子,你也许已经训练得到了一个模型,其中有个变量命名为"weights",你想把它的值恢复到一个新的变量"params"中。有时候仅保存和恢复模型的一部分变量很有用。再举个例子,你也许训练得到了一个5层神经网络,现在想训练一个6层的新模型,可以将之前5层模型的参数导入到新模型的前5层中。你可以通过给tf.train.Saver()构造函数传入Python字典,很容易地定义需要保持的变量及对应名称:键对应使用的名称,值对应被管理的变量。注意:如果需要保存和恢复模型变量的不同子集,可以创建任意多个saver对象。同一个变量可被列入多个saver对象中,只有当saver的restore()函数被运行时,它的值才会发生改变。如果你仅在session开始时恢复模型变量的一个子集,你需要对剩下的变量执行初始化op。详情请见tf.initialize_variables()。# Create some variables.v1 = tf.Variable(..., name="v1")v2 = tf.Variable(..., name="v2")...# Add ops to save and restore only 'v2' using the name "my_v2"saver = tf.train.Saver({"my_v2": v2})# Use the saver object normally after that.... 更多的技术内容,请访问腾科it教育集团网站 www.togogo.net
  • [上云精品] 华为云DevCloud HE2E DevOps实战训练营
    今天的技术常新日新月异,数字化转型给全球各行业都带来了去打的变革和机遇,今天任何一家公司都必须成为软件公司,通过科技的提升才能赢得未来。面对市场和技术的快速发展,实现快速迭代,敏捷开发和DevOps研发运维一体化,已经成为软件工程领域的主流趋势。在实际推动DevOps实践的过程中,无论是快速成长的新创企业,或是拥有大规模IT团队的大型企业,我们都常听到这种问题:为什么要DevOps?DevOps能解决哪些问题?导入DevOps有哪些挑战,方法和步骤?如何让DevOps实践为企业创造价值?面对这些问题,我们的答案是“华为云DevCloud”。华为云DevCloud是一站式、全流程、安全可信的DevOps云平台,集华为30年研发实践、前沿研发理念、先进研发工具为一体,面向开发者提供研发工具服务,让软件开发简单高效。华为云DevCloud为企业研发团队提供了端到端的研发管理,配置管理,持续集成,持续部署,持续监控和持续改进能力。华为云DevCloud支持所有主流编程语言和平台。在华为发展历程中,一直致力于打造提质增效的研发能力。华为云DevCloud将30年积累的研发经验以云服务的方式面向全社会开放,打造了软件开发云平台, 为广大中小软件企业、双创企业、互联网企业、高校和软件开发者提供一站式智能研发工具平台,开发团队借助华为的经验和流程,提高研发效率以及代码质量,并大幅降低开发成本。本课程为期两天,以华为DevCloud HE2E DevOps实施框架和凤凰商城实例项目为基础,为管理者和开发者提供理论+实践的华为云DevCloud全面功能讲解,配合丰富细致的教材和游戏,引导学员一步步完成使用华为软开云构建自己的DevOps工具链的过程。课程大纲
  • [技术干货] 【趁热打“帖”】【IoT在线训练营】二等奖参赛作品分享-蜂巢快递箱
    蜂巢快递箱一、项目背景      丰巢“智能快递柜,面向所有快递公司、电商物流使用的24小时自助开放平台,以提供平台化快递收寄交互业务。        “丰巢”提供快递行业最后一公里方案服务。        二、项目演示    相信大家对蜂巢快递箱都不陌生,下面我直接进入演示环节,见附件    
  • [技术干货] 【趁热打“帖”】【IoT在线训练营】二等奖参赛作品分享-电力杆塔鸟窝监测
    电力杆塔鸟窝监测一、项目背景      输配电系统的稳定运行对于整个电力行业来说是至关重要的,电力杆塔更是遍布各地。但是鸟类等动物经常会在杆塔上筑巢,导致电力线缆之间的绝缘变差,容易引起线路短路、跳闸、火灾等事故,对生产生活造成巨大的经济损失,因此电网运行人员时常会对电力杆塔上的鸟窝进行清除,消除隐患。      二、作品功能    实时监测杆塔上是否存在有鸟巢等障碍物,及时告警;通知运维人员采取清除措施;    对可能有鸟类正在筑巢的情况,设备发出声光等进行驱逐。 三、系统实现1、网络架构     感知层设备通过NB-IoT网络将数据发送至IoT平台,应用界面采用IoT Booster开发。2、硬件设计       采用红外传感器或者超声波的方式检测杆塔间隙是否有障碍物存在。3、设备模型定义(profile)                                 上报信息包括:电量、经纬度、报警值;下发命令:控制声音和光电驱逐功能4、应用系统(IoT Booster)
  • [技术干货] 【趁热打“帖”】【第二期】学会接口,感知万物数据---【IoT在线训练营】
     总的来看其实就是用postman做三步就可以解决的了;第一步:Ps:https://49.4.92.x:8743/iocm/app/sec/v1.1.0/login  ip地址从下面拿然后就可以保存其中的信息:        {    "accessToken": "2db2ac3137c4208479a7a25b41925c1",    "tokenType": "bearer",    "refreshToken": "77d6dcd5798ca73248ee38e994a65565",    "expiresIn": 3600,    "scope": "default"}        第二步:https://49.4.92.191:8743/iocm/app/reg/v1.1.0/deviceCredentials要用到的代码:{                 "verifyCode": "33343R232111",         "nodeId": "33343R232111",         "deviceInfo": {                   "manufacturerName":"SZMC",                   "manufacturerId":"c24eaf1eb93b466faf5cbfcd9d3ab569",                   "deviceType":"Bulb",                   "model":"Bulb01",                   "protocolType":"LWM2M"         },         "timeout": 0}保存要用到的信息:{    "deviceId": "00aee60d-6805-477d-9d16-35a9554224c7",    "verifyCode": "1bcfef6e-4df7-4492-8017-0a31fc6d11ad",    "timeout": 0,    "psk": "d6979b50ebf2fbd37316729ef832e4fc"} 最后一步:核心的部分在于要把虚拟设备激活起来(https://ilearningx.huawei.com/courses/course-v1:HuaweiX+EBGTC00000285+2019.4/courseware/5558aecf537f459a825e8fe5669a3305/43ff829db0c44801a2c9bf17b345b1b3/),用起来,然后把虚拟设备的ID写上去:总操作参见视频:https://ilearningx.huawei.com/courses/course-v1:HuaweiX+EBGTC00000285+2019.4/courseware/d4fc74323bce40e3a34bf67e76f56f2d/9402024ae61c496ea6f20e4abc15cd71/详细可以看-https://bbs.huaweicloud.com/blogs/2b2e14045a6c11e9bd5a7ca23e93a891
  • [技术干货] 【趁热打“帖”】华为IoT在线训练营作品分享:智慧路灯
  • [技术干货] 【趁热打“帖”】华为IoT在线训练营作品分享:智慧路灯 -二等奖-动手收获良多
    场景1:智慧路灯,就是光强大于100白天时候关灯,小于100就开灯,从而可以为路灯节省能源;场景2:回家前开门前可以看一下家里灯的情况,可以提前开灯,还有睡觉了,躺床上,用小程序关灯睡觉就好,上班离开家了,中途发现灯还没有关闭,但是我们可以远程关灯又不用回家关灯;场景3:视频监控的周围光强不大的情况下(晚上或者地铁隧道 地下室等环境),智慧路灯可以根据光强情况自动开灯,从而为视频监控提供优良的视频监控拍摄环境;场景4:智能路灯是否可以根据人或者车等目标移动的距离从而开灯甚至适当调整到最省电和最佳光强等综合因素结合,从而提供到最适应人眼睛的光强的情况下又可以省电,用在刀刃上;加一个红外传感器就可以了。场景5:手机或者显示器的光的强度可以根据人的眼睛距离屏幕的不同情况从而调整到最适宜人眼睛的光强,从而保护眼睛;
  • [技术干货] 【趁热打“帖”】华为【IoT在线训练营】一等奖作品分享:智慧校园
    结合华为OceanConnect平台和小熊派的训练营作品分享注:虽然这是一个学习作品展示,我们也当一个真正的项目来介绍一、项目背景    家校信息互通,关注学生安全。    父母的眼睛一看不见孩子,就时刻担心,即使是爷爷奶奶送上学,做妈妈的也不很放心;    作为学校更是担心在校门口孩子被拐走。    那么学生的行动在家校间接驳时间点上的信息互通,就是本案要做的事。    二、业务流程概述    1)学生进入学校/离开学校进行打卡,卡号信息通过南向终端设备采集后上传到华为OceanConnect平台,通过订阅接口发送给北向应用,应用服务得到信息后,到数据库中检索卡号对应的学生信息,然后取得学生家长手机号,并发送一条学生已经到校的短信。给家长一个安心消息。    2)学校门口总是乱糟糟,为防止学生过早的出来等家长,那么家长在到达门口时,通过微信公众号已经定制好的菜单,发送通知命令,微信命令发送给北向应用,应用服务从数据库检索订阅微信号对应得学生信息,然后拿到学生对应的终端设备,向华为OceanConnect平台发送呼叫命令,最终命令发送给南向终端设备,设备端代码根据接收消息类型和内容选择显示和亮灯提醒.三、项目内容1、硬件方案开发板:小熊派 STM32L4xx通信方式:WIFI/GPRS/NB-IoT可选平台:OceanConnect 2、软件方案1)依托OceanConnect平台,在平台上创建项目和产品,并根据项目的服务能力信息,编写Profile以及编解码插件2)北向微服务应用依赖OceanConnect平台的Api注册设备信息,查询以及接收回调信息login/subscriptions/deviceCommands主动调用的接口deviceDataChanged/commandChanged提供给回调的服务    详细接口说明和使用见 Asp.net core实现北向应用服务对接OceanConnect3)北向业务系统,维护设备和学校信息    “智慧校园”是一个SaaS应用,一个设备和一个学校对应,学校可以注册多个学生,家长微信端绑定学生信息;      也就是一个一个学校(设备)为中心,连带着学生和家长作为一个SaaS的租户。4、产品全貌四、作品演示    见 智慧校园演示视频五、源码下载为了完成任务,也下载了不少别人的代码,最后攒了一个自己的。这是完整的LiteOS工程。CSDN无法自己设置下载积分,如果下载不了的,可以在这里留言。https://download.csdn.net/download/shenlongju/11211226
  • [技术干货] 【趁热打“帖”】【IoT在线训练营】二等奖参赛作品分享_消防安全监测感知平台
    参赛作品:消防安全监测感知平台作品介绍:       随着近几年,火灾事件频频发生,国家对消防安全越来越重视,城市的消防建设需要借助物联网相关设备,加强对消防隐患的跟踪与排除,从而建设一个智能的消防联动系统。应用场景:      目前一些老小区,房子老旧,电线繁杂,老人居多,容易引发一些火灾,为加强安全防范,小区物业可将每家每户安装烟雾探测报警器,一但发生火灾,物业会马上收到相关提醒,火警也能及时赶到现场进行灭火救援。作品架构:作品演示:通过华为云OceanConnect平台开发产品通过华为云Iot Booster开发Web管理应用
  • [分享交流] TensorFlow 开发基础
    TensorFlow 开发基础1.    TensorFlow是什么TensorFlow是谷歌开源的第二代用于数字计算的软件库,它可以很好的支持深度学习的各种算法,但它的应用不局限于深度学习,可以支持多种计算平台,系统稳定性较高。为了更好理解它,从以下几个方面介绍:1)TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。2)从命名来理解:Tensor(张量)意味着N维数组,Flow(流)意味 着基于数据流图的计算。Tensorflow运行过程就是张量从图的一端流动到另一端的计算过程。3)TensorFlow的开发过程中,重点在于构建执行流图。也就是:“Data Flow Graphs”,表示TensorFlow是一种基于图的计算框架,其中节点(Nodes)在图中表示数学操作,线(Edges)则表 示在节点间相互联系的多维数据数组,即张量(Tensor),这种基于流的架构让 TensorFlow具有非常高的灵活性。2.    TensorFlow的特点1)真正的可移植性引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,如安卓、ios、等等2)多语言支持Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和执行你的graphs,你可以直接写python/c++程序。3)高度的灵活性与效率TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库能够灵活进行组装图,执行图。随着开发的进展,Tensorflow的效率不算在提高4)支持TensorFlow 由谷歌提供支持,谷歌投入了大量精力开发 TensorFlow,它希望 TensorFlow 成为机器学习研究人员和开发人员的通用语言3.    TensorFlow可以做什么•    自动驾驶小车•    生成音乐•    图像识别•    语音识别•    语言模型•    **行为识别•    定理证明•    拿来玩马里奥赛车… 4.    TensorFlow计算过程            TensorFlow基于数据流图,用于大规模分布式数值计算的开源框架。节点表示某种抽象的计算,边表示节点之间相互联系的张量。            TensorFlow是一个通过计算图的形式来表述计算的编程系统,是以张量(tensor)在计算图(graph)上流动(flow)的方式实现和执行机器学习/深度学习算法的框架。5.    TensorFlow架构下图是TF的系统架构,从底向上分为设备管理和通信层、数据操作层、图计算层、API接口层、应用层。其中设备管理和通信层、数据操作层、图计算层是TF的核心层。底层设备通信层负责网络通信和设备管理。设备管理可以实现TF设备异构的特性,支持CPU、GPU、Mobile等不同设备。网络通信依赖gRPC通信协议实现不同设备间的数据传输和更新。第二层是Tensor的OpKernels实现。这些OpKernels以Tensor为处理对象,依赖网络通信和设备内存分配,实现了各种Tensor操作或计算。Opkernels不仅包含MatMul等计算操作,还包含Queue等非计算操作。Kernel层可以跑在cpu上也可以跑在gpu上。第三层是图计算层(Graph),包含本地计算流图和分布式计算流图的实现。Graph模块包含Graph的创建、编译、优化和执行等部分,Graph中每个节点都是OpKernels类型表示。第四层是API接口层。Tensor C API是对TF功能模块的接口封装,便于其他语言平台调用。第四层以上是应用层。不同编程语言在应用层通过API接口层调用TF核心功能实现相关实验和应用。TensorFlow的内核引擎使用C++实现的,效率是很高的。TensorFlow的内核封装实现了NN、CNN等基本机器学习算法。前端应用层支持Python或C++,一般用Python(AI领域第一编程语言)。在应用层,如果使用了其他的Python耗时操作(如数据预处理等),可能效率会比较低,但这不是TensorFlow造成的。6.    TensorFlow开发环境搭建推荐使用Anaconda3+Pycharm来开发,安装过程可参考以下博客文章https://blog.csdn.net/albert201605/article/details/79090620/7.    TensorFlow简单示例''' 1.引入tensorflow 2.定义常量、变量 3.创建Session会话 4.调用Session中的run()方法来运行,得出结果 5.关闭seession ''' #引入tensorflow import tensorflow as tf #定义常量 hello = tf.constant("hello,tensorflow") a = tf.constant(10) b = tf.constant(20) with tf.Session() as sess:     print(sess.run(hello))     print(sess.run(a + b)) 更多的技术内容,请访问腾科公司网站 www.togogo.net
  • [技术干货] 【趁热打“帖”】分享华为IoT在线训练营作品&quot;智慧校园&quot;展示
    本来很想说说这次学习的过程和感想,但是我觉得大家(尤其是也参加了训练营的)都很想直接看干货,最好什么也不说,把比赛视频发上来就行了;我觉得这样的话,货也太干了,还是要加点水分润滑一下,也是补充一下视频中没有的东西。学习过程和心路历程,下次开贴再记录吧.本案例产品取名“智慧校园”实际针对的业务场景是:    家校信息互通,关注学生安全。    父母的眼睛一看不见孩子,就时刻担心,即使是爷爷奶奶送上学,做妈妈的也不很放心;    作为学校更是担心在校门口孩子被拐走。    那么学生的行动在家校接驳时间点上的信息互通,就是本案要做的事。业务流程概述:1)学生进入学校/离开学校进行打卡,卡号信息通过南向终端设备采集后上传到华为OceanConnect平台,通过订阅接口发送给北向应用,应用服务得到信息后,到数据库中检索卡号对应的学生信息,然后取得学生家长手机号,并发送一条学生已经到校的短信。给家长一个安心消息。2)学校门口总是乱糟糟,为防止学生过早的出来等家长,那么家长在到达门口时,通过微信公众号已经定制好的菜单,发送通知命令,微信命令发送给北向应用,应用服务从数据库检索订阅微信号对应得学生信息,然后拿到学生对应的终端设备,向华为OceanConnect平台发送呼叫命令,最终命令发送给南向终端设备,设备端代码根据接收消息类型和内容选择显示和亮灯提醒.部分代码和说明:1)添加了RFID设备型号RC522的支持代码2)根据RC522的针脚需要,结合小熊派针脚的标识,调整代码中对针脚定义,初始化和控制3)业务逻辑,其实就很简单了,一个while循环中完成VOID app_data_report_collection(VOID) {         LCD_Clear(BLACK);        POINT_COLOR = GREEN;    //画笔颜色       BACK_COLOR  = BLACK;    //背景颜色     LCD_ShowString(20, 10, 220, 16, 24, "HW IoT BearPi Lab");     LCD_ShowString(50, 50, 200, 16, 24, "Smart Campus");     uint8_t uPcd_ID[4] = {0};        int RFID_No;             while (1)     {         if(MI_OK == PcdRequest (PICC_REQALL, uPcd_ID))         {             //读卡亮灯             HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);             memset(uPcd_ID, 0, sizeof(uPcd_ID));                          PcdIdRead(uPcd_ID);             memcpy(&RFID_No,uPcd_ID,sizeof(RFID_No));                          char card[9];             char card_ascii[17];             sprintf(card, "%02X%02X%02X%02X",uPcd_ID[0],uPcd_ID[1],uPcd_ID[2],uPcd_ID[3]);             sprintf(card_ascii, "%02X%02X%02X%02X%02X%02X%02X%02X",card[0],card[1],card[2],card[3],card[4],card[5],card[6],card[7]);             sprintf(BH1750_send.Lux, "%s", card_ascii);             LCD_ShowString(30, 100, 100, 16, 24, "CardNo:");             LCD_ShowString(115, 100, 100, 16, 24, card);             LCD_ShowString(0, 150, 240, 16, 24, "                              ");                  LOS_TaskDelay(1000);          //下一个循环灭灯     HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);                    }         LOS_TaskDelay(3000);                      } }4)上报信息,Project2原本是不停的上报,修改成只有读到卡号才上报(这个地方实现得也不漂亮,我觉得正规得应该用LiteOS的队列来控制)5)北向应用接收卡号后的处理/// <summary> /// 订阅数据变化回调入口 /// </summary> [HttpPost] [Route("[action]")] public void DeviceDataChanged() { string inputbody ; using (var reader = new System.IO.StreamReader(HttpContext.Request.Body, Encoding.UTF8)) { inputbody = reader.ReadToEnd(); } _log.LogInformation("DeviceDataChanged:" + inputbody); var reqdata = JsonConvert.DeserializeObject<IoTDataChangedReq>(inputbody); if (reqdata.Service.ServiceId == "Clock") { _service.Welcome(reqdata.Service.Data["card_no"].ToString(), reqdata.DeviceId); } else if (reqdata.Service.ServiceId == "Sensor") { } }/// <summary> /// 检查卡号是否有学生 /// 并向设备发送欢迎词 /// </summary> /// <param name="rfidNo">卡号</param> /// <param name="deviceId">设备Id</param> public void Welcome(string rfidNo, string deviceId) { var student = new StudentDal().GetStudentByNo(rfidNo); string words; if (student == null) words = "The card is not registered";// $"此卡还未开通"; else { words = $"Welcome {student.Name} to school"; _ = SendSMS(student); } SetWelcome(words, deviceId); }private bool SetWelcome(string words, string deviceId) { var param = new IoTCmdReq { DeviceId = deviceId, Command = new IoTCmd { ServiceId = "Welcome", Method = "Set_Welcome", Paras = new Dictionary<string, object> { { "words", words } } }, CallbackUrl = "http://*/api/clock/CommandChanged", ExpireTime = 10, MaxRetransmit = 2 }; return SendDeviceCommands(param); }private bool SendDeviceCommands(IoTCmdReq param) { CheckToken(); var url = $"https://ip:port/iocm/app/cmd/v1.4.0/deviceCommands?appId={AppId}"; var body = JsonConvert.SerializeObject(param, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }); try { var html = helper.Post2(url, new StringContent(body), Token).GetAwaiter().GetResult(); var result = JsonConvert.DeserializeObject<IoTCmdResult>(html); var success = new List<IoTCmdStatus> { IoTCmdStatus.DELIVERED, IoTCmdStatus.PENDING, IoTCmdStatus.SENT, IoTCmdStatus.SUCCESSFUL }; return success.Contains(result.Status); } catch (Exception ex) { _log.LogError(ex, "SendDeviceCommands 异常"); return false; } }6)北向应用主动发消息/// <summary> /// 检查微信号是否绑定学生 /// 并向设备发送呼叫信息 /// </summary> /// <param name="openId">微信Id</param> public string Call(string openId) { var student = new StudentDal().GetStudentByOpenId(openId); if (student != null) { if (SetCall($"{student.Name}, {student.Relation} calls you home", student.DeviceId)) return "消息已经送到,您的宝贝马上出校门了"; else return "服务故障,请打电话联系老师"; } return "您还没有绑定学生信息,请先绑定"; }private bool SetCall(string content, string deviceId) { var param = new IoTCmdReq { DeviceId = deviceId, Command = new IoTCmd { ServiceId = "Call", Method = "Set_Call", Paras = new Dictionary<string, object> { { "content", content } } }, CallbackUrl = "http://ip:port/api/clock/CommandChanged", ExpireTime = 10, MaxRetransmit = 2 }; return SendDeviceCommands(param); }7)设备接到下发得消息后的处理int atiny_write_app_write(void *user_data, int len) {     printf("user_data=%s \r\n",user_data);     int msgId;//1=Set_Welcome;2=Set_Call     char cmd_data[len];//原始数据     char content[len]; //文本内容     char tmpbuf[1064] = {0};     char recvmid[4] = {0};//响应标识     memcpy(cmd_data,user_data,len);     atiny_str_to_hex(cmd_data,len,tmpbuf);     memcpy(recvmid, tmpbuf + 2, 4);  //printf("cmd_data[0]=%d \r\n",cmd_data[0]);         msgId = (int)cmd_data[0];//sprintf(msgId, "%d", cmd_data[0]);//此方式赋值不成功          memcpy(content, cmd_data+1, len-1);     content[len-1]='\0';     printf("msgId=%d,content=%s \r\n", msgId, content);     int start_x = (30 - (len - 1)) / 2;     if(start_x <= 0) start_x = 0;      else start_x = start_x * 8;//左侧起始点,使文字居中     if(start_x > 0 && (len-1) % 2 > 0)  start_x = start_x + 4;//有余数则差办个字          if(msgId == 1)//Set_Welcome     {                 LCD_ShowString(0, 150, 240, 16, 16, "                              ");         LCD_ShowString(start_x, 150, 240, 16, 16, content);     }     else if(msgId == 2)//Set_Call     {                 LCD_ShowString(0, 190, 240, 16, 16, "                              ");         LCD_ShowString(start_x, 190, 240, 16, 16, content);         //呼叫亮灯,延时3秒,灭灯         HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);         LOS_TaskDelay(3000);         HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);     }     else     {         /* //原路灯程序 */     }     (void)atiny_printf("write num19 object success\r\n");     return ATINY_OK; }最后还是想说,非常感谢华为这次培训课程,感谢华为老师们和小熊派的支持.源码下载为了完成任务,也下载了不少别人的代码,最后攒了一个自己的。这是完整的LiteOS工程。CSDN无法自己设置下载积分,如果下载不了的,可以在这里留言。https://download.csdn.net/download/shenlongju/11211226
  • [技术干货] 【趁热打“帖”】分享IoT在线训练营学后感
    Dear 华为云物联网团队:    你们好,经过五期的学习,我的感受有以下一些想法,如有不足的地方,请华为云的物联网大神不要见笑。1-   这种视频的讲解课程,后面有一个习题用来巩固我们基础知识就比较好,建议每一个视频有一个知识点的思维导图,方便各位同学梳理知识点;2-       视频课程结束的时候,可以提示一下或者留一下链接或者入口给我们去了解一下更多关于物联网知识的视频课程或者相对应的微认证和专业认证的地方;让我们可以多一些更多的深化知识的选择,而不是要求这次训练营一定要深化知识,只是我提供多一个路径给一些其他有需要的同学去深化自己的知识;3-       对视频的感觉,有一些视频,比如我记得我学习第二期(学会接口,感知万物数据)的时候就特别明显,觉得视频讲解得有点过快,我选择了0.75x的速度去看才能掌握好进度,视频虽然是精讲的好,但是还是得尽量可能的清晰,让大家能够很容易理解去做实验;4-       真的从整个方面去看,这次的课程时间比较短,这个真的非常好,尽量的短视频,知识精讲就好,现在大家没有那么多时间看长视频的了;5-       还有一点就是这次训练营全部是视频,有一些代码就需要现场看视频,然后截图下来,自己敲进去,这个真的比较不人性化,说的就是第二期,postman的使用的时候,这个也没有说清楚要让自己敲进去,这个起码还是得跟大家说清楚要自己敲进去的;强烈自己也有一个PDF文档的方便我们看着文档就可以做实验的操作文档,这个真的是很有必要的,这样比较快就可以实现自己的实验;6-       课程对华为云的liteos的讲解还是比较基础的,个人建议特别是华为云的这个liteos的特性,应该提供一个链接给我们,让我们更好滴去了解好华为云的这个lieteos系统,我们必须很好滴理解这个系统的架构才能更加深入使用它;7-       还有华为云的liteos这个系统的物联网的各个应用方面的用途,希望华为云能够更多滴展开跟我们说一下华为云物联网在这个系统的基础下实现了哪些成功的案例,可以方便我们更好相信该系统的实践的强大成功的地方;8-       这个课程的wiki系统真的大家用的想法不太多,强烈建议是否可以让这个wiki系统跟华为云的博客系统做一个同步的打通,就是我在这个课程写的wiki系统可以一键同步变成一个我的blog,然后作为一个读书笔记的wiki保存到我的博客上,下次我找我的读书笔记还是比较容易找到的,不然我在这个课程写的wiki,下次我要找不一定能找得到吧?wik和博客有的时候界限不是那么明显吧;是否容易两者的优点,做一个生态优化的呢?9-       评价也是比较简单,就是评分,然后就写文字写出来,真的要做比较好的评价,只是可以支持附件上传吧,有的时候有些评价需要截图更好说明的呢?10-   这次课程的体验真的非常棒,奖品真非常给力,真的非常感谢华为云的这次这么好的活动,能学习到东西,还有机会获取丰富的奖品,华为云的组织团队和小熊派供应商都非常给力,现在物联网的时代到来了,真心真的好像多参加华为云的活动,好好学习好liteos,期待在物联网的时代能够有自己一席之地!真的想给一万个赞给你们,华为云的团队们。反正我在公司是强烈推荐物联网这块的,期待可以理解更多,我现在都在构思深圳地铁站台 站厅的电视是否可以物联网互联的了,有合适的团队,欢迎沟通,最近我们深圳地铁在推物联网公章申请流程的了,使用电子公章等办公的办法;物联网就是下一个风口,期待我就是飞起来的那头猪。真心发自内心祝福华为云 越来越好,祝福华为云的物联网liteos能够全球流行像安卓系统一样!PS:这次活动详细参见:https://bbs.huaweicloud.com/forum/thread-15956-1-1.html,从这次的活动,可以学到的物联网的只是,个人是在构想用智慧路灯模块和红外传感器可以感受到人的到来,从而调整地铁下灯的亮度去省电,还有公路,特别高速公路上也可以用红外传感器等模块去实现灯的省电,调整光的光强,有人或者车过来就可以调整灯的光强从而节省电,环保,还有就是灯上面还可以装一个摄像头作为一个监控系统,也可以作为一个检测人或者车来的一个监控设备,感应设备;这次活动真的给我的冲击非常的大!期待可以和最努力的云,华为云一起努力野蛮狼性成长!!!                                                                                                                                                                                                  极度感恩华为云的猪                                                                                                                                                                                                       andyleung 
  • [分享交流] TensorFlow入门基础
    TensorFlow入门基础1.    TensorFlow概述TensorFlow是谷歌开源的第二代用于数字计算的软件库。它可以很好的支持深度学习的各种算法,但它的应用不局限于深度学习,可以支持多种计算平台,系统稳定性较高。TensorFlow拥有多层级结构,可部署于各类服务器、PC终端和网页并支持GPU和TPU高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究。TensorFlow由谷歌人工智能团队谷歌大脑(Google Brain)开发和维护,拥有包括TensorFlow Hub、TensorFlow Lite、TensorFlow Research Cloud在内的多个项目以及各类应用程序接口(Application Programming Interface, API)2.    TensorFlow特点灵活可扩展:TensorFlow在不同计算机上运行:小到智能手机,大到计算机集群都能扩展,可以立刻生成你的训练模型。多语言:支持C++,Python语言。GPU:虽然TensorFlow在大型计算机集群的并行处理中,运行性能略低于CNTK,但是在个人机器使用场景中,会根据机器配置自动选择CPU或GPU,更加友好与智能。多平台:TensorFlow生成的模型,可以满足更多使用者的需求。适用于Mac,Linux,Windows系统上开发。满足开箱即用的模型使用概念。运算能力强:利用了DAG图创建工作流图,优化了计算过程。分布式:目前原生支持的分布式深度学习框架不多,只有 TensorFlow、CNTK、DeepLearning4J、MXNet 等。在单 GPU 的条件下,绝大多数深度学习框架都依赖于 cuDNN,因此只要硬件计算能力或者内存分配差异不大,最终训练速度不会相差太大。但是对于大规模深度学习来说,巨大的数据量使得单机很难在有限的时间完成训练。而TensorFlow支持分布式训练。TensorFlow 的设计对不同设备间的通信优化得不是很好,其单机的 reduction 只能用 CPU 处理,分布式的通信使用基于 socket 的 RPC,而不是速度更快的 RDMA,所以其分布式性能可能还没有达到最优。3.    TensorFlow应用场景•    自动驾驶小车•    生成音乐•    图像识别•    语音识别•    语言模型•    **行为识别•    定理证明•    拿来玩马里奥赛车…4.    TensorFlow组成TensorFlow是由Tensor+Flow组成,Tensor即为张量,Flow为流动,名字的含义就是张量在流动5.    TensorFlow计算过程TensorFlow是一个通过计算图的形式来表述计算的编程系统,是以张量(tensor)在计算图(graph)上流动(flow)的方式实现和执行机器学习/深度学习算法的框架。计算过程如下:l  构建计算图:可以理解为前端工作,定义一个操作的集合,根据数据流,组织为有向无环图。操作包含:初始化、各种加乘、读取、赋值、网络前向反馈、计算loss、梯度反向传播等等。l  执行:可以理解为后端。在一个指定的gpu或是cpu上,通过Session.run()调度,运行计算图(C++)。一般是循环反复执行。l  使用有向图的节点和边共同描述数学计算。graph中的nodes代表数学操作,也可以表示数据输入输出的端点。边表示节点之间的关系,传递操作之间互相使用的多位数组(tensors),tensor在graph中流动——这也就是TensorFlow名字的由来。一旦节点相连的边传来了数据流,节点就被分配到计算设备上异步的(节点间)、并行的(节点内)执行。  6.    TensorFlow架构TensorFlow的内核引擎使用C++实现的,效率是很高的。TensorFlow的内核封装实现了NN、CNN等基本机器学习算法。前端应用层支持Python或C++,一般用Python(AI领域第一编程语言)。在应用层,如果使用了其他的Python耗时操作(如数据预处理等),可能效率会比较低,但这不是TensorFlow造成的。7.    TensorFlow安装推荐使用pycharm + anaconda,安装过程大家可以自行查询8.    TensorFlow入门例子''' 1.引入tensorflow 2.定义常量、变量 3.创建Session会话 4.调用Session中的run()方法来运行,得出结果 5.关闭seession ''' #引入tensorflow import tensorflow as tf #定义常量 hello = tf.constant("hello,tensorflow") a = tf.constant(10) b = tf.constant(20) with tf.Session() as sess:     print(sess.run(hello))     print(sess.run(a + b))