师傅领进门之6步教你跑通一个AI程序!

2023-10-27

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由云计算基础发表于云+社区专栏

源码下载地址请点击原文查看。

初学机器学习,写篇文章mark一下,希望能为将入坑者解点惑。本文介绍一些机器学习的入门知识,从安装环境到跑通机器学习入门程序MNIST demo。

内容提纲:

  1. 环境搭建
  2. 了解Tensorflow运行机制
  3. MNIST(手写数字识别 ) softmax性线回归
  4. MNIST 深度卷积神经网络(CNN)
  5. tools 工具类
  6. CPU & GPU & multi GPU
  7. 学习资料

1 环境搭建 (Windows)

  • 安装虚拟环境 Anaconda,方便python包管理和环境隔离。

Anaconda3 4.2 https://www.anaconda.com/downloads,自带python 3.5。

  • 创建tensorflow隔离环境。打开Anaconda安装后的终端Anaconda Prompt,执行下面命令
conda create -n tensorflow python=3.5 #创建名为tensorflow,python版本为3.5的虚拟环境
activate tensorflow #激活这个环境  
deactivate #退出当前虚拟环境。这个不用执行

CPU 版本

pip install tensorflow #通过包管理来安装
pip install whl-file #通过下载 whl 文件安装,tensorflow-cpu安装包:http://mirrors.oa.com/tensorflow/windows/cpu/tensorflow-1.2.1-cp35-cp35m-win_amd64.whl, cp35是指python3.5

GPU 版本。我的笔记本是技持NVIDIA显卡的,可以安装cuda,GPU比CPU快很多,不过笔记本的显存不大,小模型还可以跑,大模型建议在本地用CPU跑通,到Tesla平台上训练。

img

注意点:选择正确的 CUDA 和 cuDNN 版本搭配,不要只安装最新版本,tensorflow可能不支持。

目前Tensorflow已支持到CUDA 9 & cuDNN 7,之前本人安装只支持CUDA 8 & cuDNN 6,所以用是的:

CUDA8.1 https://developer.nvidia.com/cuda-80-ga2-download-archive

cudnn 6 https://developer.nvidia.com/cudnn ,将cudnn包解压,把文件放到cuda安装的对应目录中,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0,bin对应bin,include对应include,再添加bin目录到**环境变量**path中。

pip install tensorflow-gpu #通过包管理来安装
pip install whl-file #http://mirrors.oa.com/tensorflow/windows/gpu/tensorflow_gpu-1.2.1-cp35-cp35m-win_amd64.whl 
  • 一些python工具包安装。用到啥安啥就行, pip install,不行就找源码编译安装
(tensorflow) D:\> pip install opencv-python   #opencv, tensoflow 虚拟环境中
(tensorflow) D:\> pip install scipy    #图片读取写入,scipy.misc.imread
(tensorflow) D:\> pip install Pillow   #PIL/Pillow,这里有个坑,压缩过的PNG图,在1.x版本解析会出现透明通道质量下降,升级

2 了解Tensorflow运行机制

  • 上代码。注意注释说明
