昇思25天学习打卡营第9天|静态图模式的深度剖析与应用指南

目录

背景介绍

动态图模式

静态图模式

静态图模式的使用场景

静态图模式开启方式

基于装饰器的开启方式

基于context的开启方式

静态图的语法约束

JitConfig配置选项

静态图高级编程技巧


背景介绍


        AI 编译框架主要包含两种运行模式,即动态图模式与静态图模式。在默认状况下,MindSpore 是以动态图模式进行运行的,不过同时也支持通过人工操作切换为静态图模式。

动态图模式

        动态图的显著特点在于计算图的构建和计算同步进行(Define by run),这与 Python 的解释执行方式相契合。当在计算图中定义一个 Tensor 时,其值会即刻被计算并确定,所以在调试模型时颇为便捷,能够实时获取中间结果的值。然而,由于所有节点都需保存,致使难以对整个计算图予以优化。

        在 MindSpore 里,动态图模式又称作 PyNative 模式。鉴于动态图的解释执行特性,在脚本开发以及网络流程调试阶段,建议使用动态图模式进行调试。若需手动控制框架采用 PyNative 模式,可通过以下代码来构建网络。

        使用 MindSpore 框架构建了一个简单的神经网络模型,并对输入数据进行了前向传播计算,最后打印输出结果。

        代码如下:

import numpy as np  
import mindspore as ms  
from mindspore import nn, Tensor  
ms.set_context(mode=ms.PYNATIVE_MODE)  # 使用set_context进行动态图模式的配置  
class Network(nn.Cell):  def __init__(self):  super().__init__()  self.flatten = nn.Flatten()  self.dense_relu_sequential = nn.SequentialCell(  nn.Dense(28*28, 512),  nn.ReLU(),  nn.Dense(512, 512),  nn.ReLU(),  nn.Dense(512, 10)  )  def construct(self, x):  x = self.flatten(x)  logits = self.dense_relu_sequential(x)  return logits  
model = Network()  
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))  
output = model(input)  
print(output) 

        分析:首先,成功导入了所需的相关库,这里面有 numpy 以及 mindspore ,还有 mindspore 中的部分重要模块。

        紧接着,定义了一个被命名为 Network 的类,此类别继承自 nn.Cell 。在该类的初始化方法 init 当中,精心定义了一系列的神经网络层,其中涵盖了展平层 Flatten ,以及一个由多层全连接和激活函数所构成的序列 nn.SequentialCell 。

        在 construct 方法里,清晰地定义了前向传播的计算逻辑。具体来说,先是对输入数据实施展平操作,随后通过先前定义好的序列层来进行计算,从而获取到预测的 logits 。

        随后,创建了 Network 类的实例 model ,并且成功生成了一个输入张量 input 。

        最后,将这个输入张量传递进模型展开计算,进而得到输出 output ,并把这一结果予以打印输出

        运行结果:

[[ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  
...  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]  [ 0.16246006 -0.11432456  0.04079182  0.16045687  0.01581723  0.00070624  0.05681457 -0.02252093 -0.05198406 -0.02421071]] 

静态图模式

        相较于动态图来说,静态图具有一个显著的特点,那便是将计算图的构建与实际的计算过程相互分离(Define and run)。至于静态图模式的运行原理,大家可以参考静态图语法支持的相关内容。

        在 MindSpore 当中,静态图模式还被称作 Graph 模式。处于 Graph 模式之下,借助于图优化、计算图整图下沉等一系列技术,编译器能够针对整个计算图展开全局性的优化操作,进而获取较为出色的性能表现。所以,这种模式相对而言更适合网络结构固定并且对性能要求较高的场景。

        倘若需要手动把控框架采用静态图模式,能够通过如下代码来进行网络的构建:成功定义了一个神经网络模型 Network ,并针对输入数据实施了前向传播以计算输出。接下来,将介绍运用 mindspore 框架构建并运行一个简易神经网络模型的具体方法。

        代码如下:

