Apache MXNet - Python API 胶子


正如我们在前面的章节中已经讨论过的那样,MXNet Gluon 为 DL 项目提供了清晰、简洁且简单的 API。它使 Apache MXNet 能够在不损失训练速度的情况下进行原型设计、构建和训练 DL 模型。

核心模块

让我们学习 Apache MXNet Python 应用程序编程接口 (API) gluon 的核心模块。

胶子神经网络

Gluon 在 gluon.nn 模块中提供了大量内置的 NN 层。这就是它被称为核心模块的原因。

方法及其参数

以下是mxnet.gluon.nn核心模块涵盖的一些重要方法及其参数-

方法及其参数 定义
激活(激活,**kwargs) 顾名思义,此方法将激活函数应用于输入。
AvgPool1D([池大小、步幅、填充、...]) 这是时态数据的平均池化操作。
AvgPool2D([池大小、步幅、填充、...]) 这是空间数据的平均池化操作。
AvgPool3D([池大小、步幅、填充、...]) 这是 3D 数据的平均池化操作。数据可以是空间数据或时空数据。
BatchNorm([轴、动量、epsilon、中心、...]) 它代表批量归一化层。
BatchNormReLU([轴、动量、epsilon, …]) 它也代表批归一化层,但具有 Relu 激活函数。
块([前缀,参数]) 它给出了所有神经网络层和模型的基类。
Conv1D(通道,kernel_size[,步幅,...]) 该方法用于一维卷积层。例如,时间卷积。
Conv1DTranspose(通道, kernel_size[, …]) 该方法用于转置一维卷积层。
Conv2D(通道,kernel_size[,步幅,...]) 该方法用于2D卷积层。例如,图像的空间卷积)。
Conv2DTranspose(通道, kernel_size[, …]) 该方法用于转置二维卷积层。
Conv3D(通道,kernel_size[,步幅,...]) 该方法用于3D卷积层。例如,体积上的空间卷积。
Conv3DTranspose(通道, kernel_size[, …]) 该方法用于转置 3D 卷积层。
密集(单位[,激活,use_bias,...]) 此方法代表常规的密集连接的 NN 层。
辍学(率[,轴]) 顾名思义,该方法将 Dropout 应用于输入。
ELU(α) 此方法用于指数线性单元 (ELU)。
嵌入(input_dim,output_dim [,dtype,...]) 它将非负整数转换为固定大小的密集向量。
展平(**kwargs) 此方法将输入展平为二维。
GELU(**kwargs) 该方法用于高斯指数线性单元(GELU)。
GlobalAvgPool1D([布局]) 借助该方法,我们可以对时态数据进行全局平均池化操作。
GlobalAvgPool2D([布局]) 借助该方法,我们可以对空间数据进行全局平均池化操作。
GlobalAvgPool3D([布局]) 借助该方法,我们可以对3维数据进行全局平均池化操作。
GlobalMaxPool1D([布局]) 借助该方法,我们可以对一维数据进行全局最大池化操作。
GlobalMaxPool2D([布局]) 借助该方法,我们可以对二维数据进行全局最大池化操作。
GlobalMaxPool3D([布局]) 借助该方法,我们可以对 3-D 数据进行全局最大池化操作。
GroupNorm([num_groups, epsilon, center, …]) 此方法将组归一化应用于 nD 输入数组。
HybridBlock([前缀, 参数]) 此方法支持使用SymbolNDArray进行转发。
HybridLambda(函数[,前缀]) 借助此方法,我们可以将运算符或表达式包装为 HybridBlock 对象。
HybridSequential([前缀, 参数]) 它按顺序堆叠 HybridBlock。
InstanceNorm([轴、epsilon、中心、比例、...]) 此方法将实例标准化应用于 nD 输入数组。

实施示例

在下面的示例中,我们将使用 Block(),它为所有神经网络层和模型提供基类。