import tensorflow as tf
hello_world = tf.constant('Hello World!', dtype=tf.string) #常量tensor
print(hello_world) #这时hello_world是一个tensor,代表一个运算的输出
#out: Tensor("Const:0", shape=(), dtype=string)
hello = tf.placeholder(dtype=tf.string, shape=[None])#占位符tensor,在sess.run时赋值
world = tf.placeholder(dtype=tf.string, shape=[None])
hello_world2 = hello+world #加法运算tensor
print(hello_world2)
#out: Tensor("add:0", shape=(?,), dtype=string)
#math
x = tf.Variable([1.0, 2.0]) #变量tensor,可变。
y = tf.constant([3.0, 3.0])
mul = tf.multiply(x, y) #点乘运算tensor
#logical
rgb = tf.constant([[[255], [0], [126]]], dtype=tf.float32)
logical = tf.logical_or(tf.greater(rgb,250.), tf.less(rgb, 5.))#逻辑运算,rgb中>250 or <5的位置被标为True,其它False
where = tf.where(logical, tf.fill(tf.shape(rgb),1.), tf.fill(tf.shape(rgb),5.))#True的位置赋值1,False位置赋值5
# 启动默认图.
# sess = tf.Session()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())#变量初始化
    result = sess.run(hello_world) #Fetch, 获取tensor运算结果
    print(result, result.decode(), hello_world.eval())#`t.eval()` is a shortcut for calling  `tf.get_default_session().run(t)`.
    #out: b'Hello World!' Hello World! b'Hello World!' #前辍'b'表示bytestring格式,decode解成string格式
    print(sess.run(hello, feed_dict={hello: ['Hello']}))
    #out: ['Hello']
    print(sess.run(hello_world2, feed_dict={hello: ['Hello'], world: [' World!']}))#Feed,占位符赋值
    #out: [b'Hello World!']
    print(sess.run(mul))
    #out: [ 3.  6.]
    print(sess.run(logical))
    #out: [[[ True] [ True] [False]]] #rgb中>250 or <5的位置被标为True,其它False
    print(sess.run(where))
    #out: [[[ 1.] [ 1.] [ 5.]]] #True的位置赋值1,False位置赋值5
#sess.close()#sess如果不是用with方式定义,需要close
  • Tensor。是一个句柄,代表一个运算的输出,但并没有存储运算输出的结果,需要通过tf.Session.run(Tensor)或者Tensor.eval()执行运算过程后,才能得到输出结果。A Tensor is a symbolic handle to one of the outputs of an Operation,It does not hold the values of that operation’s output, but instead provides a means of computing those values in a TensorFlow.
  • Tensorflow运行过程:定义计算逻辑,构建图(Graph) => 通过会话(Session),获取结果数据。基本用法参见链接。

3 MNIST(手写数字识别 ) softmax性线回归

  • 分析

MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:

img

它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1。

数据集图片大小28x28,单通道灰度图。存储样式如下:

img

MNIST手写数字识别的目的是输入这样的包含手写数字的28x28的图片,预测出图片中包含的数字。

softmax线性回归认为图片中数字是N可能性由图像中每个像素点用

img

表示是 数字 i 的可能性,计算出所有数字(0-9)的可能性,也就是所有数字置信度,然后把可能性最高的数字作为预测值。

evidence的计算方式如下:

img

其中

img

代表权重,

img

代表数字 i 类的偏置量,j 代表给定图片 x 的像素索引(0~28x28=784),用于像素求和。即图片每个像素值x权重之和,再加上一个偏置b,得到可能性值。

引入softmax的目的是对可能性值做归一化normalize,让所有可能性之和为1。这样可以把这些可能性转换成概率 y

img

img

img

  • 开始实现

数据

X样本 size 28x28 = 784

img

Y样本 ,样式如

img

img

读取

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) #total 55000,one_hot方式,图片x格式为1维数组,大小784
batch_xs, batch_ys = mnist.train.next_batch(batch_size) #分batch读取

构建图(Graph)

Inference推理,由输入 x 到输出预测值 y 的推理过程

img

img

x = tf.placeholder(tf.float32, [None, 784], name="input")#None表示batch size待定
with tf.variable_scope("inference"):#定义作用域,名子inference
    W = tf.Variable(tf.zeros([784, 10])) #初值为0,size 784x10
    b = tf.Variable(tf.zeros([10])) #初值为0 size 10
    y = tf.matmul(x, W) + b #矩阵相乘

Loss 损失函数,分类一般采用交叉熵,这里用的是softmax交交叉熵。交叉熵是用来度量两个概率分布间的差异性信息,交叉熵公式如下:

img

with tf.variable_scope("loss"):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y), name="loss")
    #softmax交叉熵公式: z * -log(softmax(x)) + (1 - z) * -log(1 - softmax (x)) # x: logits, z: label