import numpy as np  
import mindspore as ms  
from mindspore import nn, Tensor  
ms.set_context(mode=ms.GRAPH_MODE)  # 使用set_context进行运行静态图模式的配置  
class Network(nn.Cell):  def __init__(self):  super().__init__()  self.flatten = nn.Flatten()  self.dense_relu_sequential = nn.SequentialCell(  nn.Dense(28*28, 512),  nn.ReLU(),  nn.Dense(512, 512),  nn.ReLU(),  nn.Dense(512, 10)  )  def construct(self, x):  x = self.flatten(x)  logits = self.dense_relu_sequential(x)  return logits  
model = Network()  
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))  
output = model(input)  
print(output)  

        分析:首先导入了必要的库,如 numpy 、mindspore 等,并配置为静态图模式。

        然后定义了一个名为 Network 的类,它继承自 nn.Cell 。在 __init__ 方法中,初始化了一些网络层,包括展平层 nn.Flatten 和一个包含多个全连接层及激活函数的序列 nn.SequentialCell 。

        在 construct 方法中定义了前向传播的计算逻辑,先对输入进行展平操作,然后通过定义的序列层进行计算得到 logits 。

        接着创建了 Network 类的实例 model ,并生成一个输入张量 input 。

        最后将输入通过模型进行计算得到输出 output 并打印。

        运行结果:

[[ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  
...  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]  [ 0.08111228 -0.06155853 -0.16565546  0.05599653 -0.10597651 -0.13046513  0.05319815  0.13381606  0.15450898 -0.04248318]]  

        

静态图模式的使用场景


        MindSpore 编译器主要聚焦于 Tensor 数据的计算及其微分处理。故而,运用 MindSpore API 以及基于 Tensor 对象的操作,采用静态图编译优化会更为适宜。其他操作虽说能够部分纳入图编译,然而实际的优化效果却较为有限。再者,静态图模式所具有的先编译后执行的特性,致使其存在编译耗时的情况。所以,倘若函数无需多次执行,那么利用静态图来加速或许并无太大意义。

静态图模式开启方式


基于装饰器的开启方式

        MindSpore 提供了 jit 装饰器,能够通过对 Python 函数或者 Python 类的成员函数进行修饰,使其被编译为计算图,借由图优化等技术来提升运行速度。此时,我们能够简便地针对期望进行性能优化的模块实施图编译加速,而模型的其他部分,依旧采用解释执行的方式,从而不会丧失动态图的灵活性。不管全局 context 是设定为静态图模式还是动态图模式,被 jit 修饰的部分始终会以静态图模式运行。

        当需要对 Tensor 的某些运算进行编译加速时,可以在其定义的函数上运用 jit 装饰器,在调用该函数时,此模块会自动被编译成静态图。需要留意的是,jit 装饰器仅能用于修饰函数,无法对类进行修饰。jit 的使用示例如下:

        即使用 MindSpore 框架构建了一个神经网络 Network ,然后使用 ms.jit 装饰器定义了一个名为 run 的函数,在这个函数中创建了 Network 模型实例,并将输入数据 input 传入模型进行计算,最后打印输出结果。

        代码如下:

import numpy as np  
import mindspore as ms  
from mindspore import nn, Tensor  
class Network(nn.Cell):  def __init__(self):  super().__init__()  self.flatten = nn.Flatten()  self.dense_relu_sequential = nn.SequentialCell(  nn.Dense(28*28, 512),  nn.ReLU(),  nn.Dense(512, 512),  nn.ReLU(),  nn.Dense(512, 10)  )  def construct(self, x):  x = self.flatten(x)  logits = self.dense_relu_sequential(x)  return logits  input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))  
@ms.jit  # 使用ms.jit装饰器,使被装饰的函数以静态图模式运行  
def run(x):  model = Network()  return model(x)  
output = run(input)  
print(output)  

        分析:首先,定义了一个名为 Network 的类,继承自 nn.Cell ,在类中初始化了一些层,包括 Flatten 和一系列的 Dense 与 ReLU 层。

        然后,定义了一个输入 input ,它是一个 Tensor 类型的数据。

        接着,使用 ms.jit 装饰器修饰 run 函数,这意味着在运行 run 函数时,其中的操作会以静态图模式进行优化和执行。

        在 run 函数内部,创建了 Network 模型的实例 model ,并将 input 传入模型计算得到结果并返回。

        最后,将 run 函数的输出打印出来。

        运行结果:

[[ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  
...  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]  [ 0.0252679   0.0036834   0.08489509  0.07125469  0.19286017 -0.01487035  -0.04551143  0.1177191  -0.00667884  0.02147292]]  

        除使用修饰器外,也可使用函数变换方式调用jit方法,示例如下:

        代码如下:

import numpy as np  
import mindspore as ms  
from mindspore import nn, Tensor  
class Network(nn.Cell):  def __init__(self):  super().__init__()  self.flatten = nn.Flatten()  self.dense_relu_sequential = nn.SequentialCell(  nn.Dense(28*28, 512),  nn.ReLU(),  nn.Dense(512, 512),  nn.ReLU(),  nn.Dense(512, 10)  )  def construct(self, x):  x = self.flatten(x)  logits = self.dense_relu_sequential(x)  return logits  
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))  
def run(x):  model = Network()  return model(x)  
run_with_jit = ms.jit(run)  # 通过调用jit将函数转换为以静态图方式执行  
output = run(input)  
print(output)  

        分析:首先导入了所需的库和模块。然后定义了一个名为 Network 的类,它继承自 nn.Cell ,在类的初始化方法 __init__ 中定义了一些层,包括展平层 Flatten 和一个由全连接层 Dense 与激活函数 ReLU 组成的序列 dense_relu_sequential 。

        接着创建了一个输入数据 input 。

        之后定义了一个名为 run 的函数,在函数内部创建了 Network 类的实例 model ,并将输入 x 传入模型进行计算并返回结果。

        然后通过 ms.jit(run) 将 run 函数转换为以静态图方式执行,并将其结果赋值给 run_with_jit 。

        最后调用 run 函数并将输入 input 传入,得到输出并打印。

        总的来说,这段代码构建了一个神经网络模型,并尝试以不同的方式(普通函数和静态图)来运行模型进行计算和输出结果。

        运行结果:

[[-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  
...  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]  [-0.26886722 -0.01613193 -0.02503425 -0.06268327  0.1372346   0.08339559  -0.05737131 -0.03662169  0.09235285 -0.12165849]]  

        当我们需要对神经网络的某部分进行加速时,可以直接在construct方法上使用jit修饰器,在调用实例化对象时,该模块自动被编译为静态图。示例如下:

        代码如下:

import numpy as np  
import mindspore as ms  
from mindspore import nn, Tensor  
class Network(nn.Cell):  def __init__(self):  super().__init__()  self.flatten = nn.Flatten()  self.dense_relu_sequential = nn.SequentialCell(  nn.Dense(28*28, 512),  nn.ReLU(),  nn.Dense(512, 512),  nn.ReLU(),  nn.Dense(512, 10)  )  @ms.jit  # 使用ms.jit装饰器,使被装饰的函数以静态图模式运行  def construct(self, x):  x = self.flatten(x)  logits = self.dense_relu_sequential(x)  return logits  
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))  
model = Network()  
output = model(input)  
print(output)

        分析:首先,导入了 numpy 库并命名为 np ,导入了 mindspore 库并命名为 ms ,还从 mindspore 库中导入了 nn 和 Tensor 。

        然后,定义了一个名为 Network 的类,它继承自 nn.Cell 。在类的初始化方法 __init__ 中进行了一些基础设置。

        接着,使用 ms.jit 装饰器修饰了 Network 类的 construct 方法,这意味着该方法在运行时会以静态图模式进行优化。

        之后,创建了一个输入数据 input ,它是一个 Tensor 类型。

        再然后,创建了 Network 类的实例 model 。

        最后,将 input 传入 model 进行计算,得到输出 output 并打印出来。

        总的来说,这段代码构建了一个基于 MindSpore 的神经网络模型,并对给定的输入数据进行计算和输出结果。

        运行结果:

[[-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  
...  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]  [-0.01447779 -0.02491043 -0.06172827 -0.12281439  0.05957274 -0.28446954  0.17217562  0.14563462  0.08131266 -0.02172118]]  

基于context的开启方式

        context模式是一种全局的设置模式。

        代码如下:

import numpy as np  
import mindspore as ms  
from mindspore import nn, Tensor  
ms.set_context(mode=ms.GRAPH_MODE)  # 使用set_context进行运行静态图模式的配置  
class Network(nn.Cell):  def __init__(self):  super().__init__()  self.flatten = nn.Flatten()  self.dense_relu_sequential = nn.SequentialCell(  nn.Dense(28*28, 512),  nn.ReLU(),  nn.Dense(512, 512),  nn.ReLU(),  nn.Dense(512, 10)  )  def construct(self, x):  x = self.flatten(x)  logits = self.dense_relu_sequential(x)  return logits  
model = Network()  
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))  
output = model(input)  
print(output)  

        分析:首先导入了 numpy 库并简称为 np ,导入了 mindspore 库并简称为 ms ,还从 mindspore 中导入了 nn 和 Tensor 。

        然后使用 ms.set_context(mode=ms.GRAPH_MODE) 配置了 mindspore 的运行环境为静态图模式。

        接着定义了一个名为 Network 的类,继承自 nn.Cell 。在类的初始化方法 __init__ 中进行了一些层的定义,包括展平层和一系列全连接层与激活函数层的组合。

        之后创建了 Network 类的实例 model ,并创建了输入数据 input 。

        最后将 input 传入 model 进行计算得到输出 output ,并将其打印出来。

        总的来说,这段代码构建了一个神经网络模型,并在静态图模式下对输入数据进行处理和得到输出。

        运行结果:

[[ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  
...  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]  [ 0.11365249 -0.186111   -0.28579414  0.13091658  0.02833005 -0.17373694  0.28168008  0.04766882  0.0583384   0.0371065 ]]  

静态图的语法约束


        在 Graph 模式中,Python 代码并非交由 Python 解释器来执行,而是会先将其编译为静态计算图,后续再对静态计算图予以执行。正因如此,编译器难以对全部的 Python 语法提供支持。MindSpore 的静态图编译器精心维护了 Python 常用语法的子集部分,旨在为神经网络的构建以及训练提供有力支撑。

JitConfig配置选项


        在图模式之下,能够通过运用 JitConfig 配置选项来在一定程度上对编译流程进行自定义。当下,JitConfig 所支持的配置参数具体如下:

        jit_level:其作用是把控优化的等级。

        exec_mode:用于掌控模型的执行方式。

        jit_syntax_level:设定静态图语法的支持级别。

静态图高级编程技巧


        使用静态图高级编程技巧可以有效地提高编译效率以及执行效率,并可以使程序运行的更加稳定。

  运行截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19C 单机文件系统安装文档

准备工作 1)查看系统版本、内核参数 more /etc/redhat-release more /etc/redflag-releaseuname -a2)查看当前系统是否配置了HugePages。在下面的查询中,HugePages的几个相关值都为0,表明当前未配值HugePages,其次可以看到该版本的大页大小为…

Java之网络面试经典题(一)

目录 ​编辑 一.Session和cookie Cookie Session 二.HTTP和HTTPS的区别 三.浅谈HTTPS为什么是安全的? 四.TCP和UDP 五.GET和Post的区别 六.forward 和 redirect 的区别? 本专栏全是博主自己收集的面试题,仅可参考,不能相…

转发服务器实验

首先先克隆一个虚拟机并完成ip地址的修改 nmcli connection modify ens160 ipv4.addresses 192.168.209.128/24 nmcli connection modify ens160 ipv4.method manual nmcli connection modify ens160 connection.autoconnect yes nmcli connection up ens160 nmcli connection…

强化学习编程实战-1-一个及其简单的强化学习实例(多臂赌博机)

1.1 多臂赌博机 一台拥有K个臂的机器,玩家每次可以摇动K个臂中的一个,摇动后,会吐出数量不等的金币,吐出金币的数量服从一定的概率分布,而且不同臂的概率分布不同。 多臂赌博机的问题是:假设玩家共有N次摇地…

WPF中Background=“{x:Null}“ 和 Transparent

WPF中关于背景透明和背景无 此时&#xff0c;我代码中是写的有有个控件&#xff0c;一个Border &#xff0c;一个TextBox &#xff0c;范围都是全屏这么大&#xff0c;可以输入TextBox 因为&#xff0c;当border没有设置背景的时候&#xff0c;实际上是&#xff1a; <Borde…

尚庭公寓——数据库设计

1. 数据的关系 一对一&#xff0c;一对多&#xff08;多对一&#xff09;&#xff0c;多对多 2. 实体关系模型 实体关系模型常用ER图&#xff08;enity relationship graph&#xff09;表示&#xff1b; 矩形表示实体&#xff08;类似Java中的对象&#xff0c;如学生就是一…

NoSQL 之 Redis 配置与常用命令

一、关系型数据库与非关系型数据库 1、数据库概述 &#xff08;1&#xff09;关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记 录。 SQL 语句&#xff08;标准数据查询语言&am…

在5G/6G应用中实现高性能放大器的建模挑战