from mxnet.gluon import Block, nn
class Model(Block):
   def __init__(self, **kwargs):
      super(Model, self).__init__(**kwargs)
      # use name_scope to give child Blocks appropriate names.
      with self.name_scope():
         self.dense0 = nn.Dense(20)
         self.dense1 = nn.Dense(20)
   def forward(self, x):

      x = mx.nd.relu(self.dense0(x))
      return mx.nd.relu(self.dense1(x))

model = Model()
model.initialize(ctx=mx.cpu(0))
model(mx.nd.zeros((5, 5), ctx=mx.cpu(0)))

输出

您将看到以下输出 -

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
<NDArray 5x20 @cpu(0)*gt;

在下面的示例中,我们将使用 HybridBlock(),它支持使用 Symbol 和 NDArray 进行转发。

import mxnet as mx
from mxnet.gluon import HybridBlock, nn


class Model(HybridBlock):
   def __init__(self, **kwargs):
      super(Model, self).__init__(**kwargs)
      # use name_scope to give child Blocks appropriate names.
      with self.name_scope():
         self.dense0 = nn.Dense(20)
         self.dense1 = nn.Dense(20)

   def forward(self, x):
      x = nd.relu(self.dense0(x))
      return nd.relu(self.dense1(x))
model = Model()
model.initialize(ctx=mx.cpu(0))

model.hybridize()
model(mx.nd.zeros((5, 5), ctx=mx.cpu(0)))

输出

输出如下 -