计算loss的方法有很多种,常见的还有L1 loss 、L2 loss、sigmoid 交叉熵、联合loss、自定义loss…

Accuracy 准确率,预测值与真实值相同的概率。矩阵相乘输出y值是一个数组,tf.argmax函数可能从数据中找出最大元素下标,预测值的最大值下标和真值的最大值下标一致即为正确。

with tf.variable_scope("accuracy"):
    accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)), tf.float32), name="accuracy")

Training 训练,训练的目的是让Loss接近最小化,预测值接近真值,Tensorflow通过优化器Optimizers来实现。**在y = Wx+b中,W、b在训练之初会赋初值(随机 or 0),经过Optimizer不短优化,Loss逼近最小值,使W、b不断接近理想值。**W、b一起共784x10+10个参数。

train_step = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(loss)

minimize函数:更新参数,让Loss最小化,包含两个步骤:计算梯度;更新参数。

grad_var = compute_gradients(loss) # return (gradient, variable) pairs
apply_gradients(grad_var) #沿着参数的梯度反方向更新参数,让Loss变小

GradientDescentOptimizer:梯度下降算法优化器, Tensorflow实现的是SGD(随机梯度下降)。其缺点是依赖当前batch,波动较大。

其它一些增强版Optimizers:参考链接。 MomentumOptimizer、AdadeltaOptimizer、AdamOptimizer、RMSPropOptimizer、AdadeltaOptimizer …

Session:Tensorflow需要通过Session(会话)来执行推理运算,有两种创建方式,两者差别在于InteractiveSession会将自己设置为默认session,有了默认session,tensor.eval()才能执行。

sess = tf.Session()
sess = tf.InteractiveSession()

也可以通过下设置默认session:

with sess.as_default(): xx.eval()
with tf.Session() as sess: xx.eval()

配置gpu相关session参数:

sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)#允许没有gpu或者gpu不足时用软件模拟
sess_config.gpu_options.allow_growth = True #动态申请显存。不加会申请全部,导致其他训练程序不能运行
#sess_config.gpu_options.per_process_gpu_memory_fraction = 0.8 #按比例申请显存
sess = tf.InteractiveSession(config=sess_config)

一个网络的训练过程是一个不断迭代(前向+反向)的过程。前向算法由前向后计算网络各层输出,反向算法由后向前计算参数梯度,优化参数,减小Loss。流程如图:

img

注意:每隔一段时间输出一下网络Loss和Accuracy,查看效果。每隔一段时间缓存一下网络参数,防止被突然中断,可再恢复。

模型参数的保存与恢复:

​ check point:默认保存方式。

​ pb:mobile使用。

​ npz:字典保存方式,{name: value}, numpy的一种保存方式。对参数按名保存,按名恢复。save和restore方法自己控制,可以选择性保存和恢复。参见附近代码中【tools.py】save_npz_dict & load_and_assign_npz_dict方法。

saver = tf.train.Saver(max_to_keep = 3, write_version = 2)
save_path = saver.save(sess, FLAGS.out_model_dir+'/model.ckpt')# check point方式
output_graph_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, output_node_names=['output'])#指定输出节点名称,这个需要在网络中定义
with tf.gfile.FastGFile(FLAGS.out_model_dir+'/mobile-model.pb', mode='wb') as f:
    f.write(output_graph_def.SerializeToString()) #pb方式
tools.save_npz_dict(save_list=tf.global_variables(), name=FLAGS.out_model_dir+'/model.npz', sess=sess) #pnz方式

​ 恢复:

#check point
saver = tf.train.Saver(max_to_keep = 3, write_version = 2)
model_file=tf.train.latest_checkpoint(FLAGS.log_dir)
if model_file:
     saver.restore(sess, model_file)
