深度学习机器学习【免费下载链接】tflearnDeep learning library featuring a higher-level API for TensorFlow.项目地址https://gitcode.com/gh_mirrors/tf/tflearn点击查看免费下载本文是一份面向 TensorFlow 开发者的 TFLearn 快速上手指南。TFLearn 是构建在 TensorFlow 之上的模块化深度学习库通过更高层、更直观的 API 大幅加速神经网络的搭建与训练同时保持与 TensorFlow 图完全透明、可混编的特性。读完本文你将掌握用一行 TFLearn 层代码替代冗长的 TensorFlow 变量声明与算子调用、通过DNN模型类完成训练/评估/预测/权重持久化/微调、接入 HDF5 大数据集与实时预处理增强以及把 TFLearn 的层、内置算子、Trainer/Evaluator/回调等组件嵌入你自己的 TensorFlow 图中。适用前提当前仓库为 TFLearnv0.3 系列面向 TensorFlow 1.x API源码统一使用import tensorflow.compat.v1 as tf运行见 tflearn/models/dnn.py如需获取最新安装与版本要求可参考 安装指南 与 项目索引。高层 API 使用TFLearn 的核心价值在于一套「直觉化且与 TensorFlow 完全兼容」的高层 API它把神经网络的搭建与训练变得又快又简单。下面按层Layers、内置算子Built-in Ops、训练/评估/预测、可视化、权重持久化、微调、数据管理与预处理、作用域与图初始化依次展开。层Layers一个抽象操作集合层是 TFLearn 的核心概念。直接用 TensorFlow 原生算子完整定义一个模型往往耗时且重复以一层卷积为例你需要手动创建并初始化权重与偏置变量、对输入张量做卷积、再追加激活函数。而 TFLearn 的「层」把这组操作抽象成一个可直接调用的函数。在 TensorFlow 中写一层卷积大约需要这样一段样板代码with tf.name_scope(conv1): W tf.Variable(tf.random_normal([5, 5, 1, 32]), dtypetf.float32, nameWeights) b tf.Variable(tf.random_normal([32]), dtypetf.float32, namebiases) x tf.nn.conv2d(x, W, strides[1, 1, 1, 1], paddingSAME) x tf.add_bias(x, b) x tf.nn.relu(x)而在 TFLearn 中只需一行tflearn.conv_2d(x, 32, 5, activationrelu, nameconv1)这一行背后的逻辑变量创建与初始化、卷积、激活、偏置等由 tflearn/layers/conv.py 中的conv_2d封装完成。目前可用的全部层如下表所示文件层core 核心层input_data,fully_connected,dropout,custom_layer,reshape,flatten,activation,single_unit,highway,one_hot_encoding,time_distributedconv 卷积层conv_2d,conv_2d_transpose,max_pool_2d,avg_pool_2d,upsample_2d,conv_1d,max_pool_1d,avg_pool_1d,residual_block,residual_bottleneck,conv_3d,max_pool_3d,avg_pool_3d,highway_conv_1d,highway_conv_2d,global_avg_pool,global_max_poolrecurrent 循环层simple_rnn,lstm,gru,bidirectionnal_rnn,dynamic_rnnembedding 嵌入层embeddingnormalization 归一化层batch_normalization,local_response_normalization,l2_normalizemerge 合并层merge,merge_outputsestimator 估计层regression以fully_connected为例从 tflearn/layers/core.py 可以看到它的完整签名fully_connected(incoming, n_units, activationlinear, biasTrue, weights_inittruncated_normal, bias_initzeros, regularizerNone, weight_decay0.001, trainableTrue, restoreTrue, reuseFalse, scopeNone, nameFullyConnected)。这意味着你可以在调用时直接指定激活函数、初始化方式如weights_initxavier、正则化如regularizerL2配合weight_decay、是否可训练、是否在加载预训练模型时恢复等无需再手写任何变量管理代码。内置算子Built-in Ops除了层之外TFLearn 还提供了大量可在建网时直接使用的算子。它们首先是作为上述层的参数出现的比如conv_2d的activationrelu或regularizerL2但也可以独立地在任意 TensorFlow 图中使用——只要把算子名称作为字符串传入即可需要深度定制时也可以直接传入一个函数。文件算子activations 激活linear,tanh,sigmoid,softmax,softplus,softsign,relu,relu6,leaky_relu,prelu,eluobjectives 目标softmax_categorical_crossentropy,categorical_crossentropy,binary_crossentropy,mean_square,hinge_loss,roc_auc_score,weak_cross_entropy_2doptimizers 优化器SGD,RMSProp,Adam,Momentum,AdaGrad,Ftrl,AdaDeltametrics 指标Accuracy,Top_k,R2initializations 初始化zeros,uniform,uniform_scaling,normal,truncated_normal,xavier,variance_scalinglosses 损失l1,l2快速示例# 在层内指定激活与正则化 fc2 tflearn.fully_connected(fc1, 32, activationtanh, regularizerL2) # 等价写法 fc2 tflearn.fully_connected(fc1, 32) tflearn.add_weights_regularization(fc2, lossL2) fc2 tflearn.tanh(fc2) # 优化器、目标与指标 reg tflearn.regression(fc4, optimizerrmsprop, metricaccuracy, losscategorical_crossentropy) # 算子也可以在外部定义便于深度定制 momentum tflearn.optimizers.Momentum(learning_rate0.1, weight_decay0.96, decay_step200) top5 tflearn.metrics.Top_k(k5) reg tflearn.regression(fc4, optimizermomentum, metrictop5, losscategorical_crossentropy)注意优化器在设计上是一个类而非函数因此在 TFLearn 模型之外单独使用时请直接实例化优化器类见 tflearn/optimizers.py。训练、评估与预测DNN 模型类TensorFlow 原生并不提供开箱即用的网络训练 API而 TFLearn 集成了一套训练函数可处理任意数量的输入、输出与优化器。在使用 TFLearn 层时许多参数如输入占位符、目标占位符、训练算子都由框架自动管理因此只需用DNN模型类即可极简单地完成训练network ... (some layers) ... network regression(network, optimizersgd, losscategorical_crossentropy) model DNN(network) model.fit(X, Y)也可以直接用于预测或评估network ... model DNN(network) model.load(model.tflearn) model.predict(X)DNN类的实现位于 tflearn/models/dnn.py其构造参数包括clip_gradients5.0梯度裁剪阈值、tensorboard_verbose0日志详细级别、tensorboard_dir/tmp/tflearn_logs/TensorBoard 日志目录、checkpoint_pathNone、best_checkpoint_pathNone、max_checkpointsNone、sessionNone以及best_val_accuracy0.0。它内部把训练委托给Trainer、把预测委托给Evaluator因此在使用时建议网络以input_data层开头它会自动把输入占位符注册进tf.GraphKeys.INPUTS集合并以regression层收尾注册进tf.GraphKeys.TRAIN_OPS集合否则DNN会抛出异常提示缺少输入或训练算子。fit方法tflearn/models/dnn.py支持丰富的数据形态与训练控制model.fit(X, Y) # 单输入单输出 model.fit({input1: X}, {output1: Y}) # 以 dict 指定输入/输出层 model.fit([X1, X2], Y) # 多输入单输出 model.fit(X, [Y1, Y2], validation_set(X_val, [Y1_val, Y2_val])) # 显式验证集 model.fit(X, Y, validation_set0.1) # 取 10% 训练数据做验证其中n_epoch默认 10、show_metric是否每步打印准确率、batch_size若指定则覆盖所有regression层的批大小、shuffle是否打乱数据、snapshot_epoch/snapshot_step快照时机、excl_trainops排除某些训练算子、run_idTensorBoard 中本次运行的名称、callbacks自定义回调均可按需传入。此外DNN还提供fit_batch单批训练、predict_label返回按概率降序排列的类别索引、evaluate在给定样本上计算指标默认batch_size128等便捷方法。关于DNN与regression估计层的更完整说明可继续阅读 tflearn/models/dnn.py 与 tflearn/layers/estimator.py。可视化TensorBoard 自动摘要手写 TensorBoard summary 很不方便TFLearn 能自动管理大量有用的日志。目前通过 verbose 级别即可自动控制摘要内容0Loss 与 Metric最快速度1Loss、Metric 与 Gradients2Loss、Metric、Gradients 与 Weights3Loss、Metric、Gradients、Weights、Activations 与 Sparsity最佳可视化使用DNN时只需指定tensorboard_verbosemodel DNN(network, tensorboard_verbose3)然后启动 TensorBoard 即可查看网络结构与性能曲线$ tensorboard --logdir/tmp/tflearn_logs上文展示的三张图分别对应计算图Graph、多次运行的损失与准确率Loss Accuracy、以及各层细节Layers。这些可视化能力由 tflearn/helpers/summarizer.py 与Trainer配合实现DNN的tensorboard_dir参数默认即/tmp/tflearn_logs/。权重持久化保存、恢复与读写保存或恢复模型直接调用DNN的save/load方法即可# 保存模型 model.save(my_model.tflearn) # 加载模型 model.load(my_model.tflearn)load还支持weights_onlyTrue只恢复权重而不恢复中间变量如步数计数器、移动平均等注意若使用了批归一化其均值/方差也不会被恢复。load在恢复后还会重新构建Evaluator并恢复数据预处理参数见 tflearn/models/dnn.py。获取某层的变量既可以通过层名也可以直接使用层返回张量被「超充」出来的W/b属性# 创建一层 fc1 fully_connected(input_layer, 64, namefc_layer_1) # 使用张量属性层会把权重属性附加到返回的张量上 fc1_weights_var fc1.W fc1_biases_var fc1.b # 使用张量名 fc1_vars tflearn.get_layer_variables_by_name(fc_layer_1) fc1_weights_var fc1_vars[0] fc1_biases_var fc1_vars[1]get_layer_variables_by_name的实现位于 tflearn/variables.py它读取tf.GraphKeys.LAYER_VARIABLES / name集合——这正是 TFLearn 建层时把该层所有变量权重、偏置注册进去的结果。读写这些变量的值则使用DNN的get_weights/set_weightsinput_data tflearn.input_data(shape[None, 784]) fc1 tflearn.fully_connected(input_data, 64) fc2 tflearn.fully_connected(fc1, 10, activationsoftmax) net tflearn.regression(fc2) model DNN(net) # 获取 fc2 的权重值 model.get_weights(fc2.W) # 为 fc2 赋一组新的随机权重 model.set_weights(fc2.W, numpy.random.rand(64, 10))底层实现上get_weights是对权重张量做weight_tensor.eval(session)set_weights则构造tf.assign(tensor, weights)并在会话中执行tflearn/models/dnn.py。当然你也可以直接用 TensorFlow 原生的eval/assign操作读写这些变量。完整示例见 examples/basics/weights_persistence.py。微调Fine-tuning按层控制权重恢复在预训练模型上微调新任务非常常见。TFLearn 在定义模型时可以通过层函数的restore参数指定哪些层的权重在加载预训练模型时恢复、哪些不恢复该参数仅对带权重的层有效# 默认恢复权重 fc_layer tflearn.fully_connected(input_layer, 32) # 指定不恢复权重 fc_layer tflearn.fully_connected(input_layer, 32, restoreFalse)所有标记为不恢复的变量都会被加入tf.GraphKeys.EXCL_RESTORE_VARS集合见 tflearn/variables.py加载预训练模型时这些变量的恢复会被直接跳过。Trainer在构建恢复器restorer时会从全部变量中剔除EXCL_RESTORE_VARS集合里的成员tflearn/helpers/trainer.py从而实现「保留旧层、只训新层」的经典微调流程。完整微调示例见 examples/basics/finetuning.py。数据管理NumPy 与 HDF5TFLearn 支持 NumPy 数组数据同时支持 HDF5 以应对大规模数据集。HDF5 是一种数据模型、库与文件格式支持任意多样的数据类型专为高效灵活的大数据 I/O 设计。TFLearn 可以直接使用 HDF5 格式的数据# 加载 hdf5 数据集 h5f h5py.File(data.h5, r) X, Y h5f[MyLargeData] ... define network ... # 用 HDF5 数据模型训练 model DNN(network) model.fit(X, Y)配套示例见 examples/basics/use_hdf5.py。数据预处理与数据增强训练时做数据预处理与增强非常常见TFLearn 为此提供了封装好的包装器。值得一提的设计是TFLearn 的数据流基于「计算流水线」构建能在 GPU 训练模型的同时在 CPU 上完成数据预处理从而加速整体训练tflearn/data_flow.py 负责数据流调度DNN通过retrieve_data_preprocessing_and_augmentation自动收集注册在DATA_PREP/DATA_AUG集合中的处理器见 tflearn/models/dnn.py。# 实时图像预处理 img_prep tflearn.ImagePreprocessing() # 零中心化均值在整个数据集上计算 img_prep.add_featurewise_zero_center() # 标准差归一化标准差在整个数据集上计算 img_prep.add_featurewise_stdnorm() # 实时数据增强 img_aug tflearn.ImageAugmentation() # 随机左右翻转图像 img_aug.add_random_flip_leftright() # 把上述方法挂到 input_data 层上 network input_data(shape[None, 32, 32, 3], data_preprocessingimg_prep, data_augmentationimg_aug)ImagePreprocessing与ImageAugmentation的完整可用方法可查阅 tflearn/data_preprocessing.py 与 tflearn/data_augmentation.py。作用域与权重共享TFLearn 的所有层都构建在variable_op_scope之上这使得变量共享与分布式训练变得容易所有带内部变量的层都支持scope参数使用相同scope名的层会共享同一组权重该能力基于 tflearn/variables.py 中带contrib_add_arg_scope装饰的variable函数可通过tf.arg_scope批量设置设备等默认参数。# 定义模型构建器 def my_model(x): x tflearn.fully_connected(x, 32, scopefc1) x tflearn.fully_connected(x, 32, scopefc2) x tflearn.fully_connected(x, 2, scopeout) # 两个不同的计算图但共享同一组权重 with tf.device(/gpu:0): # 强制所有变量驻留在 CPU 上 with tf.arg_scope([tflearn.variables.variable], device/cpu:0): model1 my_model(placeholder_X) # 复用下一个模型的变量 tf.get_variable_scope().reuse_variables() with tf.device(/gpu:1): with tf.arg_scope([tflearn.variables.variable], device/cpu:0): model2 my_model(placeholder_X) # 模型现在可以在多 GPU 上训练配合梯度平均 ...图初始化资源与内存控制在训练前限制资源或分配 GPU 显存比例可以使用图初始化器tflearn.init_graph(set_seed8888, num_cores16, gpu_memory_fraction0.5)init_graph的实现见 tflearn/config.py其完整参数为init_graph(seedNone, log_deviceFalse, num_cores0, gpu_memory_fraction0, soft_placementTrue)seed设置随机种子log_device是否打印设备放置日志num_cores指定使用的 CPU 核数默认全部gpu_memory_fraction取 0~1 之间的值表示每个进程预占的 GPU 显存比例1 表示全部0.5 表示约 50%默认使用全部可用显存soft_placementTrue允许在没有对应 GPU 实现时将算子放到 CPU 上。生成的ConfigProto会被注册进tf.GraphKeys.GRAPH_CONFIG集合供后续Trainer创建会话时使用。扩展 TensorFlowTFLearn 是一个高度灵活的库其任何组件都可以独立使用你可以用「任意组合」的 TensorFlow 原生算子和 TFLearn 层与内置算子来简洁地构建模型。以下介绍把 TFLearn 嵌入自有 TensorFlow 图的基本方法。在自建图中使用 TFLearn 层任何 TFLearn 层都可以作用于任何来自 TensorFlow 的张量也就是说你可以直接在自定义 TensorFlow 图中使用 TFLearn 包装器# 一些 TensorFlow 操作 X tf.placeholder(shape(None, 784), dtypetf.float32) net tf.reshape(X, [-1, 28, 28, 1]) # 使用 TFLearn 卷积层 net tflearn.conv_2d(net, 32, 3, activationrelu) # 使用 TensorFlow 原生最大池化算子 net tf.nn.max_pool(net, ksize[1, 2, 2, 1], strides[1, 2, 2, 1], paddingSAME) ...完整示例见 examples/extending_tensorflow/layers.py。内置算子与纯 TensorFlow 混用与层类似TFLearn 内置算子与任何 TensorFlow 表达式完全兼容可以让图更简洁、可读。可用的算子清单与上文「内置算子」一节完全一致activations、objectives、optimizers、metrics、initializations、losses 六类混用示例见 examples/extending_tensorflow/builtin_ops.py。需要再次提醒优化器被设计为类而非函数独立于 TFLearn 模型使用时请实例化优化器类。Trainer / Evaluator训练任意 TensorFlow 图如果你使用自己的 TensorFlow 模型TFLearn 提供的 helpers 函数可以训练任意 TensorFlow 图。它们引入实时监控、批采样、移动平均、TensorBoard 日志、数据喂入等能力使训练过程更便利并支持任意数量的输入、输出与优化算子。TFLearn 用TrainOp类表示一个优化即反向传播过程trainop TrainOp(netmy_network, lossloss, metricaccuracy)随后把所有TrainOp交给Trainer类它会把这些训练算子作为一个整体来处理整个训练流程model Trainer(trainopstrainop, tensorboard_dir/tmp/tflearn) model.fit(feed_dict{input_placeholder: X, target_placeholder: Y})大多数模型只有一个优化过程但复杂模型可能需要多个优化过程此时传入列表即可model Trainer(trainops[trainop1, trainop2]) model.fit(feed_dict[{in1: X1, label1: Y1}, {in2: X2, in3: X3, label2: Y2}])Trainertflearn/helpers/trainer.py的完整参数包括train_ops、graph、clip_gradients5.0、tensorboard_dir/tmp/tflearn_logs/、tensorboard_verbose0、checkpoint_path、best_checkpoint_path、max_checkpoints、keep_checkpoint_every_n_hours、random_seed、session与best_val_accuracy并内置了全局步数变量与Coordinator。真实混用示例见 examples/extending_tensorflow/trainer.py其中先用纯 TensorFlow 定义多层感知机placeholder、tf.Variable、tf.matmul、softmax_cross_entropy_with_logits、GradientDescentOptimizer再交给 TFLearn 的TrainOpTrainer驱动训练。预测方面TFLearn 实现了一个与Trainer工作方式类似的Evaluator类它接收任意网络并返回预测值tflearn/helpers/evaluator.pymodel Evaluator(network) model.predict(feed_dict{input_placeholder: X})训练模式开关is_training有些层在训练与测试时行为不同如 dropout、批归一化。为此Trainer使用一个布尔变量is_training来标记网络当前是训练还是测试/预测该变量作为唯一元素存放在is_training集合中其置位操作存放在is_training_ops集合两个元素置 True 与置 False 的操作相关实现见 tflearn/config.py。在自定义层中应把该变量作为条件 op 使用# Dropout 示例 x ... def apply_dropout(): # 训练模式下应用 return tf.nn.dropout(x, keep_prob) is_training tflearn.get_training_mode() # 取出 is_training 变量 tf.cond(is_training, apply_dropout, lambda: x) # 仅在训练时应用 dropoutTFLearn 还提供函数直接修改该变量# 开启训练模式把 is_training 置为 True tflearn.is_training(True) # 关闭训练模式把 is_training 置为 False tflearn.is_training(False)训练回调Callbacks训练过程中TFLearn 允许你通过Callback接口定义于 tflearn/callbacks.py提供的钩子方法追踪并干预训练指标。为简化指标获取每个回调方法都会收到一个TrainingState对象定义于 tflearn/helpers/trainer.py它记录当前状态epoch、step、batch 迭代等与指标当前验证准确率、全局准确率等。与训练周期相关的回调方法on_train_begin(training_state)on_epoch_begin(training_state)on_batch_begin(training_state)on_sub_batch_begin(training_state)on_sub_batch_end(training_state, train_index)on_batch_end(training_state, snapshot)on_epoch_end(training_state)on_train_end(training_state)使用方法假设你有一个追踪所有训练任务的监控平台需要把指标发送给它。只需创建一个自定义回调在on_epoch_end每个 epoch 结束时被调用里实现发送逻辑class MonitorCallback(tflearn.callbacks.Callback): def __init__(self, api): self.my_monitor_api api def on_epoch_end(self, training_state): self.my_monitor_api.send({ accuracy: training_state.global_acc, loss: training_state.global_loss, })然后把它传入model.fitmonitorCallback MonitorCallback(api) # api 是你的 API 类 model ... model.fit(..., callbacksmonitorCallback)callbacks参数可以接收单个Callback或一个回调列表传入列表时框架内部会使用ChainCallbacktflearn/callbacks.py按顺序逐一调用每个回调的对应钩子。这样自定义回调就会在每个 epoch 结束时被自动触发。回调相关的测试覆盖可参考 tests/test_models.py。变量快速定义TFLearn 提供一组函数让用户快速定义变量。TensorFlow 中创建变量需要预定义值或初始化器还要显式指定设备放置而 TFLearn 简化了这一切import tflearn.variables as vs my_var vs.variable(W, shape[784, 128], initializertruncated_normal, regularizerL2, device/gpu:0)vs.variabletflearn/variables.py接收name、shape、dtype、initializer字符串或张量、regularizer、trainable、collections、caching_device、validate_shape、device与restore参数字符串形式的 initializer/regularizer 会被自动解析为对应的初始化器与正则化器restoreFalse的变量会被加入EXCL_RESTORE_VARS集合从而在加载预训练模型时被跳过。示例见 examples/extending_tensorflow/variables.py。配套的变量查询辅助函数还包括get_all_variables、get_all_trainable_variable、get_layer_variables_by_name、get_value/set_value等。Summaries自定义摘要使用Trainer时管理摘要同样简单只需把要监控的激活放入tf.GraphKeys.ACTIVATIONS集合然后指定 verbose 级别控制可视化深度model Trainer(network, lossloss, metricacc, tensorboard_verbose3)除了Trainer的自动摘要也可以直接用 TFLearn 的 summarizer 算子向当前 TensorFlow 图快速添加摘要tflearn/helpers/summarizer.pyimport tflearn.helpers.summarizer as s s.summarize_variables(train_vars[...]) # 汇总给定变量的权重None 表示所有可训练变量 s.summarize_activations(activations[...]) # 汇总给定激活 s.summarize_gradients(grads[...]) # 汇总给定变量的梯度None 表示所有可训练变量 s.summarize(value, type) # 汇总任意内容上述每个函数都接受collection参数并返回该集合上的合并摘要默认名为tflearn_summ。所以只要运行最后一个 summarizer就能拿到已合并的完整摘要操作集合s.summarize_variables(collectionmy_summaries) s.Summarize_gradients(collectionmy_summaries) summary_op s.summarize_activations(collectionmy_summaries) # summary_op 是此前定义的权重、梯度与激活摘要操作的合并结果示例见 examples/extending_tensorflow/summaries.py。正则化使用 TFLearn 的 regularizer 可以为模型添加正则化tflearn/helpers/regularizer.py目前支持权重正则化与激活正则化可用的正则化损失见 tflearn/losses.py。所有正则化损失都会存入tf.GraphKeys.REGULARIZATION_LOSSES集合# 为变量添加 L2 正则化 W tf.Variable(tf.random_normal([784, 256]), nameW) tflearn.add_weight_regularizer(W, L2, weight_decay0.001)预处理工具除了张量运算对输入数据做预处理同样常见。TFLearn 提供一套预处理函数让数据操作更便捷如序列补齐、类别标签化、同步打乱、图像处理等详见 tflearn/data_utils.py。更进一步仓库中附带大量示例与多种神经网络的完整实现可以帮你更深入地练习 TFLearn示例列表覆盖图像CNN、ResNet、VGG、DCGAN、VAE 等、NLPLSTM、双向 LSTM、seq2seq 等、强化学习Atari Q-learning与基础线性/逻辑回归、随机森林、k-means等场景快速上手教程 与配套脚本 tutorials/intro/quickstart.py官方 API 文档索引见 docs/templates/doc_index.md模型类说明见 tflearn/models/dnn.py 与 tflearn/models/generator.py测试用例tests/覆盖了层、模型、输入、目标函数、指标与验证监控等行为可作为理解各组件语义的补充材料。上述所有能力都建立在一个原则之上TFLearn 的一切函数都构建于张量之上既可以整体使用其高层 API 快速搭建模型也可以只取其中某个层、算子或 helper 融入你自己的 TensorFlow 图中这正是 TFLearn 保持「透明与兼容」的根基。赞分享深度学习机器学习【免费下载链接】tflearnDeep learning library featuring a higher-level API for TensorFlow.项目地址https://gitcode.com/gh_mirrors/tf/tflearn点击查看免费下载相关推荐TFLearn 深度学习库指南基于 TensorFlow 的高层 API 从安装、建模到训练可视化TFLearn 深度学习库指南基于 TensorFlow 的高层 API 从安装、建模到训练可视化 TFLearn 是一个构建于 TensorFlow 之上的深度学习机器学习UmiJS 快速上手从安装、创建页面到构建部署的完整实战指南UmiJS 快速上手从安装、创建页面到构建部署的完整实战指南 导读 本文是 UmiJSumi的官方快速上手指南面向第一次接触该框架的开发者。你将跟随本文前端开发工具Motrix浏览器扩展完整使用指南从快速上手到高级技巧Motrix浏览器扩展完整使用指南从快速上手到高级技巧 想要让浏览器下载变得更快更智能Motrix浏览器扩展就是你的完美解决方案。这个轻量级扩展能自动将浏览前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考