[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
<NDArray 5x20 @cpu(0)>

胶子.rnn

Gluon 在 gluon.rnn 模块中提供了大量内置的循环神经网络(RNN)层。这就是它被称为核心模块的原因。

方法及其参数

以下是mxnet.gluon.nn核心模块涵盖的一些重要方法及其参数:

方法及其参数 定义
Bi DirectionCell(l_cell, r_cell[, …]) 它用于双向循环神经网络(RNN)单元。
DropoutCell(速率[,轴,前缀,参数]) 此方法将对给定输入应用 dropout。
GRU(hidden_​​size[, num_layers, 布局, …]) 它将多层门控循环单元 (GRU) RNN 应用于给定的输入序列。
GRUCell(隐藏大小[, …]) 它用于门控整流单元 (GRU) 网络单元。
HybridRecurrentCell([前缀, 参数]) 该方法支持混合。
HybridSequentialRNNCell([前缀, 参数]) 借助这种方法,我们可以顺序堆叠多个 HybridRNN 单元。
LSTM(hidden_​​size[, num_layers, 布局, …])0 它将多层长短期记忆 (LSTM) RNN 应用于给定的输入序列。
LSTMCell(hidden_​​size[, …]) 它用于长短期记忆(LSTM)网络单元。
修改单元(基本单元) 它是修饰单元格的基类。
RNN(hidden_​​size[, num_layers, 激活, …]) 它将具有tanhReLU非线性的多层 Elman RNN 应用于给定的输入序列。
RNNCell(hidden_​​size[, 激活, …]) 它用于 Elman RNN 循环神经网络单元。
RecurrentCell([前缀, 参数]) 它代表 RNN 单元的抽象基类。
SequentialRNNCell([前缀, 参数]) 借助这种方法,我们可以顺序堆叠多个 RNN 单元。
ZoneoutCell(base_cell[, zoneout_outputs, …]) 此方法在基本单元上应用 Zoneout。

实施示例

在下面的示例中,我们将使用 GRU(),它将多层门控循环单元 (GRU) RNN 应用于给定的输入序列。

layer = mx.gluon.rnn.GRU(100, 3)
layer.initialize()
input_seq = mx.nd.random.uniform(shape=(5, 3, 10))
out_seq = layer(input_seq)
h0 = mx.nd.random.uniform(shape=(3, 3, 100))
out_seq, hn = layer(input_seq, h0)
out_seq

输出

这会产生以下输出 -

[[[ 1.50152072e-01 5.19012511e-01 1.02390535e-01 ... 4.35803324e-01
1.30406499e-01 3.30152437e-02]
[ 2.91542172e-01 1.02243155e-01 1.73325196e-01 ... 5.65296151e-02
1.76546033e-02 1.66693389e-01]
[ 2.22257316e-01 3.76294643e-01 2.11277917e-01 ... 2.28903517e-01
3.43954474e-01 1.52770668e-01]]


[[ 1.40634328e-01 2.93247789e-01 5.50393537e-02 ... 2.30207980e-01
6.61415309e-02 2.70989928e-02]
[ 1.11081995e-01 7.20834285e-02 1.08342394e-01 ... 2.28330195e-02
6.79589901e-03 1.25501186e-01]
[ 1.15944080e-01 2.41565228e-01 1.18612610e-01 ... 1.14908054e-01
1.61080107e-01 1.15969211e-01]]
………………………….

例子

hn

输出

这会产生以下输出 -

[[[-6.08105101e-02 3.86217088e-02   6.64453954e-03 8.18805695e-02
3.85607071e-02 -1.36945639e-02 7.45836645e-03 -5.46515081e-03
9.49622393e-02 6.39371723e-02 -6.37890724e-03 3.82240303e-02
9.11015049e-02 -2.01375950e-02 -7.29381144e-02 6.93765879e-02
2.71829776e-02 -6.64435029e-02 -8.45306814e-02 -1.03075653e-01
6.72040805e-02 -7.06537142e-02 -3.93818803e-02 5.16211614e-03
-4.79770005e-02 1.10734522e-01 1.56721435e-02 -6.93409378e-03
1.16915874e-01 -7.95962065e-02 -3.06530762e-02 8.42394680e-02
7.60370195e-02 2.17055440e-01 9.85361822e-03 1.16660878e-01
4.08297703e-02 1.24978097e-02 8.25245082e-02 2.28673983e-02
-7.88266212e-02 -8.04114193e-02 9.28791538e-02 -5.70827350e-03
-4.46166918e-02 -6.41122833e-02 1.80885363e-02 -2.37745279e-03
4.37298454e-02 1.28888980e-01 -3.07202265e-02 2.50503756e-02
4.00907174e-02 3.37077095e-03 -1.78839862e-02 8.90695080e-02
6.30150884e-02 1.11416787e-01 2.12221760e-02 -1.13236710e-01
5.39616570e-02 7.80710578e-02 -2.28817668e-02 1.92073174e-02
………………………….

在下面的示例中,我们将使用 LSTM(),它将长短期记忆 (LSTM) RNN 应用于给定的输入序列。

layer = mx.gluon.rnn.LSTM(100, 3)
layer.initialize()

input_seq = mx.nd.random.uniform(shape=(5, 3, 10))
out_seq = layer(input_seq)
h0 = mx.nd.random.uniform(shape=(3, 3, 100))
c0 = mx.nd.random.uniform(shape=(3, 3, 100))
out_seq, hn = layer(input_seq,[h0,c0])
out_seq

输出

输出如下 -

[[[ 9.00025964e-02 3.96071747e-02 1.83841765e-01 ... 3.95872220e-02
1.25569820e-01 2.15555862e-01]
[ 1.55962542e-01 -3.10300849e-02 1.76772922e-01 ... 1.92474753e-01
2.30574399e-01 2.81707942e-02]
[ 7.83204585e-02 6.53361529e-03 1.27262697e-01 ... 9.97719541e-02
1.28254429e-01 7.55299702e-02]]
[[ 4.41036932e-02 1.35250352e-02 9.87644792e-02 ... 5.89378644e-03
5.23949116e-02 1.00922674e-01]
[ 8.59075040e-02 -1.67027581e-02 9.69351009e-02 ... 1.17763653e-01
9.71239135e-02 2.25218050e-02]
[ 4.34580036e-02 7.62207608e-04 6.37005866e-02 ... 6.14888743e-02
5.96345589e-02 4.72368896e-02]]
……………

例子

hn

输出

当您运行代码时,您将看到以下输出 -

[
[[[ 2.21408084e-02 1.42750628e-02 9.53067932e-03 -1.22849066e-02
1.78788435e-02 5.99269159e-02 5.65306023e-02 6.42553642e-02
6.56616641e-03 9.80876666e-03 -1.15729487e-02 5.98640442e-02
-7.21173314e-03 -2.78371759e-02 -1.90690923e-02 2.21447181e-02
8.38765781e-03 -1.38521893e-02 -9.06938594e-03 1.21346042e-02
6.06449470e-02 -3.77471633e-02 5.65885007e-02 6.63008019e-02
-7.34188128e-03 6.46054149e-02 3.19911093e-02 4.11194898e-02
4.43960279e-02 4.92892228e-02 1.74766723e-02 3.40303481e-02
-5.23341820e-03 2.68163737e-02 -9.43402853e-03 -4.11836170e-02
1.55221792e-02 -5.05655073e-02 4.24557598e-03 -3.40388380e-02
……………………

培训模块

Gluon 中的培训模块如下 -

胶子损失

mxnet.gluon.loss模块中,Gluon 提供了预定义的损失函数。基本上,它有训练神经网络的损失。这就是它被称为培训模块的原因。

方法及其参数

以下是mxnet.gluon.loss训练模块涵盖的一些重要方法及其参数:

方法及其参数 定义
损失(重量,batch_axis,**kwargs) 这是损失的基类。
L2Loss([权重,batch_axis]) 它计算标签预测(pred)之间的均方误差(MSE)。
L1Loss([权重,batch_axis]) 它计算labelpred之间的平均绝对误差 (MAE) 。
SigmoidBinaryCrossEntropyLoss([…]) 该方法用于二元分类的交叉熵损失。
Sigmoid BCE 损失 该方法用于二元分类的交叉熵损失。
SoftmaxCrossEntropyLoss([轴, …]) 它计算 softmax 交叉熵损失 (CEL)。
SoftmaxCE损失 它还计算 softmax 交叉熵损失。
KLDivLoss([from_logits, 轴, 权重, …]) 它用于 Kullback-Leibler 散度损失。
CTCLoss([布局、label_layout、权重]) 它用于联结主义时间分类损失(TCL)。
HuberLoss([rho,权重,batch_axis]) 它计算平滑的 L1 损失。如果绝对误差超过 rho,则平滑后的 L1 损失将等于 L1 损失,否则等于 L2 损失。
HingeLoss([边距、重量、batch_axis]) 该方法计算 SVM 中常用的铰链损失函数:
SquaredHingeLoss([边距、重量、batch_axis]) 该方法计算 SVM 中使用的软边缘损失函数:
LogisticLoss([权重,batch_axis,label_format]) 该方法计算逻辑损失。
TripletLoss([边距、权重、batch_axis]) 该方法在给定三个输入张量和正余量的情况下计算三元组损失。
PoissonNLLLoss([权重, from_logits, …]) 该函数计算负对数似然损失。
CosineEmbeddingLoss([权重,batch_axis,margin]) 该函数计算向量之间的余弦距离。
SDMLLoss([平滑_参数, 权重, …]) 该方法在给定两个输入张量和平滑权重 SDM 损失的情况下计算批量平滑深度度量学习 (SDML) 损失。它通过使用小批量中的未配对样本作为潜在的负样本来学习配对样本之间的相似性。

例子

我们知道mxnet.gluon.loss.loss将计算标签和预测(pred)之间的 MSE(均方误差)。它是在以下公式的帮助下完成的:

均方误差

胶子参数

mxnet.gluon.parameter是一个保存参数(即块的权重)的容器。

方法及其参数

以下是mxnet.gluon.parameter训练模块涵盖的一些重要方法及其参数-

方法及其参数 定义
强制转换(数据类型) 此方法会将此参数的数据和梯度转换为新的数据类型。
数据([ctx]) 此方法将在一个上下文中返回此参数的副本。
等级([ctx]) 此方法将在一个上下文中返回此参数的梯度缓冲区。
初始化([init, ctx, default_init, …]) 该方法将初始化参数和梯度数组。
列表_ctx() 此方法将返回此参数初始化的上下文列表。
列表数据() 此方法将在所有上下文中返回此参数的副本。它将按照与创建相同的顺序完成。
列表_grad() 此方法将返回所有上下文的渐变缓冲区。这将以与value()相同的顺序完成。
列表行稀疏数据(行id) 此方法将返回所有上下文中“row_sparse”参数的副本。这将按照与创建相同的顺序完成。
重置_ctx(ctx) 此方法会将 Parameter 重新分配给其他上下文。
row_sparse_data(row_id) 此方法将在与 row_id 相同的上下文中返回“row_sparse”参数的副本。
设置数据(数据) 此方法将在所有上下文中设置此参数的值。
变量() 该方法将返回代表该参数的符号。
零_梯度() 此方法会将所有上下文的渐变缓冲区设置为 0。

实施例

在下面的示例中,我们将使用initialize()方法初始化参数和梯度数组,如下所示 -

weight = mx.gluon.Parameter('weight', shape=(2, 2))
weight.initialize(ctx=mx.cpu(0))
weight.data()

输出

输出如下 -

[[-0.0256899 0.06511251]
[-0.00243821 -0.00123186]]
<NDArray 2x2 @cpu(0)>

例子

weight.grad()

输出

输出如下 -

[[0. 0.]
[0. 0.]]
<NDArray 2x2 @cpu(0)>

例子

weight.initialize(ctx=[mx.gpu(0), mx.gpu(1)])
weight.data(mx.gpu(0))

输出

您将看到以下输出 -

[[-0.00873779 -0.02834515]
 [ 0.05484822 -0.06206018]]
<NDArray 2x2 @gpu(0)>

例子

weight.data(mx.gpu(1))

输出

当您执行上述代码时,您应该看到以下输出 -

[[-0.00873779 -0.02834515]
 [ 0.05484822 -0.06206018]]
<NDArray 2x2 @gpu(1)>

胶子训练器

mxnet.gluon.trainer 对一组参数应用优化器。它应该与 autograd 一起使用。

方法及其参数

以下是mxnet.gluon.trainer训练模块涵盖的一些重要方法及其参数-

方法及其参数 定义
allreduce_grads() 该方法将减少每个参数(权重)的不同上下文的梯度。
加载状态(fname) 顾名思义,此方法将加载训练器状态。
保存状态(fname) 顾名思义,此方法将保存训练器状态。
设置学习率(lr) 该方法将设置优化器的新学习率。
步骤(batch_size[,ignore_stale_grad]) 该方法将进行一步参数更新。它应该在autograd.backward()之后且在record()范围之外调用。
更新(batch_size[,ignore_stale_grad]) 该方法也会进行一步参数更新。它应该在autograd.backward()之后、在record()范围之外以及在 trainer.update() 之后调用。

数据模块

Gluon 的数据模块解释如下 -

胶子数据

Gluon 在 gluon.data 模块中提供了大量内置数据集实用程序。这就是它被称为数据模块的原因。

类及其参数

以下是 mxnet.gluon.data 核心模块涵盖的一些重要方法及其参数。这些方法通常与数据集、采样和数据加载器相关。

数据集
方法及其参数 定义
数组数据集(*args) 该方法表示组合了两个或两个以上类似数据集的对象的数据集。例如,数据集、列表、数组等。
BatchSampler(采样器,batch_size[,last_batch]) 此方法包装了另一个Sampler。包装后,它会返回小批量的样品。
DataLoader(数据集[,batch_size,shuffle,…]) 与 BatchSampler 类似,但此方法从数据集中加载数据。加载后,它会返回小批量数据。
这代表抽象数据集类。
FilterSampler(fn, 数据集) 此方法表示 fn (函数)返回True 的数据集中的样本元素。
随机采样器(长度) 该方法随机表示 [0, length) 中的样本元素,无需放回。
记录文件数据集(文件名) 它表示包裹在 RecordIO 文件上的数据集。文件的扩展名是.rec
采样器 这是采样器的基类。
SequentialSampler(长度[,开始]) 它依次表示集合 [start, start+length) 中的样本元素。
它依次表示集合 [start, start+length) 中的样本元素。 这代表了简单的数据集包装器,特别是列表和数组。

实施示例

在下面的示例中,我们将使用gluon.data.BatchSampler() API,它包装了另一个采样器。它返回小批量的样本。

import mxnet as mx
from mxnet.gluon import data
sampler = mx.gluon.data.SequentialSampler(15)
batch_sampler = mx.gluon.data.BatchSampler(sampler, 4, 'keep')
list(batch_sampler)

输出

输出如下 -

[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14]]

gluon.data.vision.数据集

Gluon 在gluon.data.vision.datasets模块中提供了大量预定义的视觉数据集函数。

类及其参数

MXNet 为我们提供了有用且重要的数据集,其类和参数如下 -

类及其参数 定义
MNIST([根、训练、变换]) 这是一个有用的数据集,为我们提供了手写数字。MNIST 数据集的 url 是 http://yann.lecun.com/exdb/mnist
FashionMNIST([根、训练、变换]) 该数据集由 Zalando 的时尚产品文章图像组成。它是原始 MNIST 数据集的直接替代品。您可以从 https://github.com/zalandoresearch/fashion-mnist 获取此数据集
CIFAR10([根、训练、变换]) 这是来自 https://www.cs.toronto.edu/~kriz/cifar.html 的图像分类数据集。在此数据集中,每个样本都是形状为 (32, 32, 3) 的图像。
CIFAR100([根、fine_label、训练、变换]) 这是来自 https://www.cs.toronto.edu/~kriz/cifar.html 的 CIFAR100 图像分类数据集。它还具有每个样本是形状为 (32, 32, 3) 的图像。
ImageRecordDataset(文件名[,标志,变换]) 该数据集覆盖包含图像的 RecordIO 文件。在这个例子中,每个样本都是一个带有相应标签的图像。
ImageFolderDataset(根[,标志,变换]) 这是用于加载存储在文件夹结构中的图像文件的数据集。
ImageListDataset([根,imglist,标志]) 这是一个用于加载由条目列表指定的图像文件的数据集。

例子

在下面的示例中,我们将展示 ImageListDataset() 的使用,它用于加载由条目列表指定的图像文件 -

# written to text file *.lst

0 0 root/cat/0001.jpg
1 0 root/cat/xxxa.jpg
2 0 root/cat/yyyb.jpg
3 1 root/dog/123.jpg
4 1 root/dog/023.jpg
5 1 root/dog/wwww.jpg

# A pure list, each item is a list [imagelabel: float or list of float, imgpath]

[[0, root/cat/0001.jpg]
[0, root/cat/xxxa.jpg]
[0, root/cat/yyyb.jpg]
[1, root/dog/123.jpg]
[1, root/dog/023.jpg]
[1, root/dog/wwww.jpg]]

实用模块

Gluon 中的实用模块如下 -

gluon.utils

Gluon 在 gluon.utils 模块中提供了大量内置的并行化实用程序优化器。它提供了各种培训实用程序。这就是它被称为实用程序模块的原因。

函数及其参数

以下是名为 gluon.utils 的实用程序模块中包含的函数及其参数-

函数及其参数 定义
split_data(数据,num_slice [,batch_axis,...]) 该函数通常用于数据并行,每个切片都发送到一个设备,即 GPU。它将 NDArray沿batch_axis分割为num_slice切片。
split_and_load(数据,ctx_list [,batch_axis,...]) 该函数将 NDArray沿batch_axis 分割为len(ctx_list)切片与上面 split_data () 函数的唯一区别在于,它还将每个切片加载到ctx_list中的一个上下文中。
Clip_global_norm(数组, max_norm[, …]) 该函数的作用是重新缩放 NDArray,使其 2-norm 之和小于max_norm
check_sha1(文件名, sha1_hash) 该函数将检查文件内容的 sha1 哈希是否与预期哈希匹配。
下载(url[,路径,覆盖,sha1_hash,...]) 正如名称所指定的,此函数将下载给定的 URL。
替换文件(源,目标) 该函数将实现Atomicsos.replace。它将在 Linux 和 OSX 上完成。