#npz
tools.load_and_assign_npz_dict(name=FLAGS.log_dir+'/model.npz', sess=sess))打印网络中各参数信息:方便查看网络参数是否正确。
def print_all_variables(train_only=False):
    if train_only:
        t_vars = tf.trainable_variables()
        print("  [*] printing trainable variables")
    else:
        t_vars = tf.global_variables()
        print("  [*] printing global variables")
    for idx, v in enumerate(t_vars):
        print("  var {:3}: {:15}   {}".format(idx, str(v.get_shape()), v.name))
  • 可视化。Tensorflow提供tensorboard可视化工具,通过命令打开web服务,由浏览器查看,输入网址http://localhost:6006
tensorboard --logdir=your-log-path #path中不要出现中文
# 需要在训练过程指定相应log路径,写入相关信息
# 参考附件【sample.py】中summary、writer相关关键字代码。

Graph可视化:

img

训练过程可视化:

img

batch size = 128, 训练集,验证集。可以看到loss在收敛,accuracy在提高。由于训练集曲线反应的是当前batch的loss和accuracy,batch size相对不高,抖动较大。而验证集是全部图片进行测试,曲线较平滑。

4 MNIST深度卷积神经网络(CNN)

Softmax性线回归网络中,输出y是输入x的线性组合,即y = Wx+b,这是线性关系。在很多问题中其解法并非线性关系能完成的,在深度学习,能过能多层卷积神经网络组合非线性激活函数来模拟更复杂的非线性关系,效果往往比单一的线性关系更好。先看深度卷积神经网络(CNN,Convolutional Neural Network)构建的MNIST预测模型,再逐一介绍各网络层。

  • MNIST CNN Inference推理图。从输入到输出中间包含多个网络层:reshape、conv卷积、pool池化、fc全链接、dropout。自底向上输入原始图片数据x经过各层串行处理,得到各数字分类概率预测输出y。Inference的结果转给loss用作迭代训练,图中的

img

可以看出用的是AdamOptimizer优化器。

img

  • reshape 变形,对数据的逻辑结构进行改变,如二维变四维:[1, 784] => [1, 28, 28, 1],数据存储内容未发生改变。这里由于输入数据存储的手写图片是一维数据,转成[batch_size, height, width, channels]格式
    with tf.name_scope('reshape'): #scope
        inputs = tf.reshape(inputs, [-1, 28, 28, 1])
        #[batch_size, height, width, channels], batch size=-1表示由inputs决定,
        #batch_size=inputs_size/(28x28x1)
  • conv2d 卷积, 卷积核(yellow)与Image元(green)素相乘,累加得到输出元素值(red)。Image的每个Channel(通道)都对应一个不同的卷积核,Channel内卷积核参数共享。所有输入channel与其kernel相乘累加多层得到输出的一个channel值。输出如有多个channel,则会重复多次,kernel也是不同的。所以会有input_channel_count * output_channel_count个卷积核在卷积层中训练的是卷积核
def conv2d(x, W): #W: filter [kernel[0], kernel[1], in_channels, out_channels]
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

tf.nn.conv2d:

img

img

data_format: input和output数据的逻辑结构,NHWC : batch height width channel。NCHW: batch channel height width。常用的是NHWC格式;在一些输入数据中各通道数据分开存放,这种更适合NCHW。

input:输入,data_format=NHWC时,shape为batch, in_height, in_width, in_channels,Tensor。

filter:卷积核,shape为f**ilter_height, filter_width, in_channels, out_channels**,共有in_channels*out_channels个filter_height, filter_width的卷积核,输入输出channel越多,计算量越大。

strides: 步长,shape为1, stride_h, stride_w, 1,通常stride_h和stride_w相等,表示卷积核延纵横方向上每次前进的步数。上gif图stride为1。

padding:卷积计算时数据不对齐时填充方式,VALID:丢弃多余;SAME:两端补0,让多余部分可被计算。

img

output:输出,shape为batch, out_height, out_width, out_channels

output[b, i, j, k] =
    sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] *
                    filter[di, dj, q, k]
  • 激活函数,与卷积搭配使用。激活函数不是真的要去激活什么,在神经网络中,激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。

img

tf.nn.relu即是激活函数,对卷积输出作非线性处理,其函数如下:

img

img

其它还有如sigmoid:

img

img

tanh:

img

img

  • Pool池化,有最大池化和平均值池化,计算与卷积计算类似,但无卷积核,求核所覆盖范围的最大值或平均值,输入channel对应输出channel,没有多层累加情况。输入与输出 channel数相同,输出height、width取决于strides。

img

img

if is_max_pool:
    x = tf.nn.max_pool(x, [1,kernel[0],kernel[1],1], strides=[1,stride[0],stride[1],1], padding=padding, name='pool')
else:
    x = tf.nn.avg_pool(x, [1,kernel[0],kernel[1],1], strides=[1,stride[0],stride[1],1], padding=padding, name='pool')
  • Dropout,随机删除一些数据,让网络在这些删除的数据上也能训练出准确的结果,让网络有更强的适应性,减少过拟合
x = tf.nn.dropout(x, keep_prob) #keep_prob 保留比例,keep_prob=1.0表示无dropout
  • BN(batch normalize),批规范化。Inference中未标出,demo中未使用,但也是网络中很常用的一层。BN常作用在非线性映射前,即对Conv结果做规范化。一般的顺序是 卷积-> BN -> 激活函数。

BN好处:提升训练速度,加快loss收敛,增加网络适应性,一定程序的解决反向传播过程中的梯度消失和爆炸问题。详细请戳。

  • FC(Full Connection)全连接,核心是矩阵相乘

img

,softmax性线回归就是一个FC。在CNN中全连接常出现在最后几层,用于对前面设计的特征做加权和。Tensorflow提供了相应函数tf.layers.dense。

  • 日志,下图打印了模型中需要训练的参数的shape 和 各层输出数据的shape(batch_size=1时),附件【tool.py】中有相关代码。目的是方便观自己搭的网络结构是否符合预期。 数据由[1x784] -reshape-> [1x28x28x1](batch_size, height, width, channels) -conv-> [1x28x28x32] -pool-> [1x14x14x32] -conv-> [1x14x14x64] -pool-> [1x7x7x64] -fc-> [1x1024] -fc-> [1x10](每类数字的概率)

img

  • 训练效果,详细代码参考附件【cnn.py】

img

  • 一个网上的可视化手写识别DEMOhttp://scs.ryerson.ca/~aharley/vis/conv/flat.html
  • CNN家族经典网络,如LeNet,AlexNet,VGG-Net,GoogLeNet,ResNet、U-Net、FPN。它们也都是由基本网络层元素(上述介绍)堆叠而成,像搭积木一样。

VGG,如下图,非常有名的特征提取和分类网络。由多层卷积池化层组成,最后用FC做特征融合实现分类,很多网络基于其前几层卷积池化层做特征提取,再发展自己的业务。

img

5 tool工具类

【tool.py】是一个自己基于tensorflow二次封装的工具类,位于附件中。好处是以后编程更方便,代码结构更好看。网上也有现成的开源库,如TensorLayer、Keras、Tflearn,自己封装的目的是更好的理解tensorflow API,自己造可控性也更强一些,如果控制是参数是否被训练、log打印。

下图是MNIST CNN网络的Inference推理代码:

img

6 CPU & GPU & multi GPU

  • CPU, Tensorflow默认所有cpu都是/cpu:0,默认占所有cpu,可以通过代码指定占用数。
sess_config = tf.ConfigProto(device_count={"CPU": 14}, allow_soft_placement=True, log_device_placement=False)
sess_config.intra_op_parallelism_threads = 56
sess_config.inter_op_parallelism_threads = 56
sess = tf.InteractiveSession(config=sess_config)
  • GPU,Tensorflow默认占用/gpu:0, 可通过指定device来确定代码运行在哪个gpu。下面
with tf.device('/device:GPU:2'):
   a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
   b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
   c = tf.matmul(a, b)