来源&#xff1a;Modelling Challenges for Enabling High Performance Amplifiers in 5G/6G Applications {第28届“集成电路和系统的混合设计”(Mixed Design of Integrated Circuits and Systems)国际会议论文集&#xff0c;2021年6月24日至26日&#xff0c;波兰洛迪} 本文讨…

Vue中Class数据绑定

Class数据绑定 数据绑定的一个常见需求场景是操作CSS class列表&#xff0c;因为class是attribute&#xff08;属性&#xff09;&#xff0c;我们可以和其他attribute一样使用v-bind 将它们和动态的字符串绑定。但是&#xff0c;在处理比较复杂的绑定时&#xff0c;通过拼接生…

金蝶云苍穹-插件开发(一)加载数据

前言 此系列博客是进行金蝶云苍穹开发时的插件开发的教程&#xff0c;一是在明年要是还要参加软件杯金蝶A6赛题的话&#xff0c;可以看此系列教程的博客来进行复习&#xff0c;同时如果要是我实验室的学弟学妹要参加的话&#xff0c;我这个系列的博客可以给他们提供学习参考&a…

谷粒商城学习-10-docker安装mysql

文章目录 一&#xff0c;拉取MySQL镜像1&#xff0c;搜索MySQL的Docker镜像2&#xff0c;拉取MySQL镜像3&#xff0c;查看已经拉取的镜像 二&#xff0c;创建、启动MySQL容器1&#xff0c;使用docker run创建启动容器2&#xff0c;使用docker ps查看运行状态的容器3&#xff0c…

SpringBoot新手快速入门系列教程:基于JPA的一个Mysql简单读写例子

现在我们来做一个简单的读写Mysql的项目 1&#xff0c;先新建一个项目&#xff0c;我们叫它“HelloJPA”并且添加依赖 2&#xff0c;引入以下依赖&#xff1a; Spring Boot DevTools (可选&#xff0c;但推荐&#xff0c;用于开发时热部署)Lombok&#xff08;可选&#xff0c…

【C++】 解决 C++ 语言报错:Use of Uninitialized Variable

文章目录 引言 使用未初始化的变量&#xff08;Use of Uninitialized Variable&#xff09;是 C 编程中常见且危险的错误之一。它通常在程序试图使用尚未赋值的变量时发生&#xff0c;导致程序行为不可预测&#xff0c;可能引发运行时错误、数据损坏&#xff0c;甚至安全漏洞。…

SpringMVC:SpringMVC执行流程

文章目录 一、介绍二、什么是MVC 一、介绍 Spring MVC 是一种基于Java的Web框架&#xff0c;它采用了MVC&#xff08;Model - View - Controller&#xff09;设计模式&#xff0c;通过吧Model、View和Controller分离&#xff0c;将Web层进行职责解耦&#xff0c;把复杂的Web应…

NAS 必备导航页 Homepage 外观简约但功能丰富

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 NAS 上的应用部署多了之后,不同的服务对应的端口很难记住,在内网中使用,一般也不会绑定域名。 此时就需要有一个导航页将 NAS 上部署的所有服务都罗列出来,方便我们直接点击访问对应的服务。 今天给大家介绍的…

【HICE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通

anaconda中下载压缩包并用conda安装包

有时直接conda安装包时会出错&#xff1b;报错PackagesNotFoundError: The following packages are not available from current channels 比如 conda install -y bioconda::ucsc-gtftogenepred #直接安装报错 #直接下载压缩包安装https://blog.csdn.net/weixin_45552562/ar…

C++初学者指南-4.诊断---基础:警告和测试

C初学者指南-4.诊断—基础知识&#xff1a;警告和测试 文章目录 C初学者指南-4.诊断---基础知识&#xff1a;警告和测试1. 术语和技术记住&#xff1a;使用专用类型&#xff01; 2.编译器警告Gcc/CLang 编译器选项MS Visual Studio 编译器选项 3.断言运行时断言静态断言&#x…

macOS查看系统日志的方法

1、command空格键打开搜索框&#xff0c;输入‘控制台’并打开 2、选择日志报告&#xff0c;根据日期打开自己需要的文件就可以

c++习题06-ljc的储蓄计划

目录 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;思路1 2&#xff0c;思路2 三&#xff0c;代码 1&#xff0c;思路1代码 2&#xff0c;思路2代码 四&#xff0c;用例输入输出 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;思路1 定义变量&#x…