#下面的代码配置可以避免GPU被占满,用多少内存占多少
sess_config = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)
sess_config.gpu_options.allow_growth = True
sess_config.gpu_options.per_process_gpu_memory_fraction = 0.8
sess = tf.InteractiveSession(config=sess_config)

多块GPU时,可以通过在终端运行下面指令来设置CUDA可见GPU块来控制程序使用哪些GPU。

export CUDA_VISIBLE_DEVICES=2,3
  • 多GPU使用,在Tensorflow中多GPU编程比较尴尬,资料较好,代码写起比较复杂,这一点不如Caffe。

在Tensorflow中你需要自己写代码控制多GPU的loss和gradient的合并,这里有个官方例子请戳。自己也写过多GPU的工程,附件代码【tmp-main-gpus-不可用.py】可做参考,但此处不可用,来自它工程。

img

7 学习资料

收藏了一些机器学习相关资料,分享一下。自己也只看过很小一部分,仍在学习中….

问答
如何使用人工智能合成人声?
相关阅读
多个场景中的AI落地实践
AI学院 | 人工智能基本知识概览
人工智能,天使还是魔鬼
云学院 · 课程推荐 | 腾讯专项技术测试组长,结合8年经验为你细说冷热分离法则

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

师傅领进门之6步教你跑通一个AI程序! 的相关文章

随机推荐

  • spring-data-JPA repository自定义方法规则

    Spring Data JPA框架在进行方法名解析时 会先把方法名多余的前缀截取掉 比如find findBy read readBy get getBy 然后对剩下的部分进行解析 假如创建如下的查询 findByUserDepUuid 框
  • Linux系统管理(五)企业存储的基本管理

    目录 一 设备识别 二 设备挂载 三 设备中文件的查找 四 分区 五 swap分区 六 磁盘配额 一 设备识别 添加硬盘 设备接入系统后都是以文件的形式存在 设备文件名称 串口硬盘 SATA SAS USB dev sda dev sdb
  • 文件共享 无法访问,你可能没有权限使用网络资源,请与这台服务器的管理员联...

    文件或文件夹设置成共享之后 通过 运行 如运行 gt 192 168 0 123 进行访问 报错 192 168 0 123无法访问 你可能没有权限使用网络资源 请与这台服务器的管理员联系 这问题碰到好几回了 每次都是同事帮忙解决的 这次又
  • 什么是xxl-job?

    xxl job是一款开源的分布式任务调度框架 主要用于解决大规模分布式任务的调度和执行问题 它提供了任务调度中心 执行器和任务日志等组件 可以实现任务的定时调度 动态添加和删除任务 任务执行情况的监控和日志记录等功能 xxl job的作用主
  • HTML <ul> 标签

    实例 无序 HTML 列表 ul li Coffee li li Tea li li Milk li ul ul 标签定义无序列表 浏览器支持 元素 Chrome IE Firefox Safari Opera ul Yes Yes Yes
  • cad汉仪长仿宋体_长仿宋体字体下载 cad工程机械绘图工程制图国标字体下载

    做CAD很多时候要用到国标字体 CAD制图上用的国标字体一般就是长仿宋体 特此小编给大家分享 ttf格式的cad工程机械绘图工程制图国标字体下载 长仿宋体字体一般是专门用来做cad工程机械绘制效果图中使用 希望大家喜欢 界面预览图 在很多专
  • zlib库自定义接口封装

    zlib库自定义接口封装 zlib封装类说明 编译zlib库 编译自定义接口静态库 测试代码 代码 文件链接 zlib封装类说明 实现对文件以及文件夹的压缩解压缩 zip unzip h ifndef ZIP UNZIP H define
  • 《剑指offer》:编程实现字符串到整数的装换,模拟实现函数atoi

    题目描述 编程实现字符串到整数的转换 例如输入字符串 123456 输出整数12345 函数atoi atoi 是把字符串转换成整型数的一个函数 包含在头文件stdlib h中 函数原型 int atoi const char nptr 参
  • 电机控制里的谐波和逆变器非线性探讨

    电机控制里的谐波或逆变器非线性探讨 一 逆变器非线性第一个主要原因是死区时间及器件延迟时间 二 逆变器非线性第二原因是功率管的压降 三 逆变器的非线性会引起零电流箝位现象 导致电流波形不够正旋 增大了谐波干扰 并且在一个周期中会有6次电流畸
  • 诚之和:使用Java+Swing实现医院管理系统的实战练习 附完整实例代码

    本篇文章将和大家分享使用Java的Swing工具类来完成医院管理系统的实战练习 有兴趣的小伙伴们可以一起实操学习一下 本文内容有助于大家对于Java的学习和理解 一 系统介绍 本系统实现的以下功能 管理员功能 登录系统 病人信息的增删改查
  • 写一个手机类,属性:品牌brand,价格price 行为:打电话Call,发短信Message,打游戏Game 要用到this和Private的知识点

    初写手机类 这个程序是初步的程序 还有很多细节没补上 等到学到后面再逐渐完善了 class Demond Phone public static void main String args Phone p1 new Phone p1 set
  • centos8 网卡无法启动,且无ip

    centos8 网卡无法启动 且无ip 1 NetworkManger未运行 错误 网络管理器 NetworkManager 未运行 解决 将NetworkManger设置为开机自启动 systemctl enable NetworkMan
  • 《Stable Diffusion WebUI如何下载模型》

    接上一个教程 现在开始使用Stable Diffusion 自己训练模型太花时间了 直接下载别人训练好的模型可以省很多事 左上面stable Diffusion checkpoint就是我们的模型 现在里面什么都没有 1 点击选择上面的Ci
  • map,filter,some,every,find方法的区别(通俗易懂)

    map filter some every都是原数组不受改变 而foreach是在原数组上改变 map 返回新数组 在原数组上进行数据处理 只会在原有数组上元素内容改变 数组长度不变 filter 返回新数组 在原数组上判断是否满足条件来进
  • 结构体计算大小与位域计算大小

    结构体的大小计算 原则一 结构体的元素按顺序存储 结构体成员的偏移量必须是成员大小的整数倍 原则二 结构体大小是所有成员大小的整数倍 除了内部结构体和数组 看例子比较快理解 以下是自己的理解 指针的占字节数要看是32还是64位 32占4字节
  • 马士兵_JAVA自学之路

    JAVA自学之路 一 学会选择 为了就业 不少同学参加各种各样的培训 决心做软件的 大多数人选的是java 或是 net 也有一些选择了手机 嵌入式 游戏 3G 测试等 那么究竟应该选择什么方向呢 我的意见是 不要太过相信各种培训机构或是抢
  • 解决:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x81 in position 18: illegal multibyte sequence

    意思就是 UnicodeDecodeError gbk 编解码器无法解码位置18中的字节0x81 非法的多字节序列 这是我使用python发送邮件的时候出现的报错信息 我编码格式使用的是utf 8并不是gbk 但是却无法解码 于是我回头看之
  • 计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家...

    在使用win7系统电脑的时间一长 出现的电脑故障也就会越多 这大多数都是用户自己所造成的 例如有用户的win7系统在运行过程中总是会出现严重卡顿的情况 这让许多用户都感到很难受 那么win7卡顿严重怎么解决呢 下面小编就来告诉大家win7运
  • shineblink ZE08K-CH2O甲醛测量

    甲醛传感器 一 本例程实现功能 二 传感器介绍 三 接线图 四 完整代码 五 代码运行结果 一 本例程实现功能 通过Core连接甲醛传感器 读取传感器的值 并打印输出结果 二 传感器介绍 三 接线图 注意 传感器的 5 引脚也可以不用连接到
  • 师傅领进门之6步教你跑通一个AI程序!

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由云计算基础发表于云 社区专栏 源码下载地址请点击原文查看 初学机器学习 写篇文章mark一下 希望能为将入坑者解点惑 本文介绍一些机器学习的入门知识 从安装环境到跑通机器学习入