diff --git a/.lycheeignore b/.lycheeignore deleted file mode 100644 index 98b26f6e886..00000000000 --- a/.lycheeignore +++ /dev/null @@ -1,4 +0,0 @@ -zhuanlan.zhihu.com/* -https://demo.doctrp.top/ -http://127.0.0.1:8001/ -http://localhost:9003 diff --git a/_typos.toml b/_typos.toml index 2b04b84d490..4a6fb17b022 100644 --- a/_typos.toml +++ b/_typos.toml @@ -1,6 +1,10 @@ [files] # The following files will be excluded from spell check during commits -extend-exclude = [] +extend-exclude = [ + # Skip `Accuray ` check in these files + "docs/practices/cv/3D_image_classification_from_CT_scans.ipynb", + +] [default] # Ignore 1-3 letter words, refer to https://github.com/crate-ci/typos/issues/1079 @@ -20,69 +24,20 @@ Clas = "Clas" arange = "arange" unsupport = "unsupport" Nervana = "Nervana" +datas = "datas" # These words need to be fixed -Accuray = "Accuray" -Adventages = "Adventages" -Archetecture = "Archetecture" -Asynchoronous = "Asynchoronous" -Attrbute = "Attrbute" -Attribtue = "Attribtue" Creenshot = "Creenshot" -Embeddding = "Embeddding" -Embeding = "Embeding" -Engish = "Engish" Learing = "Learing" Moible = "Moible" Operaton = "Operaton" Optimizaing = "Optimizaing" Optimzier = "Optimzier" -Paremeter = "Paremeter" -Pipline = "Pipline" -Porgram = "Porgram" -Prallel = "Prallel" -Propegation = "Propegation" -Propogation = "Propogation" -Protocal = "Protocal" -Pyhton = "Pyhton" -REGISTE = "REGISTE" -Reivew = "Reivew" -Reuqest = "Reuqest" Setment = "Setment" Similarily = "Similarily" Simle = "Simle" Sovler = "Sovler" Successed = "Successed" -Ture = "Ture" -accordding = "accordding" -accoustic = "accoustic" -accpetance = "accpetance" -cantains = "cantains" -classfy = "classfy" -cliping = "cliping" -colunms = "colunms" -commmit = "commmit" -complie = "complie" -condtional = "condtional" -conjuction = "conjuction" -containg = "containg" -contruct = "contruct" -contructed = "contructed" -contruction = "contruction" -contxt = "contxt" -convertion = "convertion" -convinience = "convinience" -correponding = "correponding" -corresonding = "corresonding" -correspoinding = "correspoinding" -corss = "corss" -creatation = "creatation" -creats = "creats" -dafault = "dafault" -datas = "datas" -decribe = "decribe" -decribes = "decribes" -deocder = "deocder" desgin = "desgin" desginated = "desginated" desigin = "desigin" @@ -92,15 +47,6 @@ dimention = "dimention" dimentions = "dimentions" dirrectories = "dirrectories" disucssion = "disucssion" -egde = "egde" -enviornment = "enviornment" -erros = "erros" -evalute = "evalute" -exampels = "exampels" -exection = "exection" -exlusive = "exlusive" -exmaple = "exmaple" -exsits = "exsits" feeded = "feeded" flaot = "flaot" fliters = "fliters" @@ -114,6 +60,7 @@ fundemental = "fundemental" funtion = "funtion" ilter = "ilter" inferface = "inferface" +infor = "infor" instert = "instert" instrinsics = "instrinsics" interchangable = "interchangable" @@ -148,23 +95,8 @@ outpu = "outpu" outpus = "outpus" overrided = "overrided" overwrited = "overwrited" -palce = "palce" -parammeters = "parammeters" -poniter = "poniter" porcess = "porcess" processer = "processer" -promot = "promot" -propegation = "propegation" -provicded = "provicded" -recevied = "recevied" -recomment = "recomment" -registerd = "registerd" -registring = "registring" -reivew = "reivew" -relase = "relase" -requirments = "requirments" -resut = "resut" -resuts = "resuts" sacle = "sacle" samle = "samle" satifies = "satifies" @@ -178,7 +110,6 @@ similary = "similary" simplier = "simplier" skiped = "skiped" softwares = "softwares" -sould = "sould" specail = "specail" sperated = "sperated" splited = "splited" @@ -190,12 +121,3 @@ sucess = "sucess" sucessor = "sucessor" sucessors = "sucessors" szie = "szie" -tempory = "tempory" -thier = "thier" -traget = "traget" -traing = "traing" -trainning = "trainning" -transfered = "transfered" -trasformed = "trasformed" -treshold = "treshold" -trian = "trian" diff --git a/ci_scripts/check_api_docs_en.py b/ci_scripts/check_api_docs_en.py index ed7bb411b4d..468a495f68f 100644 --- a/ci_scripts/check_api_docs_en.py +++ b/ci_scripts/check_api_docs_en.py @@ -124,6 +124,6 @@ def check_system_message_in_doc(doc_file): if error_files: print("error files: ", error_files) print( - "ERROR: these docs exsits System Message: WARNING/ERROR, please check and fix them" + "ERROR: these docs exists System Message: WARNING/ERROR, please check and fix them" ) sys.exit(1) diff --git a/ci_scripts/check_api_docs_en.sh b/ci_scripts/check_api_docs_en.sh index a0e161c3825..e1578177344 100644 --- a/ci_scripts/check_api_docs_en.sh +++ b/ci_scripts/check_api_docs_en.sh @@ -13,7 +13,7 @@ function check_system_message(){ fi } -echo "RUN Engish API Docs Checks" +echo "RUN English API Docs Checks" jsonfn=$1 output_path=$2 need_check_api_py_files="${3}" diff --git a/ci_scripts/check_api_parameters.py b/ci_scripts/check_api_parameters.py index 2e6d8b18e2e..c6662f86903 100644 --- a/ci_scripts/check_api_parameters.py +++ b/ci_scripts/check_api_parameters.py @@ -107,7 +107,7 @@ def _check_params_in_description(rstfilename, paramstr): ) else: info = f"The number of params in title does not match the params in description: {len(params_in_title)} != {len(items)}." - print(f"check failed (parammeters description): {rstfilename}") + print(f"check failed (parameters description): {rstfilename}") else: for i in range(len(items)): pname_in_title = params_in_title[i].split("=")[0].strip() @@ -120,13 +120,13 @@ def _check_params_in_description(rstfilename, paramstr): flag = False info = f"the following param in title does not match the param in description: {pname_in_title} != {pname_indesc}." print( - f"check failed (parammeters description): {rstfilename}, {pname_in_title} != {pname_indesc}" + f"check failed (parameters description): {rstfilename}, {pname_in_title} != {pname_indesc}" ) else: flag = False info = f"param name '{pname_in_title}' not matched in description line{i + 1}, check it please." print( - f"check failed (parammeters description): {rstfilename}, param name not found in {i} paragraph." + f"check failed (parameters description): {rstfilename}, param name not found in {i} paragraph." ) else: if params_in_title: @@ -148,8 +148,8 @@ def _check_params_in_description_with_fullargspec(rstfilename, funcname): params_inspec = funcspec.args if len(items) != len(params_inspec): flag = False - info = f"check_with_fullargspec failed (parammeters description): {rstfilename}" - print(f"check failed (parammeters description): {rstfilename}") + info = f"check_with_fullargspec failed (parameters description): {rstfilename}" + print(f"check failed (parameters description): {rstfilename}") else: for i in range(len(items)): pname_in_title = params_inspec[i] @@ -162,13 +162,13 @@ def _check_params_in_description_with_fullargspec(rstfilename, funcname): flag = False info = f"the following param in title does not match the param in description: {pname_in_title} != {pname_indesc}." print( - f"check failed (parammeters description): {rstfilename}, {pname_in_title} != {pname_indesc}" + f"check failed (parameters description): {rstfilename}, {pname_in_title} != {pname_indesc}" ) else: flag = False info = f"param name '{pname_in_title}' not matched in description line{i + 1}, check it please." print( - f"check failed (parammeters description): {rstfilename}, param name not found in {i} paragraph." + f"check failed (parameters description): {rstfilename}, param name not found in {i} paragraph." ) else: if funcspec.args: diff --git a/ci_scripts/gendoc.sh b/ci_scripts/gendoc.sh index f7377d0d3bc..a3874f1dac5 100755 --- a/ci_scripts/gendoc.sh +++ b/ci_scripts/gendoc.sh @@ -15,9 +15,31 @@ export DOCROOT # install paddle if not installed yet. # PADDLE_WHL is defined in ci_start.sh -pip3 list --disable-pip-version-check | grep paddlepaddle > /dev/null -if [ $? -ne 0 ] ; then - pip3 install --no-cache-dir -q --progress-bar off -i https://pypi.tuna.tsinghua.edu.cn/simple ${PADDLE_WHL} +if ! pip3 list --disable-pip-version-check | grep paddlepaddle; then + echo "Paddle is not found, attempting to install from ${PADDLE_WHL}..." + + # Install logic: + # - If PADDLE_WHL is a .whl file URL: download and install locally + # - Otherwise: install directly via pip (supports package names and other URLs) + if [[ "${PADDLE_WHL}" == *.whl ]]; then + echo "Downloading wheel file: ${PADDLE_WHL}" + wget -q ${PADDLE_WHL} -O /tmp/paddle.whl + if [ $? -ne 0 ]; then + echo -e "\e[31mError: Failed to download wheel file from ${PADDLE_WHL}\e[0m" + exit 1 + fi + echo "Installing local wheel file..." + pip3 install --no-cache-dir -q --progress-bar off -i https://pypi.tuna.tsinghua.edu.cn/simple /tmp/paddle.whl + else + echo "Using pip install directly..." + pip3 install --no-cache-dir -q --progress-bar off -i https://pypi.tuna.tsinghua.edu.cn/simple ${PADDLE_WHL} + fi + + if [ $? -ne 0 ]; then + echo -e "\e[31mError: Failed to install paddle from ${PADDLE_WHL}\e[0m" + exit 1 + fi + echo "Paddle installed successfully." fi diff --git a/docs/api/gen_alias_api.py b/docs/api/gen_alias_api.py index 0a6d3b1393e..b011a424e23 100644 --- a/docs/api/gen_alias_api.py +++ b/docs/api/gen_alias_api.py @@ -121,7 +121,7 @@ def transform_file_to_api(self, file_path, api_last_name): return api # find the shortest path api which not starts with paddle.fluid - def _choose_recomment_api(self, api_list): + def _choose_recommend_api(self, api_list): min_len = len(api_list[0].split(".")) rec_api = api_list[0] for api in api_list: @@ -135,7 +135,7 @@ def sort_alias_name(self, api_list): real_api = self._choose_real_api(api_list) api_list.remove(real_api) - rec_api = self._choose_recomment_api(api_list) + rec_api = self._choose_recommend_api(api_list) api_list.remove(rec_api) # sort others api by path length diff --git a/docs/api/gen_doc.py b/docs/api/gen_doc.py index d0ffb25fa0e..6be58f6be89 100755 --- a/docs/api/gen_doc.py +++ b/docs/api/gen_doc.py @@ -319,7 +319,7 @@ def parse_module_file(mod): ) if isinstance(node, ast.FunctionDef): api_info_dict[obj_id]["args"] = ( - gen_functions_args_str(node) + gen_function_args_string(node) ) elif isinstance(node, ast.ClassDef): for n in node.body: @@ -328,7 +328,7 @@ def parse_module_file(mod): and n.name == "__init__" ): api_info_dict[obj_id]["args"] = ( - gen_functions_args_str(n) + gen_function_args_string(n) ) break else: @@ -361,39 +361,62 @@ def parse_module_file(mod): logger.debug("%s omitted", obj_full_name) -def gen_functions_args_str(node): - str_args_list = [] - if isinstance(node, ast.FunctionDef): - # 'args', 'defaults', 'kw_defaults', 'kwarg', 'kwonlyargs', 'posonlyargs', 'vararg' - for arg in node.args.args: - if not arg.arg == "self": - str_args_list.append(arg.arg) +def gen_function_args_string(fn_node: ast.FunctionDef) -> str: + def _gen_default_value_string(default_node: ast.expr) -> str: + if isinstance(default_node, ast.Constant): + default_value = default_node.value + if isinstance(default_value, str): + return f"'{default_value}'" + return str(default_value) + elif isinstance(default_node, ast.Name): + return default_node.id + return "..." - defarg_ind_start = len(str_args_list) - len(node.args.defaults) - for defarg_ind in range(len(node.args.defaults)): - if isinstance(node.args.defaults[defarg_ind], ast.Name): - str_args_list[defarg_ind_start + defarg_ind] += "=" + str( - node.args.defaults[defarg_ind].id - ) - elif isinstance(node.args.defaults[defarg_ind], ast.Constant): - defarg_val = str(node.args.defaults[defarg_ind].value) - if isinstance(node.args.defaults[defarg_ind].value, str): - defarg_val = f"'{defarg_val}'" - str_args_list[defarg_ind_start + defarg_ind] += "=" + defarg_val - if node.args.vararg is not None: - str_args_list.append("*" + node.args.vararg.arg) - if len(node.args.kwonlyargs) > 0: - if node.args.vararg is None: - str_args_list.append("*") - for kwoarg, d in zip(node.args.kwonlyargs, node.args.kw_defaults): - if isinstance(d, ast.Constant): - str_args_list.append(f"{kwoarg.arg}={d.value}") - elif isinstance(d, ast.Name): - str_args_list.append(f"{kwoarg.arg}={d.id}") - if node.args.kwarg is not None: - str_args_list.append("**" + node.args.kwarg.arg) - - return ", ".join(str_args_list) + def _is_self_arg(arg: ast.arg) -> bool: + return arg.arg == "self" + + if not isinstance(fn_node, ast.FunctionDef): + logger.warning( + "The provided node %s is not a FunctionDef.", ast.unparse(fn_node) + ) + return "" + arg_list = [] + posonlyargs_count = len(fn_node.args.posonlyargs) + # posonlyargs and args + defaults_start_index = ( + len(fn_node.args.args) + + len(fn_node.args.posonlyargs) + - len(fn_node.args.defaults) + ) + for i, arg in enumerate(fn_node.args.posonlyargs + fn_node.args.args): + if _is_self_arg(arg) and i == 0: + continue + if i == posonlyargs_count and posonlyargs_count > 0: + arg_list.append("/") + if i >= defaults_start_index: + default_value_str = _gen_default_value_string( + fn_node.args.defaults[i - defaults_start_index] + ) + arg_list.append(f"{arg.arg}={default_value_str}") + else: + arg_list.append(arg.arg) + # vararg + if fn_node.args.vararg: + arg_list.append(f"*{fn_node.args.vararg.arg}") + # kwonlyargs + if fn_node.args.kwonlyargs: + arg_list.append("*") + for i, kwonlyarg in enumerate(fn_node.args.kwonlyargs): + kwdefault = fn_node.args.kw_defaults[i] + if kwdefault is None: + arg_list.append(kwonlyarg.arg) + else: + default_value_str = _gen_default_value_string(kwdefault) + arg_list.append(f"{kwonlyarg.arg}={default_value_str}") + # kwarg + if fn_node.args.kwarg: + arg_list.append(f"**{fn_node.args.kwarg.arg}") + return ", ".join(arg_list) # step 2 fill field : `display` diff --git a/docs/api/paddle/combinations_cn.rst b/docs/api/paddle/combinations_cn.rst index 851490cbfa4..92f06d6942b 100644 --- a/docs/api/paddle/combinations_cn.rst +++ b/docs/api/paddle/combinations_cn.rst @@ -6,7 +6,7 @@ combinations .. py:function:: paddle.combinations(x, r=2, with_replacement=False, name=None) 对输入 Tensor 计算长度为 r 的情况下的所有组合,当 `with_replacement` 设为 False,可类比 python 内置 API `itertools.combinations` 。 -当 `with_replacement` 设为 True,可类比 python 内置 API `itertools.combinations_with_replacement(with_replacement=Ture)`。 +当 `with_replacement` 设为 True,可类比 python 内置 API `itertools.combinations_with_replacement(with_replacement=True)`。 参数 :::::::::: diff --git a/docs/api/paddle/cuda/Overview_cn.rst b/docs/api/paddle/cuda/Overview_cn.rst index 31214bb21b5..3b6d87dc97f 100644 --- a/docs/api/paddle/cuda/Overview_cn.rst +++ b/docs/api/paddle/cuda/Overview_cn.rst @@ -18,3 +18,9 @@ PyTorch 兼容函数 " :ref:`cudart ` ", "以模块的形式返回 CUDA Runtime 对象" " :ref:`is_initialized ` ", "判断 CUDA 是否已经初始化" " :ref:`mem_get_info ` ", "获取指定设备上的全局空闲显存和显存总量" + " :ref:`current_device ` ", "返回当前设备的索引" + " :ref:`device_count ` ", "返回可用的 CUDA 设备数量" + " :ref:`empty_cache ` ", "释放当前设备上所有未占用的缓存内存" + " :ref:`memory_allocated ` ", "返回当前设备上分配的内存总量" + " :ref:`memory_reserved ` ", "返回当前设备上由缓存分配器管理的内存总量" + " :ref:`set_device ` ", "设置当前设备" diff --git a/docs/api/paddle/cuda/current_device_cn.rst b/docs/api/paddle/cuda/current_device_cn.rst new file mode 100644 index 00000000000..e819c355981 --- /dev/null +++ b/docs/api/paddle/cuda/current_device_cn.rst @@ -0,0 +1,17 @@ +.. _cn_api_paddle_cuda_current_device: + +current_device +-------------- + +.. py:function:: paddle.cuda.current_device() + +返回当前设备的索引。 + +返回 +:::::::::::: + + int, 当前设备的索引。 + +代码示例 +:::::::::::: +COPY-FROM: paddle.cuda.current_device diff --git a/docs/api/paddle/cuda/device_count_cn.rst b/docs/api/paddle/cuda/device_count_cn.rst new file mode 100644 index 00000000000..aafe97fce57 --- /dev/null +++ b/docs/api/paddle/cuda/device_count_cn.rst @@ -0,0 +1,17 @@ +.. _cn_api_paddle_cuda_device_count: + +device_count +------------ + +.. py:function:: paddle.cuda.device_count() + +返回可用的计算卡设备数量。 + +返回 +:::::::::::: + + int, 可用的计算卡设备数量。 + +代码示例 +:::::::::::: +COPY-FROM: paddle.cuda.device_count diff --git a/docs/api/paddle/cuda/empty_cache_cn.rst b/docs/api/paddle/cuda/empty_cache_cn.rst new file mode 100644 index 00000000000..a5e84babf71 --- /dev/null +++ b/docs/api/paddle/cuda/empty_cache_cn.rst @@ -0,0 +1,12 @@ +.. _cn_api_paddle_cuda_empty_cache: + +empty_cache +----------- + +.. py:function:: paddle.cuda.empty_cache() + +该函数用于释放显存分配器中空闲的显存,这样其他的 GPU 应用程序就可以使用释放出来的显存,并在 nvidia-smi 中可见。大多数情况下您不需要使用该函数,当您删除 GPU 上的 Tensor 时,Paddle 框架并不会将显存释放,而是将显存保留起来,以便在下一次申明显存时可以更快的完成分配。 + +代码示例 +:::::::::::: +COPY-FROM: paddle.cuda.empty_cache diff --git a/docs/api/paddle/cuda/memory_allocated_cn.rst b/docs/api/paddle/cuda/memory_allocated_cn.rst new file mode 100644 index 00000000000..56547704641 --- /dev/null +++ b/docs/api/paddle/cuda/memory_allocated_cn.rst @@ -0,0 +1,22 @@ +.. _cn_api_paddle_cuda_memory_allocated: + +memory_allocated +--------------- + +.. py:function:: paddle.cuda.memory_allocated(device=None) + +返回给定设备上当前分配给 Tensor 的显存大小。 + +参数 +:::::::::::: + + - **device** (DeviceLike) - 指定要查询的设备,可以是 "int" 用来表示设备 id,可以是形如 "gpu:0" 之类的设备描述字符串,也可以是 `paddle.CUDAPlace(0)` 之类的设备实例。如果为 None(默认值)或未指定设备索引,则返回由 ``paddle.device.get_device()`` 给出的当前设备的统计信息。 + +返回 +:::::::::::: + + int, 当前设备上分配的内存总量(字节)。 + +代码示例 +:::::::::::: +COPY-FROM: paddle.cuda.memory_allocated diff --git a/docs/api/paddle/cuda/memory_reserved_cn.rst b/docs/api/paddle/cuda/memory_reserved_cn.rst new file mode 100644 index 00000000000..1fbb7da12bf --- /dev/null +++ b/docs/api/paddle/cuda/memory_reserved_cn.rst @@ -0,0 +1,22 @@ +.. _cn_api_paddle_cuda_memory_reserved: + +memory_reserved +--------------- + +.. py:function:: paddle.cuda.memory_reserved(device=None) + +返回当前设备上由缓存分配器管理的内存总量。 + +参数 +:::::::::::: + + - **device** (DeviceLike) - 指定要查询的设备,可以是 "int" 用来表示设备 id,可以是形如 "gpu:0" 之类的设备描述字符串,也可以是 `paddle.CUDAPlace(0)` 之类的设备实例。如果为 None(默认值)或未指定设备索引,则返回由 ``paddle.device.get_device()`` 给出的当前设备的统计信息。 + +返回 +:::::::::::: + + int, 当前设备上由缓存分配器管理的内存总量(字节)。 + +代码示例 +:::::::::::: +COPY-FROM: paddle.cuda.memory_reserved diff --git a/docs/api/paddle/cuda/set_device_cn.rst b/docs/api/paddle/cuda/set_device_cn.rst new file mode 100644 index 00000000000..b0cf1a0caca --- /dev/null +++ b/docs/api/paddle/cuda/set_device_cn.rst @@ -0,0 +1,17 @@ +.. _cn_api_paddle_cuda_set_device: + +set_device +---------- + +.. py:function:: paddle.cuda.set_device(device) + +设置当前设备。 + +参数 +:::::::::::: + + - **device** (DeviceLike) - 要设置的设备,可以是 "int" 用来表示设备 id,可以是形如 "gpu:0" 之类的设备描述字符串,也可以是 `paddle.CUDAPlace(0)` 之类的设备实例。 + +代码示例 +:::::::::::: +COPY-FROM: paddle.cuda.set_device diff --git a/docs/api/paddle/device/Overview_cn.rst b/docs/api/paddle/device/Overview_cn.rst index 2807177a593..ace33609e55 100644 --- a/docs/api/paddle/device/Overview_cn.rst +++ b/docs/api/paddle/device/Overview_cn.rst @@ -25,11 +25,20 @@ paddle.device 目录下包含 cuda 目录和 xpu 目录, cuda 目录中存放 :header: "API 名称", "API 功能" :widths: 10, 30 + " :ref:`device_count ` ", "返回指定设备类型的可用设备数量" + " :ref:`empty_cache ` ", "释放当前设备上所有未占用的缓存内存" " :ref:`get_all_custom_device_type ` ", "获得所有可用的自定义设备类型" " :ref:`get_all_device_type ` ", "获得所有可用的设备类型" " :ref:`get_available_custom_device ` ", "获得所有可用的自定义设备" " :ref:`get_available_device ` ", "获得所有可用的设备" " :ref:`get_cudnn_version ` ", "获得 cudnn 的版本" + " :ref:`get_device_properties ` ", "返回指定设备的属性" + " :ref:`max_memory_allocated ` ", "返回给定设备上分配给 Tensor 的内存峰值统计" + " :ref:`max_memory_reserved ` ", "返回给定设备上由内存分配器管理的内存峰值统计" + " :ref:`memory_allocated ` ", "返回给定设备上当前分配给 Tensor 的内存大小" + " :ref:`memory_reserved ` ", "返回给定设备上当前由内存分配器管理的内存大小" + " :ref:`reset_max_memory_allocated ` ", "重置给定设备上分配给 Tensor 的内存峰值统计" + " :ref:`reset_max_memory_reserved ` ", "重置给定设备上由内存分配器管理的内存峰值统计" " :ref:`set_device ` ", "指定 OP 运行的全局设备" " :ref:`get_device ` ", "获得 OP 运行的全局设备" @@ -89,7 +98,6 @@ Stream 与 Event 相关 API " :ref:`device_guard ` ", "切换当前的 device 为输入指定的 device,该 API 目前仅支持动态图模式" " :ref:`synchronize ` ", "等待给定的设备上的计算完成" - .. _cn_device_cuda: CUDA 相关 diff --git a/docs/api/paddle/device/device_count_cn.rst b/docs/api/paddle/device/device_count_cn.rst new file mode 100644 index 00000000000..5b459978fc8 --- /dev/null +++ b/docs/api/paddle/device/device_count_cn.rst @@ -0,0 +1,22 @@ +.. _cn_api_paddle_device_device_count: + +device_count +------------ + +.. py:function:: paddle.device.device_count(device=None) + +返回指定设备类型的可用设备数量。 + +参数 +:::::::::::: + + - **device** (paddle.CUDAPlace|paddle.CustomPlace|paddle.XPUPlace|str|int,可选) - 设备、设备 ID 或形如 ``gpu:x``、``xpu:x`` 或自定义设备名称的设备字符串。如果为 None,则返回当前设备类型的可用设备数量。默认值为 None。 + +返回 +:::::::::::: + + int,指定设备类型的可用设备数量。 + +代码示例 +:::::::::::: +COPY-FROM: paddle.device.device_count diff --git a/docs/api/paddle/device/empty_cache_cn.rst b/docs/api/paddle/device/empty_cache_cn.rst new file mode 100644 index 00000000000..16acc4b036b --- /dev/null +++ b/docs/api/paddle/device/empty_cache_cn.rst @@ -0,0 +1,18 @@ +.. _cn_api_paddle_device_empty_cache: + +empty_cache +----------- + +.. py:function:: paddle.device.empty_cache() + +释放当前设备上所有未占用的缓存内存。 + +代码示例 +:::::::::::: +.. code-block:: python + + import paddle + + x = paddle.randn([1000, 1000]) + del x + paddle.device.empty_cache() diff --git a/docs/api/paddle/device/get_device_properties_cn.rst b/docs/api/paddle/device/get_device_properties_cn.rst new file mode 100644 index 00000000000..58b606d4fbe --- /dev/null +++ b/docs/api/paddle/device/get_device_properties_cn.rst @@ -0,0 +1,22 @@ +.. _cn_api_paddle_device_get_device_properties: + +get_device_properties +--------------------- + +.. py:function:: paddle.device.get_device_properties(device=None) + +返回指定设备的属性。 + +参数 +:::::::::::: + + - **device** (paddle.CUDAPlace|paddle.CustomPlace|paddle.XPUPlace|str|int,可选) - 设备、设备 ID 或形如 ``gpu:x``、``xpu:x`` 或自定义设备名称的设备字符串。如果为 None,则返回当前设备的属性。默认值为 None。 + +返回 +:::::::::::: + + String,指定设备的属性,包括设备名称、主要计算能力、次要计算能力、全局可用内存和设备上的多处理器数量。 + +代码示例 +:::::::::::: +COPY-FROM: paddle.device.get_device_properties diff --git a/docs/api/paddle/device/max_memory_allocated_cn.rst b/docs/api/paddle/device/max_memory_allocated_cn.rst new file mode 100644 index 00000000000..ca83c00828c --- /dev/null +++ b/docs/api/paddle/device/max_memory_allocated_cn.rst @@ -0,0 +1,28 @@ +.. _cn_api_paddle_device_max_memory_allocated: + +max_memory_allocated +-------------------- + +.. py:function:: paddle.device.max_memory_allocated(device=None) + +返回给定设备上分配给 Tensor 的内存峰值统计。 + +参数 +:::::::::::: + + - **device** (paddle.CUDAPlace|paddle.CustomPlace|paddle.XPUPlace|str|int,可选) - 设备、设备 ID 或形如 ``gpu:x``、``xpu:x`` 或自定义设备名称的设备字符串。如果为 None,则返回当前设备的统计信息。默认值为 None。 + +返回 +:::::::::::: + + int,给定设备上分配给 Tensor 的内存峰值统计,以字节为单位。 + +代码示例 +:::::::::::: +.. code-block:: python + + >>> import paddle + >>> paddle.device.max_memory_allocated('npu:0') + >>> paddle.device.max_memory_allocated('npu') + >>> paddle.device.max_memory_allocated(0) + >>> paddle.device.max_memory_allocated(Paddle.CustomPlace('npu',0)) diff --git a/docs/api/paddle/device/max_memory_reserved_cn.rst b/docs/api/paddle/device/max_memory_reserved_cn.rst new file mode 100644 index 00000000000..d077f21fe08 --- /dev/null +++ b/docs/api/paddle/device/max_memory_reserved_cn.rst @@ -0,0 +1,28 @@ +.. _cn_api_paddle_device_max_memory_reserved: + +max_memory_reserved +------------------- + +.. py:function:: paddle.device.max_memory_reserved(device=None) + +返回给定设备上由内存分配器管理的内存峰值统计。 + +参数 +:::::::::::: + + - **device** (paddle.CUDAPlace|paddle.CustomPlace|paddle.XPUPlace|str|int,可选) - 设备、设备 ID 或形如 ``gpu:x``、``xpu:x`` 或自定义设备名称的设备字符串。如果为 None,则返回当前设备的统计信息。默认值为 None。 + +返回 +:::::::::::: + + int,给定设备上由内存分配器管理的内存峰值统计,以字节为单位。 + +代码示例 +:::::::::::: +.. code-block:: python + + >>> import paddle + >>> paddle.device.max_memory_reserved('npu:0') + >>> paddle.device.max_memory_reserved('npu') + >>> paddle.device.max_memory_reserved(0) + >>> paddle.device.max_memory_reserved(Paddle.CustomPlace('npu',0)) diff --git a/docs/api/paddle/device/memory_allocated_cn.rst b/docs/api/paddle/device/memory_allocated_cn.rst new file mode 100644 index 00000000000..1742bf44db9 --- /dev/null +++ b/docs/api/paddle/device/memory_allocated_cn.rst @@ -0,0 +1,31 @@ +.. _cn_api_paddle_device_memory_allocated: + +memory_allocated +--------------- + +.. py:function:: paddle.device.memory_allocated(device=None) + +返回给定设备上当前分配给 Tensor 的内存大小。 + +.. note:: + Paddle 中分配给 Tensor 的内存块大小会进行 256 字节对齐,因此可能大于 Tensor 实际需要的内存大小。例如,一个 shape 为[1]的 float32 类型 Tensor 会占用 256 字节的内存,即使存储一个 float32 类型数据实际只需要 4 字节。 + +参数 +:::::::::::: + + - **device** (paddle.CUDAPlace|paddle.CustomPlace|paddle.XPUPlace|str|int,可选) - 设备、设备 ID 或形如 ``gpu:x``、``xpu:x`` 或自定义设备名称的设备字符串。如果为 None,则返回当前设备的统计信息。默认值为 None。 + +返回 +:::::::::::: + + int,给定设备上当前分配给 Tensor 的内存大小,以字节为单位。 + +代码示例 +:::::::::::: +.. code-block:: python + + >>> import paddle + >>> paddle.device.memory_allocated('npu:0') + >>> paddle.device.memory_allocated('npu') + >>> paddle.device.memory_allocated(0) + >>> paddle.device.memory_allocated(Paddle.CustomPlace('npu',0)) diff --git a/docs/api/paddle/device/memory_reserved_cn.rst b/docs/api/paddle/device/memory_reserved_cn.rst new file mode 100644 index 00000000000..61730add199 --- /dev/null +++ b/docs/api/paddle/device/memory_reserved_cn.rst @@ -0,0 +1,28 @@ +.. _cn_api_paddle_device_memory_reserved: + +memory_reserved +--------------- + +.. py:function:: paddle.device.memory_reserved(device=None) + +返回给定设备上当前由内存分配器管理的内存大小。 + +参数 +:::::::::::: + + - **device** (paddle.CUDAPlace|paddle.CustomPlace|paddle.XPUPlace|str|int,可选) - 设备、设备 ID 或形如 ``gpu:x``、``xpu:x`` 或自定义设备名称的设备字符串。如果为 None,则返回当前设备的统计信息。默认值为 None。 + +返回 +:::::::::::: + + int,给定设备上当前由内存分配器管理的内存大小,以字节为单位。 + +代码示例 +:::::::::::: +.. code-block:: python + + >>> import paddle + >>> paddle.device.memory_reserved('npu:0') + >>> paddle.device.memory_reserved('npu') + >>> paddle.device.memory_reserved(0) + >>> paddle.device.memory_reserved(Paddle.CustomPlace('npu',0)) diff --git a/docs/api/paddle/device/reset_max_memory_allocated_cn.rst b/docs/api/paddle/device/reset_max_memory_allocated_cn.rst new file mode 100644 index 00000000000..4284f923739 --- /dev/null +++ b/docs/api/paddle/device/reset_max_memory_allocated_cn.rst @@ -0,0 +1,28 @@ +.. _cn_api_paddle_device_reset_max_memory_allocated: + +reset_max_memory_allocated +------------------------- + +.. py:function:: paddle.device.reset_max_memory_allocated(device=None) + +重置给定设备上分配给 Tensor 的内存峰值统计。 + +参数 +:::::::::::: + + - **device** (paddle.CUDAPlace|paddle.CustomPlace|paddle.XPUPlace|str|int,可选) - 设备、设备 ID 或形如 ``gpu:x``、``xpu:x`` 或自定义设备名称的设备字符串。如果为 None,则重置当前设备的统计信息。默认值为 None。 + +返回 +:::::::::::: + + None + +代码示例 +:::::::::::: +.. code-block:: python + + >>> import paddle + >>> paddle.device.reset_max_memory_allocated('npu:0') + >>> paddle.device.reset_max_memory_allocated('npu') + >>> paddle.device.reset_max_memory_allocated(0) + >>> paddle.device.reset_max_memory_allocated(Paddle.CustomPlace('npu',0)) diff --git a/docs/api/paddle/device/reset_max_memory_reserved_cn.rst b/docs/api/paddle/device/reset_max_memory_reserved_cn.rst new file mode 100644 index 00000000000..75355a40e9a --- /dev/null +++ b/docs/api/paddle/device/reset_max_memory_reserved_cn.rst @@ -0,0 +1,28 @@ +.. _cn_api_paddle_device_reset_max_memory_reserved: + +reset_max_memory_reserved +------------------------- + +.. py:function:: paddle.device.reset_max_memory_reserved(device=None) + +重置给定设备上由内存分配器管理的内存峰值统计。 + +参数 +:::::::::::: + + - **device** (paddle.CUDAPlace|paddle.CustomPlace|paddle.XPUPlace|str|int,可选) - 设备、设备 ID 或形如 ``gpu:x``、``xpu:x`` 或自定义设备名称的设备字符串。如果为 None,则重置当前设备的统计信息。默认值为 None。 + +返回 +:::::::::::: + + None + +代码示例 +:::::::::::: +.. code-block:: python + + >>> import paddle + >>> paddle.device.reset_max_memory_reserved('npu:0') + >>> paddle.device.reset_max_memory_reserved('npu') + >>> paddle.device.reset_max_memory_reserved(0) + >>> paddle.device.reset_max_memory_reserved(Paddle.CustomPlace('npu',0)) diff --git a/docs/api/paddle/jit/TranslatedLayer_cn.rst b/docs/api/paddle/jit/TranslatedLayer_cn.rst index 7a3ee0826eb..369f453195f 100644 --- a/docs/api/paddle/jit/TranslatedLayer_cn.rst +++ b/docs/api/paddle/jit/TranslatedLayer_cn.rst @@ -24,7 +24,7 @@ program(method_name='forward'): **参数** - - **method_name** (string) - 要获取的 Porgram 对应的方法名。默认值为"forward"。 + - **method_name** (string) - 要获取的 Program 对应的方法名。默认值为"forward"。 **返回** Program diff --git a/docs/api/paddle/nn/CTCLoss_cn.rst b/docs/api/paddle/nn/CTCLoss_cn.rst index cfe38bb9d77..560016243b6 100644 --- a/docs/api/paddle/nn/CTCLoss_cn.rst +++ b/docs/api/paddle/nn/CTCLoss_cn.rst @@ -3,7 +3,7 @@ CTCLoss ------------------------------- -.. py:class:: paddle.nn.CTCLoss(blank=0, reduction='mean') +.. py:class:: paddle.nn.CTCLoss(blank=0, reduction='mean', zero_infinity=False) 计算 CTC loss。该接口的底层调用了第三方 baidu-research::warp-ctc 的实现。 也可以叫做 softmax with CTC,因为 Warp-CTC 库中插入了 softmax 激活函数来对输入的值进行归一化。 @@ -12,6 +12,7 @@ CTCLoss ::::::::: - **blank** (int,可选) - 空格标记的 ID 值,其取值范围为 [0, num_classes + 1)。数据类型支持 int32。默认值为 0。 - **reduction** (str,可选) - 指定应用于输出结果的计算方式,可选值有:``'none'``, ``'mean'``, ``'sum'``。设置为 ``'mean'`` 时,对 loss 值除以 label_lengths,并返回所得商的均值;设置为 ``'sum'`` 时,返回 loss 值的总和;设置为 ``'none'`` 时,则直接返回输出的 loss 值。默认值为 ``'mean'``。 + - **zero_infinity** (bool,可选) - 如果为 ``true``,则将 ``loss`` 中无限的值设置为 ``0``。默认值为 False。 形状 ::::::::: diff --git a/docs/api/paddle/nn/RNNTLoss_cn.rst b/docs/api/paddle/nn/RNNTLoss_cn.rst index cccc43184c7..d1b5f936c6d 100644 --- a/docs/api/paddle/nn/RNNTLoss_cn.rst +++ b/docs/api/paddle/nn/RNNTLoss_cn.rst @@ -11,7 +11,7 @@ RNNTLoss 参数 ::::::::: - **blank** (int,可选) - 空格标记的 ID 值,其取值范围为 [0, num_classes + 1)。数据类型支持 int32。默认值为 0。 - - **fastemit_lambda** (float,默认 0.001) - FastEmit 的正则化参数(https://arxiv.org/pdf/2010.11148.pdf)。 + - **fastemit_lambda** (float,默认 0.001) - FastEmit 的正则化参数,具体请参考:`FastEmit: Low-latency Streaming ASR with Sequence-level Emission Regularization `_ 。 - **reduction** (str,可选) - 表示如何平均损失,候选是 ``'none'`` | ``'mean'`` | ``'sum'`` 。如果是 ``'mean'`` ,输出将是损失的总和并除以 batch_size;如果是 ``'sum'``,返回损失的总和;如果为 ``'none'``,则不应用 reduction。默认是 ``'mean'``。 - **name** (str,可选) - 操作名称,默认为 None。 diff --git a/docs/api/paddle/nn/functional/ctc_loss_cn.rst b/docs/api/paddle/nn/functional/ctc_loss_cn.rst index 4fa60483883..44d47054561 100644 --- a/docs/api/paddle/nn/functional/ctc_loss_cn.rst +++ b/docs/api/paddle/nn/functional/ctc_loss_cn.rst @@ -3,7 +3,7 @@ ctc_loss ------------------------------- -.. py:function:: paddle.nn.functional.ctc_loss(log_probs, labels, input_lengths, label_lengths, blank=0, reduction='mean') +.. py:function:: paddle.nn.functional.ctc_loss(log_probs, labels, input_lengths, label_lengths, blank=0, reduction='mean', norm_by_times=False, zero_infinity=False) 计算 CTC loss。该接口的底层调用了第三方 baidu-research::warp-ctc 的实现。 也可以叫做 softmax with CTC,因为 Warp-CTC 库中插入了 softmax 激活函数来对输入的值进行归一化。 @@ -17,6 +17,7 @@ ctc_loss - **blank** (int,可选) - 空格标记的 ID 值,其取值范围为 [0, num_classes + 1)。数据类型支持 int32。默认值为 0。 - **reduction** (str,可选) - 指定应用于输出结果的计算方式,可选值有:``'none'``, ``'mean'``, ``'sum'``。设置为 ``'mean'`` 时,对 loss 值除以 label_lengths,并返回所得商的均值;设置为 ``'sum'`` 时,返回 loss 值的总和;设置为 ``'none'`` 时,则直接返回输出的 loss 值。默认值为 ``'mean'``。 - **norm_by_times** (bool,可选) - 是否根据序列长度对梯度进行正则化。数据类型支持 bool。默认值为 False。 + - **zero_infinity** (bool,可选) - 如果为 ``true``,则将 ``loss`` 中无限的值设置为 ``0``。默认值为 False。 返回 ::::::::: diff --git a/docs/api/paddle/nn/functional/hardswish_cn.rst b/docs/api/paddle/nn/functional/hardswish_cn.rst index 6bb512cc091..e20a201228b 100644 --- a/docs/api/paddle/nn/functional/hardswish_cn.rst +++ b/docs/api/paddle/nn/functional/hardswish_cn.rst @@ -5,7 +5,7 @@ hardswish .. py:function:: paddle.nn.functional.hardswish(x, name=None) -hardswish 激活函数。在 MobileNetV3 架构中被提出,相较于 swish 函数,具有数值稳定性好,计算速度快等优点,具体原理请参考:https://arxiv.org/pdf/1905.02244.pdf +hardswish 激活函数。在 MobileNetV3 架构中被提出,相较于 swish 函数,具有数值稳定性好,计算速度快等优点,具体原理请参考:`Searching for MobileNetV3 `_ 。 .. math:: diff --git a/docs/api/paddle/nn/functional/label_smooth_cn.rst b/docs/api/paddle/nn/functional/label_smooth_cn.rst index bb231d797f8..82a0270608d 100644 --- a/docs/api/paddle/nn/functional/label_smooth_cn.rst +++ b/docs/api/paddle/nn/functional/label_smooth_cn.rst @@ -19,7 +19,7 @@ label_smooth 其中 :math:`1-\epsilon` 和 :math:`\epsilon` 分别是权重,:math:`\tilde{y_k}` 是平滑后的标签,通常 :math:`\mu` 使用均匀分布。 -关于更多标签平滑的细节,`查看论文 `_ 。 +关于更多标签平滑的细节请参考论文:`Rethinking the Inception Architecture for Computer Vision `_ 。 参数 diff --git a/docs/api/paddle/nn/functional/rnnt_loss_cn.rst b/docs/api/paddle/nn/functional/rnnt_loss_cn.rst index 814e369c576..b11e43361bb 100644 --- a/docs/api/paddle/nn/functional/rnnt_loss_cn.rst +++ b/docs/api/paddle/nn/functional/rnnt_loss_cn.rst @@ -15,7 +15,7 @@ rnnt_loss - **input_lengths** (Tensor) - 每个输入序列的长度,它应该有形状 [batch_size] 和 dtype int64。 - **label_lengths** (Tensor) - 每个标签序列的长度,它应该有形状 [batch_size] 和 dtype int64。 - **blank** (int,可选) - RNN-T loss 的空白标签索引,处于半开放区间 [0,B)。数据类型必须为 int32。默认值为 0。 - - **fastemit_lambda** (float,默认 0.001) - FastEmit 的正则化参数(https://arxiv.org/pdf/2010.11148.pdf)。 + - **fastemit_lambda** (float,默认 0.001) - FastEmit 的正则化参数,参考论文:`FastEmit: Low-latency Streaming ASR with Sequence-level Emission Regularization `_ 。 - **reduction** (str,可选) - 表示如何平均损失,候选是 ``'none'`` | ``'mean'`` | ``'sum'`` 。如果 :attr:`reduction` 是 ``'mean'``,输出将是损失的总和并除以 batch_size;如果 :attr:`reduction` 是 ``'sum'``,返回损失的总和;如果 :attr:`reduction` 为 ``'none'``,则不应用 reduction。默认是 ``'mean'``。 - **name** (str,可选) - 操作名称,默认为 None。 diff --git a/docs/api/paddle/nn/functional/sparse_attention_cn.rst b/docs/api/paddle/nn/functional/sparse_attention_cn.rst index fd4fa08f4f0..46e0edde37e 100755 --- a/docs/api/paddle/nn/functional/sparse_attention_cn.rst +++ b/docs/api/paddle/nn/functional/sparse_attention_cn.rst @@ -8,7 +8,7 @@ sparse_attention 对 Transformer 模块中的 Attention 矩阵进行了稀疏化,从而减少内存消耗和计算量。 -其稀疏数据排布通过 CSR 格式表示,CSR 格式包含两个参数,``offset`` 和 ``colunms``。计算公式为: +其稀疏数据排布通过 CSR 格式表示,CSR 格式包含两个参数,``offset`` 和 ``columns``。计算公式为: .. math:: result=softmax(\frac{ Q * K^T }{\sqrt{d}}) * V @@ -24,7 +24,7 @@ sparse_attention - **key** (Tensor) - 输入的 Tensor,代表注意力模块中的 ``key``,这是一个 4 维 Tensor,形状为:[batch_size, num_heads, seq_len, head_dim],数据类型为 float32 或 float64。 - **value** (Tensor) - 输入的 Tensor,代表注意力模块中的 ``value``,这是一个 4 维 Tensor,形状为:[batch_size, num_heads, seq_len, head_dim],数据类型为 float32 或 float64。 - **sparse_csr_offset** (Tensor) - 输入的 Tensor,注意力模块中的稀疏特性,稀疏特性使用 CSR 格式表示,``offset`` 代表矩阵中每一行非零元的数量。这是一个 3 维 Tensor,形状为:[batch_size, num_heads, seq_len + 1],数据类型为 int32。 - - **sparse_csr_columns** (Tensor) - 输入的 Tensor,注意力模块中的稀疏特性,稀疏特性使用 CSR 格式表示,``colunms`` 代表矩阵中每一行非零元的列索引值。这是一个 3 维 Tensor,形状为:[batch_size, num_heads, sparse_nnz],数据类型为 int32。 + - **sparse_csr_columns** (Tensor) - 输入的 Tensor,注意力模块中的稀疏特性,稀疏特性使用 CSR 格式表示,``columns`` 代表矩阵中每一行非零元的列索引值。这是一个 3 维 Tensor,形状为:[batch_size, num_heads, sparse_nnz],数据类型为 int32。 返回 ::::::::: diff --git a/docs/api/paddle/sparse/nn/SubmConv2D_cn.rst b/docs/api/paddle/sparse/nn/SubmConv2D_cn.rst index 1d45083736d..16e96ffe3c3 100644 --- a/docs/api/paddle/sparse/nn/SubmConv2D_cn.rst +++ b/docs/api/paddle/sparse/nn/SubmConv2D_cn.rst @@ -20,7 +20,7 @@ SubmConv2D - :math:`X` : 输入值, NDHWC 格式的 Tencer。 - :math:`W` : 卷积核值, NDHWC 格式的 Tencer。 - - :math:`\\ast` : 子流形卷积运算, 参考论文: https://arxiv.org/abs/1706.01307。 + - :math:`\\ast` : 子流形卷积运算, 参考论文: `Submanifold Sparse Convolutional Networks `_ 。 - :math:`b` : 偏置值, 形状为[M]的 1-D Tencer。 - :math:`Out` : 输出值, :math:`Out` 和 :math:`X` 的形状可能不同。 diff --git a/docs/api/paddle/vision/ops/generate_proposals_cn.rst b/docs/api/paddle/vision/ops/generate_proposals_cn.rst index e24cca4f2ca..7cca72c36eb 100644 --- a/docs/api/paddle/vision/ops/generate_proposals_cn.rst +++ b/docs/api/paddle/vision/ops/generate_proposals_cn.rst @@ -35,7 +35,7 @@ generate_proposals - **post_nms_top_n** (int,可选) - 每个图在 NMS 后要保留的总框数。默认值为 1000。 - **nms_thresh** (float,可选) - NMS 中的阈值。默认值为 0.5。 - **min_size** (float,可选) - 根据宽和高过滤候选框的阈值,宽或高小于该阈值的候选框将被过滤掉。默认值为 0.1。 - - **eta** (float,可选) - 自适应阈值的衰减系数。仅在自适应 NMS 中且自适应阈值大于 0.5 时生效,在每次迭代中 ``adaptive_threshold = adaptive_treshold * eta`` 。默认值为 1.0。 + - **eta** (float,可选) - 自适应阈值的衰减系数。仅在自适应 NMS 中且自适应阈值大于 0.5 时生效,在每次迭代中 ``adaptive_threshold = adaptive_threshold * eta`` 。默认值为 1.0。 - **pixel_offset** (bool, 可选)- 是否有像素偏移。如果是 True, ``img_size`` 在计算时会偏移 1。默认值为 False。 - **return_rois_num** (bool,可选) - 是否返回 ``rpn_rois_num`` 。当设定为 True 时会返回一个形状为[N,]的 1-D 的 Tensor,包含该 Batch 中每一张图片包含的 RoI 的数目。 N 是批大小和图片数量。默认值为 False。 - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name`,一般无需设置,默认值为 None。 diff --git a/docs/api/paddle/vision/ops/psroi_pool_cn.rst b/docs/api/paddle/vision/ops/psroi_pool_cn.rst index 476e319d867..79b2443a9ea 100644 --- a/docs/api/paddle/vision/ops/psroi_pool_cn.rst +++ b/docs/api/paddle/vision/ops/psroi_pool_cn.rst @@ -7,7 +7,7 @@ psroi_pool 位置敏感的兴趣区域池化(也称为 PSROIPooling),是在指定输入的感兴趣区域上执行位置敏感的平均池化。它在非均匀大小的输入上执行并获得固定大小的特征图。 -PSROIPooling 由 R-FCN 提出。更多详细信息,请参阅 https://arxiv.org/abs/1605.06409。 +PSROIPooling 由 R-FCN 提出。更多详细信息,请参阅 `R-FCN: Object Detection via Region-based Fully Convolutional Networks `_ 。 参数 ::::::::: diff --git a/docs/api_guides/X2Paddle/Caffe-Fluid.rst b/docs/api_guides/X2Paddle/Caffe-Fluid.rst deleted file mode 100644 index 50619ba15fa..00000000000 --- a/docs/api_guides/X2Paddle/Caffe-Fluid.rst +++ /dev/null @@ -1,45 +0,0 @@ -.. _Caffe-Fluid: - -######################## -Caffe-Fluid 常用层对应表 -######################## - -本文档梳理了 Caffe 常用 Layer 与 PaddlePaddle API 对应关系和差异分析。根据文档对应关系,有 Caffe 使用经验的用户,可根据对应关系,快速熟悉 PaddlePaddle 的接口使用。 - - -.. csv-table:: - :header: "序号", "Caffe Layer", "Fluid 接口", "备注" - :widths: 1, 8, 8, 3 - - "1", "`AbsVal `_", ":ref:`cn_api_fluid_layers_abs`", "功能一致" - "2", "`Accuracy `_", ":ref:`cn_api_fluid_layers_accuracy`", "`差异对比 `_" - "3", "`ArgMax `_", ":ref:`cn_api_fluid_layers_argmax`", "`差异对比 `_" - "4", "`BatchNorm `_", ":ref:`cn_api_fluid_layers_batch_norm`", "`差异对比 `_" - "5", "`BNLL `_", ":ref:`cn_api_fluid_layers_softplus`", "功能一致" - "6", "`Concat `_", ":ref:`cn_api_fluid_layers_concat`", "功能一致" - "7", "`Convolution `_", ":ref:`cn_api_fluid_layers_conv2d`", "`差异对比 `_" - "8", "`Crop `_", ":ref:`cn_api_fluid_layers_crop`", "`差异对比 `_" - "9", "`Deconvolution `_", ":ref:`cn_api_fluid_layers_conv2d_transpose`", "`差异对比 `_" - "10", "`Dropout `_", ":ref:`cn_api_fluid_layers_dropout`", "`差异对比 `_" - "11", "`Eltwise `_", "无相应接口", "`Fluid 实现 `_" - "12", "`ELU `_", ":ref:`cn_api_fluid_layers_elu`", "功能一致" - "13", "`EuclideanLoss `_", ":ref:`cn_api_fluid_layers_square_error_cost`", "`差异对比 `_" - "14", "`Exp `_", ":ref:`cn_api_fluid_layers_exp`", "`差异对比 `_" - "15", "`Flatten `_", ":ref:`cn_api_fluid_layers_reshape`", "`差异对比 `_" - "16", "`InnerProduct `_", ":ref:`cn_api_fluid_layers_fc`", "`差异对比 `_" - "17", "`Input `_", ":ref:`cn_api_fluid_layers_data`", "`差异对比 `_" - "18", "`Log `_", ":ref:`cn_api_fluid_layers_log`", "`差异对比 `_" - "19", "`LRN `_", ":ref:`cn_api_fluid_layers_lrn`", "`差异对比 `_" - "20", "`Pooling `_", ":ref:`cn_api_fluid_layers_pool2d`", "`差异对比 `_" - "21", "`Power `_", ":ref:`cn_api_fluid_layers_pow`", "`差异对比 `_" - "22", "`PReLU `_", ":ref:`cn_api_fluid_layers_prelu`", "功能一致" - "23", "`Reduction `_", "无相应接口", "`Fluid 实现 `_" - "24", "`ReLU `_", ":ref:`cn_api_fluid_layers_leaky_relu`", "功能一致" - "25", "`Reshape `_", ":ref:`cn_api_fluid_layers_reshape`", "`差异对比 `_" - "26", "`SigmoidCrossEntropyLoss `_", ":ref:`cn_api_fluid_layers_sigmoid_cross_entropy_with_logits`", "`差异对比 `_" - "27", "`Sigmoid `_", ":ref:`cn_api_fluid_layers_sigmoid`", "功能一致" - "28", "`Slice `_", ":ref:`cn_api_fluid_layers_slice`", "`差异对比 `_" - "29", "`SoftmaxWithLoss `_", ":ref:`cn_api_fluid_layers_softmax_with_cross_entropy`", "`差异对比 `_" - "30", "`Softmax `_", ":ref:`cn_api_fluid_layers_softmax`", "`差异对比 `_" - "31", "`TanH `_", ":ref:`cn_api_fluid_layers_tanh`", "功能一致" - "32", "`Tile `_", ":ref:`cn_api_fluid_layers_expand`", "`差异对比 `_" diff --git a/docs/api_guides/X2Paddle/TensorFlow-Fluid.rst b/docs/api_guides/X2Paddle/TensorFlow-Fluid.rst deleted file mode 100644 index b3bda4f9fc6..00000000000 --- a/docs/api_guides/X2Paddle/TensorFlow-Fluid.rst +++ /dev/null @@ -1,154 +0,0 @@ -.. _TensorFlow-Fluid: - -############################### -TensorFlow-Fluid 常用接口对应表 -############################### - -本文档基于 TensorFlow v1.13 梳理了常用 API 与 PaddlePaddle API 对应关系和差异分析。根据文档对应关系,有 TensorFlow 使用经验的用户,可根据对应关系,快速熟悉 PaddlePaddle 的接口使用。 - -.. csv-table:: - :header: "序号", "TensorFlow 接口", "Fluid 接口", "备注" - :widths: 1, 8, 8, 3 - - "1", "`tf.abs `_", ":ref:`cn_api_fluid_layers_abs`", "功能一致" - "2", "`tf.add `_", ":ref:`cn_api_fluid_layers_elementwise_add`", "功能一致" - "3", "`tf.argmax `_", ":ref:`cn_api_fluid_layers_argmax`", "功能一致" - "4", "`tf.argmin `_", ":ref:`cn_api_fluid_layers_argmin`", "功能一致" - "5", "`tf.assign `_", ":ref:`cn_api_fluid_layers_assign`", "功能一致" - "6", "`tf.assign_add `_", ":ref:`cn_api_fluid_layers_increment`", "功能一致" - "7", "`tf.case `_", ":ref:`cn_api_fluid_layers_Switch`", "`差异对比 `_" - "8", "`tf.cast `_", ":ref:`cn_api_fluid_layers_cast`", "功能一致" - "9", "`tf.clip_by_global_norm `_", ":ref:`cn_api_fluid_clip_GradientClipByGlobalNorm`", "`差异对比 `_" - "10", "`tf.clip_by_norm `_", ":ref:`cn_api_fluid_layers_clip_by_norm`", "`差异对比 `_" - "11", "`tf.clip_by_value `_", ":ref:`cn_api_fluid_layers_clip`", "功能一致" - "12", "`tf.concat `_", ":ref:`cn_api_fluid_layers_concat`", "功能一致" - "13", "`tf.cond `_", ":ref:`cn_api_fluid_layers_ifElse`", "功能一致" - "14", "`tf.constant `_", ":ref:`cn_api_fluid_layers_fill_constant`", "功能一致" - "15", "`tf.contrib.layers.batch_norm `_", ":ref:`cn_api_fluid_layers_batch_norm`", "功能一致" - "16", "`tf.contrib.layers.flatten `_", ":ref:`cn_api_fluid_layers_flatten`", "`差异对比 `_" - "17", "`tf.contrib.layers.fully_connected `_", ":ref:`cn_api_fluid_layers_fc`", "功能一致" - "18", "`tf.contrib.layers.one_hot_encoding `_", ":ref:`cn_api_fluid_layers_one_hot`", "功能一致" - "19", "`tf.contrib.layers.softmax `_", ":ref:`cn_api_fluid_layers_softmax`", "功能一致" - "20", "`tf.contrib.layers.xavier_initializer `_", ":ref:`cn_api_fluid_initializer_Xavier`", "功能一致" - "21", "`tf.nn.rnn.GRUCell `_", ":ref:`cn_api_fluid_layers_gru_unit`", "`差异对比 `_" - "22", "`tf.nn.rnn.MultiRNNCell `_", "无相应接口", "`Fluid 实现 `_" - "23", "`tf.nn.rnn.static_rnn `_", ":ref:`cn_api_fluid_layers_DynamicRNN`", "功能一致" - "24", "`tf.convert_to_tensor `_", ":ref:`cn_api_fluid_layers_assign`", "功能一致" - "25", "`tf.cos `_", ":ref:`cn_api_fluid_layers_cos`", "功能一致" - "26", "`tf.div `_", ":ref:`cn_api_fluid_layers_elementwise_div`", "功能一致" - "27", "`tf.divide `_", ":ref:`cn_api_fluid_layers_elementwise_div`", "功能一致" - "28", "`tf.dropout `_", ":ref:`cn_api_fluid_layers_dropout`", "`差异对比 `_" - "29", "`tf.equal `_", "`运算符== `_", "功能一致" - "30", "`tf.exp `_", ":ref:`cn_api_fluid_layers_exp`", "功能一致" - "31", "`tf.expand_dims `_", ":ref:`cn_api_fluid_layers_unsqueeze`", "`差异对比 `_" - "32", "`tf.fill `_", ":ref:`cn_api_fluid_layers_fill_constant`", "功能一致" - "33", "`tf.floor `_", ":ref:`cn_api_fluid_layers_floor`", "功能一致" - "34", "`tf.gather `_", ":ref:`cn_api_fluid_layers_gather`", "功能一致" - "35", "`tf.greater `_", "`运算符> `_", "功能一致" - "36", "`tf.greater_equal `_", "`运算符>= `_", "功能一致" - "37", "`tf.image.non_max_suppression `_", ":ref:`cn_api_fluid_layers_multiclass_nms`", "`差异对比 `_" - "38", "`tf.image.resize_bilinear `_", ":ref:`cn_api_fluid_layers_resize_bilinear`", "功能一致" - "39", "`tf.image.resize_images `_", ":ref:`cn_api_fluid_layers_image_resize`", "`差异对比 `_" - "40", "`tf.image.resize_nearest_neighbor `_", ":ref:`cn_api_fluid_layers_resize_nearest`", "功能一致" - "41", "`tf.is_finite `_", ":ref:`cn_api_fluid_layers_isfinite`", "`差异对比 `_" - "42", "`tf.layers.batch_normalization `_", ":ref:`cn_api_fluid_layers_batch_norm`", "功能一致" - "43", "`tf.layers.conv2d `_", ":ref:`cn_api_fluid_layers_conv2d`", "`差异对比 `_" - "44", "`tf.layers.dense `_", ":ref:`cn_api_fluid_layers_fc`", "`差异对比 `_" - "45", "`tf.layers.dropout `_", ":ref:`cn_api_fluid_layers_dropout`", "功能一致" - "46", "`tf.layers.Dropout `_", ":ref:`cn_api_fluid_layers_dropout`", "功能一致" - "47", "`tf.layers.flatten `_", ":ref:`cn_api_fluid_layers_flatten`", "功能一致" - "48", "`tf.less `_", "`运算符< `_", "功能一致" - "49", "`tf.less_equal `_", "`运算符<= `_", "功能一致" - "50", "`tf.log `_", ":ref:`cn_api_fluid_layers_log`", "功能一致" - "51", "`tf.logical_and `_", ":ref:`cn_api_fluid_layers_logical_and`", "功能一致" - "52", "`tf.logical_not `_", ":ref:`cn_api_fluid_layers_logical_not`", "功能一致" - "53", "`tf.logical_or `_", ":ref:`cn_api_fluid_layers_logical_or`", "功能一致" - "54", "`tf.losses.mean_squared_error `_", ":ref:`cn_api_fluid_layers_square_error_cost`", "`差异对比 `_" - "55", "`tf.losses.sigmoid_cross_entropy `_", ":ref:`cn_api_fluid_layers_sigmoid_cross_entropy_with_logits`", "`差异对比 `_" - "56", "`tf.losses.softmax_cross_entropy `_", ":ref:`cn_api_fluid_layers_softmax_with_cross_entropy`", "功能一致" - "57", "`tf.matmul `_", ":ref:`cn_api_fluid_layers_matmul`", "`差异对比 `_" - "58", "`tf.maximum `_", ":ref:`cn_api_fluid_layers_elementwise_max`", "功能一致" - "59", "`tf.metrics.accuracy `_", ":ref:`cn_api_fluid_layers_accuracy`", "功能一致" - "60", "`tf.metrics.mean `_", ":ref:`cn_api_fluid_layers_mean`", "功能一致" - "61", "`tf.minimum `_", ":ref:`cn_api_fluid_layers_elementwise_min`", "功能一致" - "62", "`tf.multiply `_", ":ref:`cn_api_fluid_layers_elementwise_mul`", "功能一致" - "63", "`tf.nn.avg_pool `_", ":ref:`cn_api_fluid_layers_pool2d`", "`差异对比 `_" - "64", "`tf.nn.batch_normalization `_", ":ref:`cn_api_fluid_layers_batch_norm`", "功能一致" - "65", "`tf.nn.bidirectional_dynamic_rnn `_", "无相应接口", "`Fluid 实现 `_" - "66", "`tf.nn.conv2d `_", ":ref:`cn_api_fluid_layers_conv2d`", "`差异对比 `_" - "67", "`tf.nn.conv2d_transpose `_", ":ref:`cn_api_fluid_layers_conv2d_transpose`", "`差异对比 `_" - "68", "`tf.nn.conv3d_transpose `_", ":ref:`cn_api_fluid_layers_conv3d_transpose`", "`差异对比 `_" - "69", "`tf.nn.depthwise_conv2d `_", ":ref:`cn_api_fluid_layers_conv2d`", "`差异对比 `_" - "70", "`tf.nn.dynamic_rnn `_", ":ref:`cn_api_fluid_layers_DynamicRNN`", "`差异对比 `_" - "71", "`tf.nn.l2_normalize `_", ":ref:`cn_api_fluid_layers_l2_normalize`", "`差异对比 `_" - "72", "`tf.nn.leaky_relu `_", ":ref:`cn_api_fluid_layers_leaky_relu`", "功能一致" - "73", "`tf.nn.lrn `_", ":ref:`cn_api_fluid_layers_lrn`", "`差异对比 `_" - "74", "`tf.nn.max_pool `_", ":ref:`cn_api_fluid_layers_pool2d`", "`差异对比 `_" - "75", "`tf.nn.relu `_", ":ref:`cn_api_fluid_layers_relu`", "功能一致" - "76", "`tf.nn.relu6 `_", ":ref:`cn_api_fluid_layers_relu6`", "功能一致" - "77", "`tf.nn.rnn_cell.LSTMCell `_", ":ref:`cn_api_fluid_layers_lstm_unit`", "`差异对比 `_" - "78", "`tf.nn.separable_conv2d `_", "无相应接口", "`Fluid 实现 `_" - "79", "`tf.nn.sigmoid `_", ":ref:`cn_api_fluid_layers_sigmoid`", "功能一致" - "80", "`tf.nn.sigmoid_cross_entropy_with_logits `_", ":ref:`cn_api_fluid_layers_sigmoid_cross_entropy_with_logits`", "功能一致" - "81", "`tf.nn.softmax `_", ":ref:`cn_api_fluid_layers_softmax`", "功能一致" - "82", "`tf.nn.softmax_cross_entropy_with_logits `_", ":ref:`cn_api_fluid_layers_softmax_with_cross_entropy`", "`差异对比 `_" - "83", "`tf.nn.softplus `_", ":ref:`cn_api_fluid_layers_softplus`", "功能一致" - "84", "`tf.nn.softsign `_", ":ref:`cn_api_fluid_layers_softsign`", "功能一致" - "85", "`tf.nn.tanh `_", ":ref:`cn_api_fluid_layers_tanh`", "功能一致" - "86", "`tf.one_hot `_", ":ref:`cn_api_fluid_layers_one_hot`", "`差异对比 `_" - "87", "`tf.ones `_", ":ref:`cn_api_fluid_layers_ones`", "功能一致" - "88", "`tf.intializers.ones `_", ":ref:`cn_api_fluid_initializer_Constant`", "功能一致" - "89", "`tf.pad `_", ":ref:`cn_api_fluid_layers_pad`", "`差异对比 `_" - "90", "`tf.placeholder `_", ":ref:`cn_api_fluid_layers_data`", "`差异对比 `_" - "91", "`tf.pow `_", ":ref:`cn_api_fluid_layers_pow`", "`差异对比 `_" - "92", "`tf.print `_", ":ref:`cn_api_fluid_layers_print`", "`差异对比 `_" - "93", "`tf.py_func `_", ":ref:`cn_api_fluid_layers_py_func`", "功能一致" - "94", "`tf.random_normal `_", ":ref:`cn_api_fluid_layers_gaussian_random`", "功能一致" - "95", "`tf.random_normal_initializer `_", ":ref:`cn_api_fluid_initializer_Normal`", "功能一致" - "96", "`tf.random_uniform `_", ":ref:`cn_api_fluid_layers_uniform_random`", "功能一致" - "97", "`tf.random_uniform_initializer `_", ":ref:`cn_api_fluid_initializer_UniformInitializer`", "功能一致" - "98", "`tf.reduce_logsumexp `_", "无相应接口", "`Fluid 实现 `_" - "99", "`tf.reduce_max `_", ":ref:`cn_api_fluid_layers_reduce_max`", "功能一致" - "100", "`tf.reduce_mean `_", ":ref:`cn_api_fluid_layers_reduce_mean`", "功能一致" - "101", "`tf.reduce_min `_", ":ref:`cn_api_fluid_layers_reduce_min`", "功能一致" - "102", "`tf.reduce_sum `_", ":ref:`cn_api_fluid_layers_reduce_sum`", "功能一致" - "103", "`tf.reshape `_", ":ref:`cn_api_fluid_layers_reshape`", "`差异对比 `_" - "104", "`tf.reverse `_", ":ref:`cn_api_fluid_layers_reverse`", "功能一致" - "105", "`tf.reverse_sequence `_", ":ref:`cn_api_fluid_layers_sequence_reverse`", "`差异对比 `_" - "106", "`tf.reverse_v2 `_", ":ref:`cn_api_fluid_layers_reverse`", "功能一致" - "107", "`tf.round `_", ":ref:`cn_api_fluid_layers_round`", "功能一致" - "108", "`tf.rsqrt `_", ":ref:`cn_api_fluid_layers_rsqrt`", "功能一致" - "109", "`tf.scalar_mul `_", ":ref:`cn_api_fluid_layers_scale`", "功能一致" - "110", "`tf.scatter_update `_", ":ref:`cn_api_fluid_layers_scatter`", "`差异对比 `_" - "111", "`tf.sequence_mask `_", ":ref:`cn_api_fluid_layers_sequence_mask`", "功能一致" - "112", "`tf.shape `_", ":ref:`cn_api_fluid_layers_shape`", "功能一致" - "113", "`tf.sigmoid `_", ":ref:`cn_api_fluid_layers_sigmoid`", "功能一致" - "114", "`tf.sin `_", ":ref:`cn_api_fluid_layers_sin`", "功能一致" - "115", "`tf.slice `_", ":ref:`cn_api_fluid_layers_slice`", "`差异对比 `_" - "116", "`tf.split `_", ":ref:`cn_api_fluid_layers_split`", "`差异对比 `_" - "117", "`tf.sqrt `_", ":ref:`cn_api_fluid_layers_sqrt`", "功能一致" - "118", "`tf.square `_", ":ref:`cn_api_fluid_layers_square`", "功能一致" - "119", "`tf.squared_difference `_", "无相应接口", "`Fluid 实现 `_" - "120", "`tf.squeeze `_", ":ref:`cn_api_fluid_layers_squeeze`", "功能一致" - "121", "`tf.stack `_", ":ref:`cn_api_fluid_layers_stack`", "功能一致" - "122", "`tf.stop_gradient `_", "无相应接口", "`Fluid 实现 `_" - "123", "`tf.subtract `_", ":ref:`cn_api_fluid_layers_elementwise_sub`", "功能一致" - "124", "`tf.tanh `_", ":ref:`cn_api_fluid_layers_tanh`", "功能一致" - "125", "`tf.tile `_", ":ref:`cn_api_fluid_layers_expand`", "功能一致" - "126", "`tf.top_k `_", ":ref:`cn_api_fluid_layers_topk`", "`差异对比 `_" - "127", "`tf.train.AdagradOptimizer `_", ":ref:`cn_api_fluid_optimizer_AdagradOptimizer`", "功能一致" - "128", "`tf.train.AdamOptimizer `_", ":ref:`cn_api_fluid_optimizer_Adam`", "功能一致" - "129", "`tf.train.exponential_decay `_", ":ref:`cn_api_fluid_layers_exponential_decay`", "功能一致" - "130", "`tf.train.GradientDescentOptimizer `_", ":ref:`cn_api_fluid_optimizer_SGDOptimizer`", "功能一致" - "131", "`tf.train.MomentumOptimizer `_", ":ref:`cn_api_fluid_optimizer_MomentumOptimizer`", "功能一致" - "132", "`tf.train.polynomial_decay `_", ":ref:`cn_api_fluid_layers_polynomial_decay`", "功能一致" - "133", "`tf.train.RMSPropOptimizer `_", ":ref:`cn_api_fluid_optimizer_RMSPropOptimizer`", "功能一致" - "134", "`tf.transpose `_", ":ref:`cn_api_fluid_layers_transpose`", "功能一致" - "135", "`tf.truediv `_", ":ref:`cn_api_fluid_layers_elementwise_div`", "功能一致" - "136", "`tf.truncated_normal `_", ":ref:`cn_api_fluid_initializer_TruncatedNormal`", "功能一致" - "137", "`tf.truncated_normal_initializer `_", ":ref:`cn_api_fluid_initializer_TruncatedNormal`", "功能一致" - "138", "`tf.unstack `_", ":ref:`cn_api_fluid_layers_unstack`", "功能一致" - "139", "`tf.Variable `_", ":ref:`cn_api_fluid_layers_create_parameter`", "功能一致" - "140", "`tf.while_loop `_", ":ref:`cn_api_fluid_layers_While`", "`差异对比 `_" - "141", "`tf.zeros `_", ":ref:`cn_api_fluid_layers_zeros`", "功能一致" - "142", "`tf.zeros_initializer `_", ":ref:`cn_api_fluid_initializer_Constant`", "功能一致" diff --git a/docs/design/concepts/python_data_feeding.md b/docs/design/concepts/python_data_feeding.md index a4b9391496e..921ddcc7ebb 100644 --- a/docs/design/concepts/python_data_feeding.md +++ b/docs/design/concepts/python_data_feeding.md @@ -2,7 +2,7 @@ In the former implementation of Paddle Fluid, there are two ways to feed data: -- Use `reader_op` in backend C++ side. This method only supports data feeding from recordio files and random data generators, but supports many kinds of `decorated_readers`. For examples, `double_buffer_reader` uses two threads to achieve better performance: one for time-consuming I/O operations, and the other for `Executor::Run()`. See [C++ Data Feeding](https://github.com/PaddlePaddle/Paddle/blob/develop/doc/fluid/design/concepts/cpp_data_feeding.md) for details. +- Use `reader_op` in backend C++ side. This method only supports data feeding from recordio files and random data generators, but supports many kinds of `decorated_readers`. For examples, `double_buffer_reader` uses two threads to achieve better performance: one for time-consuming I/O operations, and the other for `Executor::Run()`. See [C++ Data Feeding](https://github.com/PaddlePaddle/docs/blob/develop/docs/design/concepts/cpp_data_feeding.md) for details. - Feed data directly using `DataFeeder.feed()` in Python codes. It is more flexible than the first way. Many kinds of preprocessing steps can be performed before feeding using Python or any other languages, instead of adding many uncommon `operators` in C++ side. But this method is less efficient: the program cannot read the next mini-batch data before `Executor::Run()` ends. Moreover, `decorated_readers` such as `double_buffer_reader` cannot be used for better performance. diff --git a/docs/design/concepts/tensor.md b/docs/design/concepts/tensor.md index 1de815ee400..990e4bfa6dd 100644 --- a/docs/design/concepts/tensor.md +++ b/docs/design/concepts/tensor.md @@ -116,12 +116,12 @@ Before writing code, please make sure you already look through Majel Source Code ### Memory Management -`Allocation` manages a block of memory in device(CPU/GPU). We use `Place` to decribe memory location. The details of memory allocation and deallocation are implemented in `Allocator` and `DeAllocator`. Related low-level API such as `hl_malloc_device()` and `hl_malloc_host()` are provided by Paddle. +`Allocation` manages a block of memory in device(CPU/GPU). We use `Place` to describe memory location. The details of memory allocation and deallocation are implemented in `Allocator` and `DeAllocator`. Related low-level API such as `hl_malloc_device()` and `hl_malloc_host()` are provided by Paddle. ### Dim and Array #### Dim -`Dim` decribes the dimension information of an array. +`Dim` describes the dimension information of an array. `DDimVar` is an alias of a specializd class of boost.variant class template. @@ -186,4 +186,4 @@ ViewIterator> make_iterator(const Array& in, Dim idx) { The operations that manipulate DArray are defined as global functions, such as `ones`, `zeros`, `reshape`, `gemm` and so on. -An array will be trasformed into an arrayview and then passed to the operation launching on a specific device(CPU/GPU). +An array will be transformed into an arrayview and then passed to the operation launching on a specific device(CPU/GPU). diff --git a/docs/design/concurrent/channel.md b/docs/design/concurrent/channel.md index db2a1737103..97235d66fa7 100644 --- a/docs/design/concurrent/channel.md +++ b/docs/design/concurrent/channel.md @@ -103,9 +103,9 @@ current thread under two conditions: 2. The channel is unbuffered and does not have a receiver - **recvq**: This queue holds the QueueMessage of any pending receivers of a -channel. When a thread performs a channel_recv operation on the channel, the -channel_recv operation will put a new QueueMessage on the recvq and block the -current thread under two conditions: + channel. When a thread performs a channel_recv operation on the channel, the + channel_recv operation will put a new QueueMessage on the recvq and block the + current thread under two conditions: 1. The channel is buffered and there is no data on the buff_ 2. The channel is unbuffered and does not have a sender @@ -114,15 +114,17 @@ current thread under two conditions: #### Channel Send

-
+

+ #### Channel Receive

-
+

+ ## Limitations and Considerations ### Variable Copy diff --git a/docs/design/concurrent/go_op.md b/docs/design/concurrent/go_op.md index 286db8f86e3..95fc8948d7b 100644 --- a/docs/design/concurrent/go_op.md +++ b/docs/design/concurrent/go_op.md @@ -3,7 +3,7 @@ ## Introduction The **go_op** allows user's of PaddlePaddle to run program blocks on a detached -thread. It works in conjuction with CSP operators (channel_send, +thread. It works in conjunction with CSP operators (channel_send, channel_receive, channel_open, channel_close, and select) to allow users to concurrently process data and communicate easily between different threads. @@ -27,7 +27,7 @@ The go operator can be accessed by using the fluid.Go() control flow. This will create a new sub block, where the user can add additional operators to be ran on the thread. -**Note:** Since back propegation is currently not support in the go_op, users +**Note:** Since back propagation is currently not support in the go_op, users should ensure that operators in the go block does not require gradient calculations. @@ -225,7 +225,7 @@ when spawning these threads. For the first version of CSP, we only support OS threads. -#### Backward Propegation: +#### Backward Propagation: go_op currently does not support backwards propagation. Please use go_op with non training operators. diff --git a/docs/design/concurrent/parallel_do.md b/docs/design/concurrent/parallel_do.md index c5b6c094c6a..6e20b9b7b14 100644 --- a/docs/design/concurrent/parallel_do.md +++ b/docs/design/concurrent/parallel_do.md @@ -113,7 +113,7 @@ We can avoid this step by making each device have a copy of the parameter. This 1. In the backward, allreduce param@grad at different devices, this requires 1. `backward.py` add `allreduce` operators at parallel_do_grad 1. `allreduce` operators need to be called in async mode to achieve maximum throughput -1. apply gradients related op(i.e. cliping, normalization, decay, sgd) on different devices in parallel +1. apply gradients related op(i.e. clipping, normalization, decay, sgd) on different devices in parallel By doing so, we also avoided "backward: accumulate param@grad from different devices to the first device". And the ProgramDesc looks like the following diff --git a/docs/design/concurrent/select_op.md b/docs/design/concurrent/select_op.md index da561dfd5b6..1aef49b883c 100644 --- a/docs/design/concurrent/select_op.md +++ b/docs/design/concurrent/select_op.md @@ -254,9 +254,10 @@ only one case will be executed. ### select_op flow

-
+

+ The select algorithm is inspired by golang's select routine. Please refer to http://www.tapirgames.com/blog/golang-concurrent-select-implementation for more information. diff --git a/docs/design/data_type/float16.md b/docs/design/data_type/float16.md index 4081fd6903b..af9d2e1d888 100644 --- a/docs/design/data_type/float16.md +++ b/docs/design/data_type/float16.md @@ -93,7 +93,7 @@ To support the above features, two fundamental conversion functions are provided float16 float_to_half_rn(float f); // convert to half precision in round-to-nearest-even mode float half_to_float(float16 h); ``` -which provides one-to-one conversion between float32 and float16. These twos functions will do different conversion routines based on the current hardware. CUDA/ARM instrinsics will be used when the corresonding hardware is available. If the hardware or compiler level does not support float32 to float16 conversion, software emulation will be performed to do the conversion. +which provides one-to-one conversion between float32 and float16. These twos functions will do different conversion routines based on the current hardware. CUDA/ARM instrinsics will be used when the corresponding hardware is available. If the hardware or compiler level does not support float32 to float16 conversion, software emulation will be performed to do the conversion. ## float16 inference In Fluid, a neural network is represented as a protobuf message called [ProgramDesc](https://github.com/PaddlePaddle/docs/blob/develop/docs/design/concepts/program.md), whose Python wrapper is a [Program](https://github.com/PaddlePaddle/docs/blob/develop/docs/design/modules/python_api.md#program). The basic structure of a program is some nested [blocks](https://github.com/PaddlePaddle/docs/blob/develop/docs/design/modules/python_api.md#block), where each block consists of some [variable](https://github.com/PaddlePaddle/docs/blob/develop/docs/design/modules/python_api.md#variable) definitions and a sequence of [operators](https://github.com/PaddlePaddle/docs/blob/develop/docs/design/modules/python_api.md#operator). An [executor](https://github.com/PaddlePaddle/docs/blob/develop/docs/design/concepts/executor.md) will run a given program desc by executing the sequence of operators in the entrance block of the program one by one. @@ -112,7 +112,7 @@ Operators including convolution and multiplication (used in fully-connected laye When these operators are running in float16 mode, the float16 kernel requires those parameter variables to contain weights of Fluid float16 data type. Thus, we need a convenient way to convert the original float weights to float16 weights. -In Fluid, we use tensor to hold actual data for a variable on the c++ end. [Pybind](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/pybind/tensor_py.h) is used to bind c++ tensors of certain data type with numpy array of the correponding numpy data type on the Python end. Each common c++ built-in data type has a corresponding numpy data type of the same name. However, since there is no built-in float16 type in c++, we cannot directly bind numpy float16 data type with the Fluid float16 class. Since both Fluid float16 and numpy float16 use uint16 as the internal data storage type, we use c++ built-in type `uint16_t` and the corresponding numpy uint16 data type to bridge the gap via [Pybind](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/pybind/tensor_py.h). +In Fluid, we use tensor to hold actual data for a variable on the c++ end. [Pybind](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/pybind/tensor_py.h) is used to bind c++ tensors of certain data type with numpy array of the corresponding numpy data type on the Python end. Each common c++ built-in data type has a corresponding numpy data type of the same name. However, since there is no built-in float16 type in c++, we cannot directly bind numpy float16 data type with the Fluid float16 class. Since both Fluid float16 and numpy float16 use uint16 as the internal data storage type, we use c++ built-in type `uint16_t` and the corresponding numpy uint16 data type to bridge the gap via [Pybind](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/pybind/tensor_py.h). The following code demonstrates how to do the tensor conversion. ```Python diff --git a/docs/design/dist_train/README.md b/docs/design/dist_train/README.md index fe1283e51d5..0392fe87de0 100644 --- a/docs/design/dist_train/README.md +++ b/docs/design/dist_train/README.md @@ -48,7 +48,7 @@ The training process of asynchronous training can be: 2. Trainer gets all parameters back from pserver. ### Note: -There are also some conditions that need to consider. For exmaple: +There are also some conditions that need to consider. For example: 1. If trainer needs to wait for the pserver to apply it's gradient and then get back the parameters back. 1. If we need a lock between parameter update and parameter fetch. diff --git a/docs/design/dist_train/distributed_traing_review.md b/docs/design/dist_train/distributed_training_review.md similarity index 100% rename from docs/design/dist_train/distributed_traing_review.md rename to docs/design/dist_train/distributed_training_review.md diff --git a/docs/design/dynamic_rnn/rnn_design.md b/docs/design/dynamic_rnn/rnn_design.md index 1c5fde8f403..b04b6f624d9 100644 --- a/docs/design/dynamic_rnn/rnn_design.md +++ b/docs/design/dynamic_rnn/rnn_design.md @@ -62,7 +62,7 @@ public: LODTensor LODSliceShared(int level, int elem_begin, int elem_end) const; // copy other's lod_start_pos_, to share LOD info. - // NOTE the LOD info sould not be changed. + // NOTE the LOD info could not be changed. void ShareConstLODFrom(const LODTensor &other) { lod_start_pos_ = other.lod_start_pos_; } diff --git a/docs/design/dynamic_rnn/rnn_design_en.md b/docs/design/dynamic_rnn/rnn_design_en.md index 31153595f0b..4a011cd7ace 100644 --- a/docs/design/dynamic_rnn/rnn_design_en.md +++ b/docs/design/dynamic_rnn/rnn_design_en.md @@ -53,7 +53,7 @@ public: LODTensor LODSliceShared(int level, int elem_begin, int elem_end) const; // copy other's lod_start_pos_, to share LOD info. - // NOTE the LOD info sould not be changed. + // NOTE the LOD info could not be changed. void ShareConstLODFrom(const LODTensor &other) { lod_start_pos_ = other.lod_start_pos_; } diff --git a/docs/design/memory/memory_optimization.md b/docs/design/memory/memory_optimization.md index e73f25baed2..0526e4bc84c 100644 --- a/docs/design/memory/memory_optimization.md +++ b/docs/design/memory/memory_optimization.md @@ -49,7 +49,7 @@ It's not enough to only have some basic strategies. The pre-requisite of memory In our design, the neural network topology is defined as a program. Luckily, [live variable analysis](https://en.wikipedia.org/wiki/Live_variable_analysis) is a classic problem in compilers which can be used in many stages, such as register allocation. -In compilers, the front end of the compiler translates programs into an intermediate language with an unbounded number of temporary variables. This program must run on a machine with a bounded number of registers. Two temporary variables a and b can fit into the same register, if a and b are never "in use" at the same time. Thus, many temporary variables can fit in few registers; if they don't all fit, the excess tempory variables can be kept in memory. +In compilers, the front end of the compiler translates programs into an intermediate language with an unbounded number of temporary variables. This program must run on a machine with a bounded number of registers. Two temporary variables a and b can fit into the same register, if a and b are never "in use" at the same time. Thus, many temporary variables can fit in few registers; if they don't all fit, the excess temporary variables can be kept in memory. Therefore, the compiler needs to analyze the intermediate-representation program to determine which temporary variables are in use at the same time. We say a variable is "live" if it holds a value that may be needed in the future, so this analysis is called liveness analysis. @@ -60,7 +60,7 @@ We can leran these techniques from compilers. There are mainly two stages to mak #### Control Flow Graph -To perform analysis on a program, it is often useful to make a control flow graph. A [control flow graph](https://en.wikipedia.org/wiki/Control_flow_graph) (CFG) in computer science is a representation, using graph notation, of all paths that might be traversed through a program during its execution. Each statement in the program is a node in the flow graph; if statemment x can be followed by statement y, there is an egde from x to y. +To perform analysis on a program, it is often useful to make a control flow graph. A [control flow graph](https://en.wikipedia.org/wiki/Control_flow_graph) (CFG) in computer science is a representation, using graph notation, of all paths that might be traversed through a program during its execution. Each statement in the program is a node in the flow graph; if statemment x can be followed by statement y, there is an edge from x to y. Following is the flow graph for a simple loop. @@ -99,7 +99,7 @@ At last, we take basic strategy and liveness analysis techniques learning from c In-place is a built-in attribute of an operator. Since we treat in-place and other operators differently, we have to add an in-place attribute for every operator. -#### contruct control flow graph +#### construct control flow graph Following is the ProgramDesc protobuf of [machine translation](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/tests/book/test_machine_translation.py) example. diff --git a/docs/design/mkldnn/acquire_api/acquire_api.md b/docs/design/mkldnn/acquire_api/acquire_api.md index 622f777c304..726bebb186e 100644 --- a/docs/design/mkldnn/acquire_api/acquire_api.md +++ b/docs/design/mkldnn/acquire_api/acquire_api.md @@ -70,7 +70,7 @@ Having memory objects and computational primitive we may trigger its execution . #### 5. Registering MKL-DNN memory format in corresponding Tensor Last step is to register MKL-DNN output memory object format inside of Output tensor eg. set Tensor::format_ to MKL-DNN enum that corresponds the way Tensor data is arranged (NCHW, NCHW16C etc.) This enum can be taken from dst memory object (wrapper to Output tensor) in Forward pass or from diff_src memory object (wrapper to X_grad Tensor). -Example of registring MKL-DNN format in output tensor: +Example of registering MKL-DNN format in output tensor: out->set_layout(framework::DataLayout::kMKLDNN); out->set_format(platform::GetMKLDNNFormat(*dst_memory)); diff --git a/docs/design/mkldnn/caching/caching.md b/docs/design/mkldnn/caching/caching.md index 83e2e7da012..0c558696ce0 100644 --- a/docs/design/mkldnn/caching/caching.md +++ b/docs/design/mkldnn/caching/caching.md @@ -83,7 +83,7 @@ Also MKL-DNN caching mechanism is used for transferring whole MKL-DNN memory all ##### Note on multi threading execution scenario PaddlePaddle's program(models) can be executed by single thread as well as multiple threads. Graph's operators can be executed by different threads . In particular forward kernel of given operator may be executed by different thread -than backward kernel of the same instance of operator. In that situation hashing keys used for transferring MKL-DNN primitive descriptors cannot contain Thread ID specific values as key has to be shared among forward and backward kernel. Hence primitive descriptors (to be transfered to backward kernel) are using hashing key that does not contain any thread ID based value. As a result thread safety mechanics (critical section etc.) was employed to +than backward kernel of the same instance of operator. In that situation hashing keys used for transferring MKL-DNN primitive descriptors cannot contain Thread ID specific values as key has to be shared among forward and backward kernel. Hence primitive descriptors (to be transferred to backward kernel) are using hashing key that does not contain any thread ID based value. As a result thread safety mechanics (critical section etc.) was employed to ensure MKL-DNN cache consistency. ### 4. Store once created MKL-DNN objects in order To avoid MKL-DNN recreation diff --git a/docs/design/mkldnn/gru/gru.md b/docs/design/mkldnn/gru/gru.md index d24e4c25b6b..bfd4bfa7918 100644 --- a/docs/design/mkldnn/gru/gru.md +++ b/docs/design/mkldnn/gru/gru.md @@ -41,7 +41,7 @@ Proof: PaddlePaddle allows user to choose activation functions for update/reset gate and output gate. However, oneDNN supports only default `sigmoid` activation for gates and `tanh` for output. Currently oneDNN operator throws an error when user tries to execute it with other activations. ## oneDNN GRU operator -oneDNN `GRU` operator is based on Paddle Paddle `fusion_gru` operator. It uses primitive/memory caching mechanism called `AcquireAPI`. Handler containg 2 caching key, one dependent on sentence length used in caching input/output and primitive. The other key (`memory_key`) depends only on other, not changing during inference, parameters and is used to cache weights and bias memory. +oneDNN `GRU` operator is based on Paddle Paddle `fusion_gru` operator. It uses primitive/memory caching mechanism called `AcquireAPI`. Handler containing 2 caching key, one dependent on sentence length used in caching input/output and primitive. The other key (`memory_key`) depends only on other, not changing during inference, parameters and is used to cache weights and bias memory. ### Dimensions in oneDNN RNN primitives @@ -95,7 +95,7 @@ oneDNN `GRU` operator is based on Paddle Paddle `fusion_gru` operator. It uses p * PaddlePaddle Input LoD -> oneDNN TNC/NTC\ Every time before executing `GRU`, each batch represented by PP tensor has to be converted into oneDNN tensor representation. It is done first by calculating length of the longest sentence in a batch to get `T` dimension and then creating oneDNN memory (or getting it from oneDNN cache). After that, based on the memory format chosen by oneDNN GRU primitive: `TNC` or `NTC` correct custom reorder is called.\ \ -Because oneDNN assumes that all sentences are of equal length, before reorder, whole memory is set to 0 to add padding. Placement of this padding depends also on computation direction that is defined by `is_reverse` attribute. To get correct resuts, if computation is performed from left to right, the padding has to be on the right side of words. Otherwise, for right to left computation, it has to be on the left side. +Because oneDNN assumes that all sentences are of equal length, before reorder, whole memory is set to 0 to add padding. Placement of this padding depends also on computation direction that is defined by `is_reverse` attribute. To get correct results, if computation is performed from left to right, the padding has to be on the right side of words. Otherwise, for right to left computation, it has to be on the left side. ![](images/input_is_reverse.svg) * PaddlePaddle WeightX -> oneDNN WeightX\ diff --git a/docs/design/mkldnn/inplace/inplace.md b/docs/design/mkldnn/inplace/inplace.md index cc3e4821e8d..10967c26de4 100644 --- a/docs/design/mkldnn/inplace/inplace.md +++ b/docs/design/mkldnn/inplace/inplace.md @@ -15,7 +15,7 @@ Currently assumption is that if operator can have in-place processing then all i - gelu* - sum** -Adventages of in-place computation are: +Advantages of in-place computation are: * lower memory usage * improved performance of operators @@ -94,4 +94,4 @@ replace this original name in all of next op instances. \* oneDNN gelu kernel is able to perform in-place execution, but currently gelu op does not support in-place execution. -\*\* sum kernel is using oneDNN sum primitive that does not provide in-place exection, so in-place computation is done faked through external buffer. So it was not added into oneDNN inplace pass. +\*\* sum kernel is using oneDNN sum primitive that does not provide in-place execution, so in-place computation is done faked through external buffer. So it was not added into oneDNN inplace pass. diff --git a/docs/design/mkldnn/int8/QAT/C++.md b/docs/design/mkldnn/int8/QAT/C++.md index 3203e3c5bdd..d47ab61802a 100644 --- a/docs/design/mkldnn/int8/QAT/C++.md +++ b/docs/design/mkldnn/int8/QAT/C++.md @@ -51,7 +51,7 @@ To download other Quant models, set the `QUANT_MODEL_NAME` variable to on of the - `ResNet50_qat_channelwise`, with input/output scales in `fake_quantize_range_abs_max` operators and the `out_threshold` attributes, with weight scales in `fake_channel_wise_dequantize_max_abs` operators -### Model convertion +### Model conversion To run this quantiozation approach, first you need to set `AnalysisConfig` first and use `EnableMkldnnInt8` function that converts fake-quant model to INT8 OneDNN one. Examples: diff --git a/docs/design/modules/batch_norm_op.md b/docs/design/modules/batch_norm_op.md index 7dc75cbd520..b4d135f6355 100644 --- a/docs/design/modules/batch_norm_op.md +++ b/docs/design/modules/batch_norm_op.md @@ -58,7 +58,7 @@ As most C++ operators do, `batch_norm_op` is defined by inputs, outputs, attribu #### Attributes - `is_infer`: *bool*. If true, run `batch_norm_op` in inferencing mode. -- `use_global_est`: *bool*. If true, use `saved_mean` and `saved_var` instead of `E[x]` and `STD[x]` in trainning. +- `use_global_est`: *bool*. If true, use `saved_mean` and `saved_var` instead of `E[x]` and `STD[x]` in training. - `epsilon`: *float*. The epsilon value to avoid division by zero. - `momentum`: *float*. Factor used in `estimated_mean` and `estimated_var` updating. The usage is shown above. diff --git a/docs/design/modules/net_op_design.md b/docs/design/modules/net_op_design.md index 15f44185a4d..def3e2c123f 100644 --- a/docs/design/modules/net_op_design.md +++ b/docs/design/modules/net_op_design.md @@ -95,7 +95,7 @@ class PlainNet : public Net { virtual Error InferShape(Scope *scope) override; // Run all the operators with the `scope`, if no scope is provided, default - // scope will be used instead. If no OpContext is provicded, default context will be used. + // scope will be used instead. If no OpContext is provided, default context will be used. virtual Error Run(Scope *scope = nullptr, OpContext *context=nullptr, OpIndex begin = -1, OpIndex end = -1) const override; @@ -106,7 +106,7 @@ class PlainNet : public Net { virtual Error AddBackwardOps() override; protected: - // Create operators accordding to `def`, will be called by the constructor. + // Create operators according to `def`, will be called by the constructor. Error BuildNet(const NetDesc &def); // Add a operator which is identified as `type` and has attributes described diff --git a/docs/design/modules/prune.md b/docs/design/modules/prune.md index 2925338d36c..88928565d36 100644 --- a/docs/design/modules/prune.md +++ b/docs/design/modules/prune.md @@ -45,7 +45,7 @@ If an operator needs to be run, it must fall into one of the following cases: 1. It is the target. 2. It is depended by some other ops, meaning its output is some other op's input. -The first case can be checked by `op_desc.is_traget()` . The second case can be implement as +The first case can be checked by `op_desc.is_target()` . The second case can be implement as ```c++ bool HasDependentVar(const OpDesc& op_desc, const std::set& dependent_vars) { diff --git a/docs/design/motivation/api.md b/docs/design/motivation/api.md index bc222564e3e..b2f407f78a4 100644 --- a/docs/design/motivation/api.md +++ b/docs/design/motivation/api.md @@ -54,14 +54,14 @@ def f(in): return o # Create 3 topologies (subnets), they share parameters because all -# correspoinding layers have the same parameter names. +# corresponding layers have the same parameter names. fA = f(paddle.layer.data(input_name="A")) fB = f(paddle.layer.data(input_name="B")) fQ = f(paddle.layer.data(input_name="Q")) topology = paddle.layer.less_than( paddle.layer.cross_entropy(fA, fQ), - paddle.layer.corss_entropy(fB, fQ)) + paddle.layer.cross_entropy(fB, fQ)) # Derive parameters required in topology and create them in model. parameters = paddle.parameters.create(topology) diff --git a/docs/design/network/deep_speech_2.md b/docs/design/network/deep_speech_2.md index 5497c022bd4..31520fbd778 100644 --- a/docs/design/network/deep_speech_2.md +++ b/docs/design/network/deep_speech_2.md @@ -102,7 +102,7 @@ Issue for each task will be created later. Contributions, discussions and commen ### Overview -Traditional **ASR** (Automatic Speech Recognition) pipelines require great human efforts devoted to elaborately tuning multiple hand-engineered components (e.g. audio feature design, accoustic model, pronuncation model and language model etc.). **Deep Speech 2** (**DS2**) \[[1](#references)\], however, trains such ASR models in an end-to-end manner, replacing most intermediate modules with only a single deep network architecture. With scaling up both the data and model sizes, DS2 achieves a very significant performance boost. +Traditional **ASR** (Automatic Speech Recognition) pipelines require great human efforts devoted to elaborately tuning multiple hand-engineered components (e.g. audio feature design, acoustic model, pronuncation model and language model etc.). **Deep Speech 2** (**DS2**) \[[1](#references)\], however, trains such ASR models in an end-to-end manner, replacing most intermediate modules with only a single deep network architecture. With scaling up both the data and model sizes, DS2 achieves a very significant performance boost. Please read Deep Speech 2 \[[1](#references),[2](#references)\] paper for more background knowledge. @@ -117,7 +117,7 @@ The classical DS2 network contains 15 layers (from bottom to top):

-Figure 1. Archetecture of Deep Speech 2 Network. +Figure 1. Architecture of Deep Speech 2 Network.
We don't have to persist on this 2-3-7-1-1-1 depth \[[2](#references)\]. Similar networks with different depths might also work well. As in \[[1](#references)\], authors use a different depth (e.g. 2-2-3-1-1-1) for final experiments. diff --git a/docs/design/others/gan_api.md b/docs/design/others/gan_api.md index f46b9634d71..4aabf6ebe1b 100644 --- a/docs/design/others/gan_api.md +++ b/docs/design/others/gan_api.md @@ -42,7 +42,7 @@ build the whole GAN model, define training loss for both generator and discrimat To be more detailed, we introduce our design of DCGAN as following: ### Class member Function: Initializer -- Set up hyper-parameters, including condtional dimension, noise dimension, batch size and so forth. +- Set up hyper-parameters, including conditional dimension, noise dimension, batch size and so forth. - Declare and define all the model variables. All the discriminator parameters are included in the list self.theta_D and all the generator parameters are included in the list self.theta_G. ```python class DCGAN: diff --git a/docs/design/others/graph_survey.md b/docs/design/others/graph_survey.md index b4b824a2893..d713849af2f 100644 --- a/docs/design/others/graph_survey.md +++ b/docs/design/others/graph_survey.md @@ -30,7 +30,7 @@ def get_symbol(num_classes=10, **kwargs): Variable here is actually a Symbol. Every basic Symbol will correspond to one Node, and every Node has its own AnyAttr. There is a op field in AnyAttr class, when a Symbol represents Variable(often input data), the op field is null. -Symbol contains a data member, std::vector outputs, and NodeEntry cantains a poniter to Node. We can follow the Node pointer to get all the Graph. +Symbol contains a data member, std::vector outputs, and NodeEntry contains a pointer to Node. We can follow the Node pointer to get all the Graph. And Symbol can be saved to a JSON file. diff --git a/docs/design/others/releasing_process.md b/docs/design/others/releasing_process.md index 4913524f381..1fd91564d1e 100644 --- a/docs/design/others/releasing_process.md +++ b/docs/design/others/releasing_process.md @@ -43,7 +43,7 @@ PaddlePaddle 开发过程使用[git-flow](http://nvie.com/posts/a-successful-git * 其他用户的 fork 版本库并不需要严格遵守[git-flow](http://nvie.com/posts/a-successful-git-branching-model/)分支规范,但所有 fork 的版本库的所有分支都相当于特性分支。 * 建议,开发者 fork 的版本库使用`develop`分支同步主版本库的`develop`分支 * 建议,开发者 fork 的版本库中,再基于`develop`版本 fork 出自己的功能分支。 - * 当功能分支开发完毕后,向 PaddlePaddle 的主版本库提交`Pull Reuqest`,进而进行代码评审。 + * 当功能分支开发完毕后,向 PaddlePaddle 的主版本库提交`Pull Request`,进而进行代码评审。 * 在评审过程中,开发者修改自己的代码,可以继续在自己的功能分支提交代码。 * BugFix 分支也是在开发者自己的 fork 版本库维护,与功能分支不同的是,BugFix 分支需要分别给主版本库的`master`、`develop`与可能有的`release/版本号`分支,同时提起`Pull Request`。 diff --git a/docs/design/others/simple_op_design.md b/docs/design/others/simple_op_design.md index c93c21affe9..13c1ec35b0b 100644 --- a/docs/design/others/simple_op_design.md +++ b/docs/design/others/simple_op_design.md @@ -64,7 +64,7 @@ message OpProto { To generate Python code automatically: ```python -def create_python_ops_creatation_functions(): +def create_python_ops_creation_functions(): op_protos = paddle.framework.OpRegistry.get_all_op_proto() for type_name in op_protos: op_proto = op_protos[type_name] @@ -77,7 +77,7 @@ def create_python_ops_creatation_functions(): __impl__.__doc__ = create_doc_string(op_proto) globals()[type_name] = __impl__ -create_python_ops_creatation_functions() +create_python_ops_creation_functions() ``` ### Message from Python to C++ diff --git a/docs/design/phi/design_cn.md b/docs/design/phi/design_cn.md index 6ccbf426fa8..ba673e69b8c 100644 --- a/docs/design/phi/design_cn.md +++ b/docs/design/phi/design_cn.md @@ -1670,7 +1670,7 @@ Fc(const Context& dev_ctx, const Tensor& x, const Tensor& w, const Tensor& b, Te phi::add(phi::mul(x, w), b, out); } -PT_REGISTE_KERNEL("fc", Fc, ...) +PT_REGISTER_KERNEL("fc", Fc, ...) ``` mul 和 add 操作的拼接,代码量很少,再加一个注册声明。 diff --git a/docs/design/phi/design_en.md b/docs/design/phi/design_en.md index ee214a68e06..5173687327d 100644 --- a/docs/design/phi/design_en.md +++ b/docs/design/phi/design_en.md @@ -867,7 +867,7 @@ For the management of the new form of Kernel, the current design is as follows: Described as follows: - `KernelFactory` is a global singleton data structure for managing Kernel. Similar to `OpKernelMap` of fluid, it is a two-level map. The first-level mapping finds the Kernel set according to the name, and the second-level mapping finds the specific Kernel according to the KernelKey. -- `KernelKey` is similar to the original `OpKernelType`, but the `palce` and `library_type` fields are combined into one and called `Backend`, because the original `LibraryType` is a limited enumeration class, which is strongly related to place, the splitting increases the cost of understanding instead. +- `KernelKey` is similar to the original `OpKernelType`, but the `place` and `library_type` fields are combined into one and called `Backend`, because the original `LibraryType` is a limited enumeration class, which is strongly related to place, the splitting increases the cost of understanding instead. - `Kernel` holds more information than the original `OpKernel`. In addition to the Function during execution, it also holds information about specific parameters, namely `KernelArgsDef`. For Tensor type input and output, it saves Tensor type information, Device, data Type, data layout. For Attribute type input and output, it saves type information. diff --git a/docs/design/phi/kernel_migrate_cn.md b/docs/design/phi/kernel_migrate_cn.md index 5ad778a4be3..fb80ccc33b0 100644 --- a/docs/design/phi/kernel_migrate_cn.md +++ b/docs/design/phi/kernel_migrate_cn.md @@ -159,7 +159,7 @@ void LogSoftmaxKernel(const Context& dev_ctx, | `auto* ptr = out->mutbale_data()` | `auto* ptr = out->data()` | | `out->mutbale_data(dims, place)` | `out->Resize(dims); dev_ctx.template Alloc(out)` | | `out->mutbale_data(place, dtype)` | `dev_ctx.Alloc(out, dtype)` | -| `platform::erros::XXX` | `phi::erros::XXX` | +| `platform::errors::XXX` | `phi::errors::XXX` | | `platform::float16/bfloat16/complex64/complex128` | `dtype::float16/bfloat16/complex64/complex128` | | `framework::Eigen***` | `Eigen***` | | `platform::XXXPlace` | `phi::XXXPlace` | diff --git a/docs/design/phi/kernel_migrate_en.md b/docs/design/phi/kernel_migrate_en.md index f2a062ec0a8..26c653e0cdc 100644 --- a/docs/design/phi/kernel_migrate_en.md +++ b/docs/design/phi/kernel_migrate_en.md @@ -159,7 +159,7 @@ Secondly, it is necessary to replace some of the types or functions that were on | `auto* ptr = out->mutbale_data()` | `auto* ptr = out->data()` | | `out->mutbale_data(dims, place)` | `out->Resize(dims); dev_ctx.template Alloc(out)` | | `out->mutbale_data(place, dtype)` | `dev_ctx.Alloc(out, dtype)` | -| `platform::erros::XXX` | `phi::erros::XXX` | +| `platform::errors::XXX` | `phi::errors::XXX` | | `platform::float16/bfloat16/complex64/complex128` | `dtype::float16/bfloat16/complex64/complex128` | | `framework::Eigen***` | `Eigen***` | | `platform::XXXPlace` | `phi::XXXPlace` | @@ -304,7 +304,7 @@ Differences include: 1. The name of the registered macro is different, here is `PD_REGISTER_PLUGIN_KERNEL`. 2. The name of the Backend is the name of the CustomDevice registered by the user, here is `ascend`. -The kernel that registerd by REGISTER_OP_KERNEL_WITH_CUSTOM_TYPE in Fluid is also registered using `PD_REGISTER_KERNEL` or `PD_REGISTER_PLUGIN_KERNEL` in PHI. It should be noted that if there are two types of kernel template parameters registered in fluid, since the kernel registered in PHI only supports one type, the first type is used in PHI registration. For example, the example under fluid: +The kernel that registered by REGISTER_OP_KERNEL_WITH_CUSTOM_TYPE in Fluid is also registered using `PD_REGISTER_KERNEL` or `PD_REGISTER_PLUGIN_KERNEL` in PHI. It should be noted that if there are two types of kernel template parameters registered in fluid, since the kernel registered in PHI only supports one type, the first type is used in PHI registration. For example, the example under fluid: ```c++ diff --git a/docs/dev_guides/api_contributing_guides/api_accpetance_criteria_cn.md b/docs/dev_guides/api_contributing_guides/api_acceptance_criteria_cn.md similarity index 100% rename from docs/dev_guides/api_contributing_guides/api_accpetance_criteria_cn.md rename to docs/dev_guides/api_contributing_guides/api_acceptance_criteria_cn.md diff --git a/docs/dev_guides/api_contributing_guides/api_contributing_guides_cn.rst b/docs/dev_guides/api_contributing_guides/api_contributing_guides_cn.rst index 00cbd1d7f4f..11ace8b1a52 100644 --- a/docs/dev_guides/api_contributing_guides/api_contributing_guides_cn.rst +++ b/docs/dev_guides/api_contributing_guides/api_contributing_guides_cn.rst @@ -73,7 +73,7 @@ API 设计文档的目的是为了社区开发者更容易的参与开源项目 ", "`Github 飞桨训练框架仓库 `_" "2、API 英文文档", "- `API 文档书写规范 `_", "`Github 飞桨训练框架仓库 `_" "3、API 中文文档", "- `API 文档书写规范 `_", "`Github 飞桨文档仓库 `_" - "4、API 单测代码", "- `API 验收标准 <./api_accpetance_criteria_cn.html>`_", "`Github 飞桨训练框架仓库 `_" + "4、API 单测代码", "- `API 验收标准 <./api_acceptance_criteria_cn.html>`_", "`Github 飞桨训练框架仓库 `_" 当开发者完成以上代码设计后,需要将代码提交至 `Github 飞桨训练框架仓库 `_ ,并根据 `本地开发指南 `_ 提交 PR、准备接受社区的评审。 @@ -108,4 +108,4 @@ API 设计文档的目的是为了社区开发者更容易的参与开源项目 auto_parallel_op_cn.md api_design_guidelines_standard_cn.md api_docs_guidelines_cn.md - api_accpetance_criteria_cn.md + api_acceptance_criteria_cn.md diff --git a/docs/dev_guides/api_contributing_guides/api_design_guidelines_standard_cn.md b/docs/dev_guides/api_contributing_guides/api_design_guidelines_standard_cn.md index d13d20995cb..c28310924ba 100644 --- a/docs/dev_guides/api_contributing_guides/api_design_guidelines_standard_cn.md +++ b/docs/dev_guides/api_contributing_guides/api_design_guidelines_standard_cn.md @@ -538,7 +538,7 @@ | 级联 | coalesced | | | 数据并行 | data parallelism | | | 模型并行 | model parallelism | | -| 异步随机梯度下降 | Asynchoronous Stochastic Gradient Descent | | +| 异步随机梯度下降 | Asynchronous Stochastic Gradient Descent | | | 参数服务器 | parameter server | | | 模型压缩 | model compression | | | 动态结构 | dynamic structure | | diff --git a/docs/dev_guides/api_contributing_guides/auto_parallel_op_cn.md b/docs/dev_guides/api_contributing_guides/auto_parallel_op_cn.md index 91454acda5c..f0a3d7f34cb 100644 --- a/docs/dev_guides/api_contributing_guides/auto_parallel_op_cn.md +++ b/docs/dev_guides/api_contributing_guides/auto_parallel_op_cn.md @@ -107,7 +107,7 @@ SpmdInfo ElementwiseBinaryInferSpmd(const DistMetaTensor& x, std::string x_axes, y_axes, out_axes; GetBinaryNotations(x_shape, y_shape, &x_axes, &y_axes, &out_axes); - // Step2: Sharding Propogation + // Step2: Sharding Propagation // Step2.1: 合并输入的 dims mapping,得到每一维度对应的 dims mapping 值。 // 调用 ShardingMergeForTensors 可以对输入 dims mapping 进行合并,返回的 map 即为 // 每一维度对应的 dims mapping 值。 diff --git a/docs/dev_guides/api_contributing_guides/new_cpp_op_cn.md b/docs/dev_guides/api_contributing_guides/new_cpp_op_cn.md index c84a1b1eb83..6019f1f3918 100644 --- a/docs/dev_guides/api_contributing_guides/new_cpp_op_cn.md +++ b/docs/dev_guides/api_contributing_guides/new_cpp_op_cn.md @@ -990,7 +990,7 @@ class TestTraceOp(OpTest): Python API 也需要编写相关的单测进行测试,详见 [开发 API Python 端](new_python_api_cn.html)。 -其他有关单元测试添加的注意事项请参考 [Op 开发手册](https://github.com/PaddlePaddle/Paddle/wiki/Operator-Development-Manual-Index) 及 [API 单测开发及验收规范](api_accpetance_criteria_cn.html)。 +其他有关单元测试添加的注意事项请参考 [Op 开发手册](https://github.com/PaddlePaddle/Paddle/wiki/Operator-Development-Manual-Index) 及 [API 单测开发及验收规范](api_acceptance_criteria_cn.html)。 ### 6.3 运行单元测试 diff --git a/docs/dev_guides/api_contributing_guides/new_python_api_cn.md b/docs/dev_guides/api_contributing_guides/new_python_api_cn.md index 19ff517967f..04117011535 100644 --- a/docs/dev_guides/api_contributing_guides/new_python_api_cn.md +++ b/docs/dev_guides/api_contributing_guides/new_python_api_cn.md @@ -324,7 +324,7 @@ from .tensor.math import trace **(2)Python API 单测开发及验收规范** -请遵循飞桨的 [API 单测开发及验收规范](api_accpetance_criteria_cn.html),需提前阅读。 +请遵循飞桨的 [API 单测开发及验收规范](api_acceptance_criteria_cn.html),需提前阅读。 > 特别注意:单元测试要求新增代码单元测试行覆盖率达到 90%,可在 [CI 测试](../git_guides/paddle_ci_manual_cn.html) 的 PR-CI-Coverage 测试项中查看覆盖率。 @@ -509,6 +509,6 @@ Paddle 编译过程中,对于 Python 代码的处理方式是,先把它们 - [Op 开发手册(Operator Development Manual)](https://github.com/PaddlePaddle/Paddle/wiki/Operator-Development-Manual-Index) - [API 的设计和命名规范](api_docs_guidelines_cn.html) -- [API 单测开发及验收规范](api_accpetance_criteria_cn.html) +- [API 单测开发及验收规范](api_acceptance_criteria_cn.html) - [文档贡献指南](../docs_contributing_guides_cn.html) - [API 文档书写规范](api_docs_guidelines_cn.html) diff --git a/docs/dev_guides/api_contributing_guides/read_before_contributing_cn.md b/docs/dev_guides/api_contributing_guides/read_before_contributing_cn.md index 7623bca1aec..094bbeaa2ce 100644 --- a/docs/dev_guides/api_contributing_guides/read_before_contributing_cn.md +++ b/docs/dev_guides/api_contributing_guides/read_before_contributing_cn.md @@ -46,5 +46,5 @@ - [代码风格规范](../git_guides/codestyle_check_guide_cn.html) - [API 设计和命名规范](api_design_guidelines_standard_cn.html) -- [API 单元测试及验收规范](api_accpetance_criteria_cn.html) +- [API 单元测试及验收规范](api_acceptance_criteria_cn.html) - [Paddle CI 测试详解](../git_guides/paddle_ci_manual_cn.html) diff --git a/docs/dev_guides/custom_device_docs/custom_device_example_en.md b/docs/dev_guides/custom_device_docs/custom_device_example_en.md index a0a46416af5..3d222e3d0fe 100644 --- a/docs/dev_guides/custom_device_docs/custom_device_example_en.md +++ b/docs/dev_guides/custom_device_docs/custom_device_example_en.md @@ -10,7 +10,7 @@ In this section we will walk through the steps required to extend a fake hardwar **InitPlugin** -As a custom runtime entry function, InitPlugin is required to be implemented by the plug-in. The parameter in InitPlugin should also be checked, device information should be filled in, and the runtime API should be registered. In the initialization, PaddlePaddle loads the plug-in and invokes InitPlugin to initialize it, and register runtime (The whole process can be done automatically by the framework, only if the dynamic-link library is in site-packages/paddle-plugins/ or the designated directory of the enviornment variable of CUSTOM_DEVICE_ROOT). +As a custom runtime entry function, InitPlugin is required to be implemented by the plug-in. The parameter in InitPlugin should also be checked, device information should be filled in, and the runtime API should be registered. In the initialization, PaddlePaddle loads the plug-in and invokes InitPlugin to initialize it, and register runtime (The whole process can be done automatically by the framework, only if the dynamic-link library is in site-packages/paddle-plugins/ or the designated directory of the environment variable of CUSTOM_DEVICE_ROOT). Example: diff --git a/docs/dev_guides/custom_device_docs/device_api_en.md b/docs/dev_guides/custom_device_docs/device_api_en.md index 6e47bf89ba9..8155b9dbd20 100644 --- a/docs/dev_guides/custom_device_docs/device_api_en.md +++ b/docs/dev_guides/custom_device_docs/device_api_en.md @@ -50,7 +50,7 @@ C_Status (*deinit_device)(const C_Device device) ### Description -It finalizes the designated device, and deallocate resources allocated to all devices. The API is inovked during the exit. If not implemented, it will not be inovked and it is invoked before finalization. +It finalizes the designated device, and deallocate resources allocated to all devices. The API is invoked during the exit. If not implemented, it will not be invoked and it is invoked before finalization. ### Parameter diff --git a/docs/dev_guides/custom_device_docs/event_api_en.md b/docs/dev_guides/custom_device_docs/event_api_en.md index 887bedb04b2..a41d90ff59b 100644 --- a/docs/dev_guides/custom_device_docs/event_api_en.md +++ b/docs/dev_guides/custom_device_docs/event_api_en.md @@ -12,7 +12,7 @@ C_Status (*create_event)(const C_Device device, C_Event* event) It creates an event, which is used to synchronize tasks of different streams within the framework. When the device does not support asynchronous execution, empty implementation of the API is required. -### Paremeter +### Parameter device - the device to be used diff --git a/docs/dev_guides/custom_device_docs/stream_api_en.md b/docs/dev_guides/custom_device_docs/stream_api_en.md index 9c854052773..eea401432fa 100644 --- a/docs/dev_guides/custom_device_docs/stream_api_en.md +++ b/docs/dev_guides/custom_device_docs/stream_api_en.md @@ -10,7 +10,7 @@ C_Status (*create_stream)(const C_Device device, C_Stream* stream) ### Description -It creats a stream, which is used to execute asynchronous tasks within the framework. In the stream, tasks are done in order. When the device does not support asynchronous execution, the API is required to be implemented with an empty method. +It creates a stream, which is used to execute asynchronous tasks within the framework. In the stream, tasks are done in order. When the device does not support asynchronous execution, the API is required to be implemented with an empty method. ### Parameter diff --git a/docs/dev_guides/git_guides/code_review_en.md b/docs/dev_guides/git_guides/code_review_en.md index 10f8cee4268..889684721e2 100644 --- a/docs/dev_guides/git_guides/code_review_en.md +++ b/docs/dev_guides/git_guides/code_review_en.md @@ -1,4 +1,4 @@ -# Code Reivew promise +# Code Review promise In order that reviewers focus on code in the code review,please follow these rules every time you submit your code: @@ -8,11 +8,11 @@ In order that reviewers focus on code in the code review,please follow these rul In addition,please follow the following regulations in response to the suggestion of reviewers: -1)A reply to every comment of reviewers(It's a fundamental complimentary conduct in open source community.An expression of appreciation is a need for help from others): +1)A reply to every comment of reviewers(It's a fundamental complimentary conduct in open source community.An expression of appreciation is a need for help from others): - If you adopt the suggestion of reviewer and make a modification accordingly, it's courteous to reply with a simple `Done` . - - Please clarify your reason to the disagreenment + - Please clarify your reason to the disagreement 2)If there are many suggestions diff --git a/docs/dev_guides/git_guides/local_dev_guide_cn.md b/docs/dev_guides/git_guides/local_dev_guide_cn.md index 5a32cbba40a..747fb59421f 100644 --- a/docs/dev_guides/git_guides/local_dev_guide_cn.md +++ b/docs/dev_guides/git_guides/local_dev_guide_cn.md @@ -116,7 +116,7 @@ clang-format.......................................(no files to check)Skipped create mode 100644 233 ``` -可以看到,在执行`git commit`后,输出了一些额外的信息。这是使用`pre-commmit`进行代码风格检查的结果,关于代码风格检查的使用问题请参考[代码风格检查指南](./codestyle_check_guide_cn.html)。 +可以看到,在执行`git commit`后,输出了一些额外的信息。这是使用`pre-commit`进行代码风格检查的结果,关于代码风格检查的使用问题请参考[代码风格检查指南](./codestyle_check_guide_cn.html)。 ## 保持本地仓库最新 diff --git a/docs/dev_guides/op_optimization/kernel_primitive_api/add_example_cn.md b/docs/dev_guides/op_optimization/kernel_primitive_api/add_example_cn.md index f0f2532f90c..cb293690884 100644 --- a/docs/dev_guides/op_optimization/kernel_primitive_api/add_example_cn.md +++ b/docs/dev_guides/op_optimization/kernel_primitive_api/add_example_cn.md @@ -39,7 +39,7 @@ __device__ void ElementwiseAddImpl(InT *in0, InT * in1, OutT * out, OpFunc func, ReadData(arg0, in0, num); ReadData(arg1, in1, num); - // compute resut[i] = args[i] + arg1[i] + // compute result[i] = args[i] + arg1[i] ElementwiseBinary(result, arg0, arg1, func); // write data diff --git a/docs/dev_guides/op_optimization/kernel_primitive_api/add_example_en.md b/docs/dev_guides/op_optimization/kernel_primitive_api/add_example_en.md index eb9cb65f665..d199f595452 100644 --- a/docs/dev_guides/op_optimization/kernel_primitive_api/add_example_en.md +++ b/docs/dev_guides/op_optimization/kernel_primitive_api/add_example_en.md @@ -38,7 +38,7 @@ __device__ void ElementwiseAddImpl(InT *in0, InT * in1, OutT * out, OpFunc func, ReadData(arg0, in0, num); ReadData(arg1, in1, num); - // compute resut[i] = args[i] + arg1[i] + // compute result[i] = args[i] + arg1[i] ElementwiseBinary(result, arg0, arg1, func); // write data diff --git a/docs/dev_guides/op_optimization/op_optimization_accpetance_criteria_cn.md b/docs/dev_guides/op_optimization/op_optimization_acceptance_criteria_cn.md similarity index 100% rename from docs/dev_guides/op_optimization/op_optimization_accpetance_criteria_cn.md rename to docs/dev_guides/op_optimization/op_optimization_acceptance_criteria_cn.md diff --git a/docs/dev_guides/op_optimization/op_optimization_contributing_guides_cn.rst b/docs/dev_guides/op_optimization/op_optimization_contributing_guides_cn.rst index 314f8e6a8a6..1e154c16aa0 100644 --- a/docs/dev_guides/op_optimization/op_optimization_contributing_guides_cn.rst +++ b/docs/dev_guides/op_optimization/op_optimization_contributing_guides_cn.rst @@ -66,7 +66,7 @@ - `C++ OP 开发指南 <../api_contributing_guides/new_cpp_op_cn.html>`_ - `OP Benchmark 使用指南 `_ - `算子性能优化 优化方法 <./op_optimization_method_introduction_cn.html>`_ - - `算子性能优化 验收规范 <./op_optimization_accpetance_criteria_cn.html>`_ + - `算子性能优化 验收规范 <./op_optimization_acceptance_criteria_cn.html>`_ ", "`Github 飞桨训练框架仓库 `_" @@ -98,5 +98,5 @@ :hidden: op_optimization_method_introduction_cn.md - op_optimization_accpetance_criteria_cn.md + op_optimization_acceptance_criteria_cn.md kernel_primitive_api/index_cn.rst diff --git a/docs/dev_guides/style_guide_and_references/error_message_writing_specification_cn.md b/docs/dev_guides/style_guide_and_references/error_message_writing_specification_cn.md index ba0ca92ce2a..3f4935b2dd1 100644 --- a/docs/dev_guides/style_guide_and_references/error_message_writing_specification_cn.md +++ b/docs/dev_guides/style_guide_and_references/error_message_writing_specification_cn.md @@ -266,7 +266,7 @@ PADDLE_ENFORCE_EQ( ```c++ PADDLE_ENFORCE( - tmp == *data_type || *data_type == dafault_data_type, + tmp == *data_type || *data_type == default_data_type, phi::errors::InvalidArgument( "The DataType of %s Op's duplicable Variable %s must be " "consistent. The current variable type is (%s), but the " diff --git a/docs/dev_guides/style_guide_and_references/type_annotations_specification_cn.md b/docs/dev_guides/style_guide_and_references/type_annotations_specification_cn.md index 6bf88ef1e2f..ed07d7c3da1 100644 --- a/docs/dev_guides/style_guide_and_references/type_annotations_specification_cn.md +++ b/docs/dev_guides/style_guide_and_references/type_annotations_specification_cn.md @@ -256,7 +256,7 @@ def filter_user(user: list[User], type: UserType) -> list[User]: ... ### 参数应尽可能使用抽象类型,返回值应尽可能使用具体类型 -对于函数输入参数,如果允许,我们应该尽可能使用 [Protocal](https://docs.python.org/3/library/typing.html#typing.Protocol),如 [Sequence](https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence)、[Mapping](https://docs.python.org/3/library/collections.abc.html#collections.abc.Mapping) 、[Iterable](https://docs.python.org/3/library/collections.abc.html#collections.abc.Iterable) 等抽象类型,以提高函数的通用性。而对于函数返回值,我们应该尽可能使用具体类型,以确保下游使用时能得到更好的提示效果。 +对于函数输入参数,如果允许,我们应该尽可能使用 [Protocol](https://docs.python.org/3/library/typing.html#typing.Protocol),如 [Sequence](https://docs.python.org/3/library/collections.abc.html#collections.abc.Sequence)、[Mapping](https://docs.python.org/3/library/collections.abc.html#collections.abc.Mapping) 、[Iterable](https://docs.python.org/3/library/collections.abc.html#collections.abc.Iterable) 等抽象类型,以提高函数的通用性。而对于函数返回值,我们应该尽可能使用具体类型,以确保下游使用时能得到更好的提示效果。 比如相比于如下写法: diff --git a/docs/dev_guides/sugon/complie_and_test_cn.md b/docs/dev_guides/sugon/compile_and_test_cn.md similarity index 100% rename from docs/dev_guides/sugon/complie_and_test_cn.md rename to docs/dev_guides/sugon/compile_and_test_cn.md diff --git a/docs/dev_guides/sugon/index_cn.rst b/docs/dev_guides/sugon/index_cn.rst index 84d57649217..4dc16f73b41 100644 --- a/docs/dev_guides/sugon/index_cn.rst +++ b/docs/dev_guides/sugon/index_cn.rst @@ -4,7 +4,7 @@ 以下将说明 Paddle 适配曙光相关的开发指南: -- `曙光智算平台-Paddle 源码编译和单测执行 <./complie_and_test_cn.html>`_ : 如何曙光曙光智算平台编译 Paddle 源码编译并执行单测。 +- `曙光智算平台-Paddle 源码编译和单测执行 <./compile_and_test_cn.html>`_ : 如何曙光曙光智算平台编译 Paddle 源码编译并执行单测。 - `Paddle 适配 C86 加速卡详解 <./paddle_c86_cn.html>`_ : 详解 Paddle 适配 C86 加速卡。 - `Paddle 框架下 ROCm(HIP)算子单测修复指导 <./paddle_c86_fix_guides_cn.html>`_ : 指导 Paddle 框架下 ROCm(HIP)算子单测修复。 @@ -12,6 +12,6 @@ .. toctree:: :hidden: - complie_and_test_cn.md + compile_and_test_cn.md paddle_c86_cn.md paddle_c86_fix_guides_cn.md diff --git a/docs/dev_guides/sugon/paddle_c86_cn.md b/docs/dev_guides/sugon/paddle_c86_cn.md index cc93ac6d665..fa35c4b36d1 100644 --- a/docs/dev_guides/sugon/paddle_c86_cn.md +++ b/docs/dev_guides/sugon/paddle_c86_cn.md @@ -13,7 +13,7 @@ ROCm 软件栈整体架构如下,其中除了支持 C86 加速卡 的 Driver/F - HIPCC:HIP Kernel 编译器,类同于 NVCC 编译器,支持将 CUDA Kernel 或者 HIP Kernel 编译为 ROCm 上的可执行程序 - 加速库、数学库及通讯库:包括 MIOpen,rocBLAS,RCCL 等,分别对标 CUDA 的 cuDNN,cuBLAS, NCCL 等 ([对照表](https://github.com/ROCm-Developer-Tools/HIP/blob/master/docs/markdown/hip_porting_guide.md#library-equivalents)) -ROCm 软件栈本身具备较高的成熟度与完备性,用户根据 ROCm 提供的 CUDA 到 HIP 的[代码移植手册](https://rocmdocs.amd.com/en/latest/Programming_Guides/HIP-porting-guide.html) ,可以较为方便的将 CUDA 上的工作移植到 HIP 上,使得用户程序可以支持跨 ROCm 与 CUDA 的异构计算。 +ROCm 软件栈本身具备较高的成熟度与完备性,用户根据 ROCm 提供的 CUDA 到 HIP 的[代码移植手册](https://rocm.docs.amd.com/projects/HIP/en/docs-5.7.1/user_guide/hip_porting_guide.html) ,可以较为方便的将 CUDA 上的工作移植到 HIP 上,使得用户程序可以支持跨 ROCm 与 CUDA 的异构计算。 ![图片](../images/sugon_rocm.png) @@ -30,16 +30,16 @@ ROCm 软件栈本身具备较高的成熟度与完备性,用户根据 ROCm 提 - [operators.cmake](https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/operators.cmake#L98) 配置 HIP Kernel 算子注册方式,自动映射 CUDA Kernel 算子文件为 HIP Kernel 算子文件 - 其他相关 cmake 配置,包括依赖的第三方库如 [eigen.cmake](https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/external/eigen.cmake) 和 [warpctc.cmake](https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/external/warpctc.cmake)等 2. 设备接入:主要包括设备相关的 Driver/Runtime API 的接入,以及通讯库等底层加速库的接入工作 - - 动态库加载: 在 [paddle/fluid/platform/dynload](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/platform/dynload) 目录下动态加载 ROCm 加速库及所需 API,如 [hiprand.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/platform/dynload/hiprand.h) [miopen.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/platform/dynload/miopen.h) [rocblas.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/platform/dynload/rocblas.h)等 - - Driver/Runtime 适配:主要在 [paddle/fluid/platform/device/gpu](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/platform/device/gpu) 目录下对 HIP 和 CUDA 进行了相关 API 的封装,其中在 [gpu_types.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/platform/device/gpu/gpu_types.h) 少量封装了部分与 CUDA 差异较小的数据类型定义,部分 ROCm 独有代码位于[paddle/fluid/platform/device/gpu/rocm](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/platform/device/gpu/rocm)目录 - - Memory 管理:利用上一步封装好的 Driver/Runtime API 对 [memcpy.cc](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/memory/memcpy.cc#L574) 与 [paddle/fluid/memory/allocation](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/memory/allocation) 目录下的多种 Memory Allocator 进行实现 - - Device Context 管理:利用封装好的 API 实现对设备上下文的管理及设备池的初始化,位于 [device_contxt.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/platform/device_context.h) + - 动态库加载: 在 [paddle/phi/backends/dynload](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/backends/dynload) 目录下动态加载 ROCm 加速库及所需 API,如 [hiprand.h](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/backends/dynload/hiprand.h) [miopen.h](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/backends/dynload/miopen.h) [rocblas.h](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/backends/dynload/rocblas.h)等 + - Driver/Runtime 适配:主要在 [paddle/fluid/platform/device/gpu](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/platform/device/gpu) 目录下对 HIP 和 CUDA 进行了相关 API 的封装,其中在 [gpu_types.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/platform/device/gpu/gpu_types.h) 少量封装了部分与 CUDA 差异较小的数据类型定义,部分 ROCm 独有代码位于[paddle/phi/core/platform/device/gpu/rocm](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/core/platform/device/gpu/rocm)目录 + - Memory 管理:利用上一步封装好的 Driver/Runtime API 对 [memcpy.cc](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/memory/memcpy.cc#L574) 与 [paddle/phi/core/memory/allocation](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/phi/core/memory/allocation) 目录下的多种 Memory Allocator 进行实现 + - Device Context 管理:利用封装好的 API 实现对设备上下文的管理及设备池的初始化,位于 [device_context.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/core/platform/device_context.h) - 其他设备管理相关的适配接入,如 Profiler, Tracer, Error Message, NCCL 等,代码主要位于 [Paddle/platform](https://github.com/PaddlePaddle/Paddle/tree/develop/paddle/fluid/platform) 目录下 3. 算子注册:主要包括 HIP Kernel 的算子注册,以及 MIOpen 的算子在 ROCm 平台上的注册 - - 数据类型支持:除通用数据类型外,还需适配 Paddle 支持的特殊数据类型包括 [float16.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/platform/float16.h#L144) [complex.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/platform/complex.h#L88) [bfloat16.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/platform/bfloat16.h#L65) 等 + - 数据类型支持:除通用数据类型外,还需适配 Paddle 支持的特殊数据类型包括 [float16.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/common/float16.h#L144) [complex.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/common/complex.h#L88) [bfloat16.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/common/bfloat16.h#L65) 等 - 数学库支持:通过 ROCm 的 rocBLAS 库,实现 Paddle 在 [blas.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/kernels/funcs/blas/blas.h) 中定义的 BLAS 函数,代码位于 [blas_impl.hip.h](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/kernels/funcs/blas/blas_impl.hip.h) - Kernel 算子注册:根据 [operators.cmake](https://github.com/PaddlePaddle/Paddle/blob/develop/cmake/operators.cmake#L98) 的修改,可以大部分复用 Paddle 框架下的 CUDA 已有算子 Kernel 文件,存在部分 Kernel 实现在 CUDA 与 ROCm 平台下有所区别,例如线程数、WarpSize 以及 thurst 库等;此类区别需要针对具体的算子实现进行相应的调整,通过 Paddle 自身的算子单测用例以及模型验证测试可以对此类问题进行定位并修复 - - MIOpen 算子注册:MIOpen 与 cuDNN 的接口与类型设计较为类似,但在实际执行中还是存在一定区别,因为对于此类算子需根据 MIOpen API 进行适配,甚至对于差异较大的算子例如 [rnn_op.cu.cc](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/operators/rnn_op.cu.cc#L506) 需要进行 weight 数据重排 + - MIOpen 算子注册:MIOpen 与 cuDNN 的接口与类型设计较为类似,但在实际执行中还是存在一定区别,因为对于此类算子需根据 MIOpen API 进行适配,甚至对于差异较大的算子例如 [rnn_op.cu.cc](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/inference/tensorrt/convert/rnn_op.cc) 需要进行 weight 数据重排 4. Python API 兼容适配:当前 Paddle ROCm 兼容所有 Paddle CUDA 相关的 Python API,这意味着对于所有目前 Paddle 可以支持 CUDA 的模型,无需修改任意代码可以直接运行在 C86 加速卡 上 经过以上几个步骤的适配工作,用户可以无需修改任意代码就将之前在 Paddle CUDA 平台上的程序运行在 C86 加速卡 的环境下,在保持用户已有的基于 Paddle CUDA 的编程习惯的同时,也减少了 Paddle 已有的模型套件在 CUDA 平台与 ROCm 平台之间的迁移工作。 diff --git a/docs/eval/evaluation_of_docs_system.md b/docs/eval/evaluation_of_docs_system.md index 3ca309cdd61..04a5c0426d6 100644 --- a/docs/eval/evaluation_of_docs_system.md +++ b/docs/eval/evaluation_of_docs_system.md @@ -261,13 +261,13 @@ TensorFlow 的文档规划,比较直接地匹配了本文所介绍的分类标 - Single-Machine Model Parallel Best Practices - Getting Started with Distributed Data Parallel - Writing Distributed Applications with PyTorch - - Getting Started with Fully Sharded Data Prallel + - Getting Started with Fully Sharded Data Parallel - Customize Process Group Backends Using Cpp Extension - Getting Started with Distributed RPC Framework - Implementing a Parameter Server Using Distributed RPC Framework - Distributed Pipeline Parallelsim using RPC - Implementing Batch RPC Processing Using Asynchronous Executions - - Combining Distributed DataPrallel with Distributed RPC Framework + - Combining Distributed DataParallel with Distributed RPC Framework - Training Transformer models using Pipeline Parallelism - Training Transformer models using Distributed Data Parallel and Pipeline Parallelism - Distributed Training with Uneven Inputs Using the Join Context Manager @@ -562,7 +562,7 @@ MindSpore 的有自己独立的文档分类标准和风格,所以硬套本文 | 移动端相关 | 独立的栏目 https://www.tensorflow.org/lite | 10+ | Image Segmentation DeepLabV3 on iOS Image Segmentation DeepLabV3 on Android | 2 | | 0 | Paddle Lite 中独立存在 | 未统计 | | 框架之间的迁移相关 | | | | 0 | 概述 准备工作 网络脚本分析 网络脚本开发 网络调试 精度调试 性能调试 推理执行 网络迁移调试实例 常见问题 | 10 | Paddle 1.8 与 Paddle 2.0 API 映射表 PyTorch-PaddlePaddle API 映射表 版本迁移工具 | 3 | | 自定义算子 | Tensors and operations Custom layers Custom training: walkthrough Create an op Extension types | 5 | Double Backward with Custom Functions Fusing Convolution and Batch Norm using Custom Function Custom C++ and CUDA Extensions Extending TorchScript with Custom C++ Operators Extending TorchScript with Custom C++ Classes Registering a Dispatched Operator in C++ Extending dispatcher for a new backend in C++ | 7 | 算子分类 运算重载 自定义算子(CPU) 自定义算子(GPU) 自定义算子(Ascend) 自定义算子(基于 Custom 表达) | 6 | 自定义原生算子 原生算子开发注意事项 自定义外部算子 自定义 Python 算子 API 介绍 API 示例 本地开发指南 提交 PR 注意事项 FAQ | 9 | -| 分布式训练 | Distributed training with Kereas Distributed training with DTensors Using DTensors with Keras Custom training loops Multi-worker training with Keras Multi-worker training with CTL Parameter Server Training Distributed input Distributed training | 9 | PyTorch Distributed Overview Single-Machine Model Parallel Best PracticesGetting Started with Distributed Data Parallel Writing Distributed Applications with PyTorch Getting Started with Fully Sharded Data Prallel Customize Process Group Backends Using Cpp Extension Getting Started with Distributed RPC Framework Implementing a Parameter Server Using Distributed RPC Framework Distributed Pipeline Parallelsim using RPC Implementing Batch RPC Processing Using Asynchronous Executions Combining Distributed DataPrallel with Distributed RPC Framework Training Transformer models using Pipeline Parallelism Training Transformer models using Distributed Data Parallel and Pipeline Parallelism Distributed Training with Uneven Inputs Using the Join Context Manager | 16 | 分布式并行总览 分布式集合通信原语 分布式并行训练基础样例(Ascend) 分布式并行训练基础样例(GPU) 分布式推理 保存和加载模型(HyBrid Parallel 模式) 分布式并行训练 Transformer 模型 鹏程·盘古模型网络多维度混合并行解析 分布式故障恢复 | 9 | 单机多卡训练 分布式训练开始 使用 FleetAPI 进行分布式训练 | 3 | +| 分布式训练 | Distributed training with Kereas Distributed training with DTensors Using DTensors with Keras Custom training loops Multi-worker training with Keras Multi-worker training with CTL Parameter Server Training Distributed input Distributed training | 9 | PyTorch Distributed Overview Single-Machine Model Parallel Best PracticesGetting Started with Distributed Data Parallel Writing Distributed Applications with PyTorch Getting Started with Fully Sharded Data Parallel Customize Process Group Backends Using Cpp Extension Getting Started with Distributed RPC Framework Implementing a Parameter Server Using Distributed RPC Framework Distributed Pipeline Parallelsim using RPC Implementing Batch RPC Processing Using Asynchronous Executions Combining Distributed DataParallel with Distributed RPC Framework Training Transformer models using Pipeline Parallelism Training Transformer models using Distributed Data Parallel and Pipeline Parallelism Distributed Training with Uneven Inputs Using the Join Context Manager | 16 | 分布式并行总览 分布式集合通信原语 分布式并行训练基础样例(Ascend) 分布式并行训练基础样例(GPU) 分布式推理 保存和加载模型(HyBrid Parallel 模式) 分布式并行训练 Transformer 模型 鹏程·盘古模型网络多维度混合并行解析 分布式故障恢复 | 9 | 单机多卡训练 分布式训练开始 使用 FleetAPI 进行分布式训练 | 3 | | 框架设计文档 | Random number generation | 1 | 分散在 API 文档、源码中,其实比较丰富。30+ | 30+ | 设计白皮书 全场景统一 函数式微分编程 动静态图结合 异构并行训练 分布式并行 中间表达 MindIR 高性能数据处理引擎 图算融合加速引擎 二阶优化 可视化调试调优 安全可信 术语 | 13 | | 0 | | 其它 | Integrated gradients Uncertainty quantification with SNGP Probabilistic regression Keras 一级标题下的 13 篇文章 Thinking in TensorFlow 2 Data input pipelines 一级标题下的 3 篇 GPU TPU | 20 | Learn the Basics Quickstart Deep Learning with PyTorch: A 60 Minute Blitz Building a Convolution/Batch Norm fuser in FX Building a Simple CPU Performance Profiler with FX Channels Last Memory Format in PyTorch Forward-mode Automatic Differentiation Using the PyTorch C++ Frontend Dynamic Parallelism in TorchScript Autograd in C++ Frontend Static Quantization with Eager Model in PyTorch | 11 | 基本介绍 快速入门 进阶案例:线性拟合 混合精度 梯度累积算法 自适应梯度求和算法 降维训练算法 | 7 | 10 分钟快速上手飞桨 使用线性回归预测波士顿房价 模型导出 ONNX 协议 飞桨产品硬件支持表 昆仑芯 XPU 芯片运行飞桨 海光 DCU 芯片运行飞桨 昇腾 NPU 芯片运行飞桨 环境变量 FLAGS 下 9 篇 hello paddle:从普通程序走向机器学习程序 通过 AutoEncoder 实现时序数据异常检测 广播介绍 自动混合精度训练 梯度裁剪 升级指南 | 20+ | @@ -779,7 +779,7 @@ Paddle 当前文档中的 Tutorial,特别是初级内容部分,都很好的 - 模型保存 - 推理 -这里面包含了很多“干货”的内容,但是我觉得放在“升级指南”中有“明珠暗投”的风险。因为一般人对“升级指南”的刻板印象,应该类似是“relase log”级别的东西,可能会不会优先点开。 +这里面包含了很多“干货”的内容,但是我觉得放在“升级指南”中有“明珠暗投”的风险。因为一般人对“升级指南”的刻板印象,应该类似是“release log”级别的东西,可能会不会优先点开。 据我体验,升级指南中的 [使用高层 API](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/update_cn.html#id4) 和 [使用基础 API](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/01_paddle2.0_introduction/update_cn.html#id5) 包含了其它地方没有的内容,这些内容被用户错过的话,是可惜的。 diff --git a/docs/faq/2.0.md b/docs/faq/2.0.md index d9a3043feaf..628aa60b57d 100644 --- a/docs/faq/2.0.md +++ b/docs/faq/2.0.md @@ -35,7 +35,7 @@ 1. 删除依赖这些库的 API,原来 Paddle 基于这些第三方库提供了一些 API,在删除这些依赖库的同时也删除了这些 API,如:移除 matplotlib 的同时,paddle.utils.plot 也被删除了。 -2. 删除依赖第三方库的数据集,如:移除 nltk 的同时,依赖 nltk 的数据集 sentiment(nltk.movie_reivew)也被删除了。 +2. 删除依赖第三方库的数据集,如:移除 nltk 的同时,依赖 nltk 的数据集 sentiment(nltk.movie_review)也被删除了。 3. 删除依赖的第三方库后,如果需要使用这些库,需要重新安装`pip install objgraph`,直接 import objgraph 可能会报错。 diff --git a/docs/guides/06_distributed_training/model_parallel_cn.rst b/docs/guides/06_distributed_training/model_parallel_cn.rst index 985b0f4aa93..01b60faddd1 100644 --- a/docs/guides/06_distributed_training/model_parallel_cn.rst +++ b/docs/guides/06_distributed_training/model_parallel_cn.rst @@ -29,7 +29,7 @@ 对于 Embedding 操作,可以将其理解为一种查找表操作。即,将输入看做索引,将 Embedding 参数看做查找表,根据该索引查表得到相应的输出,如下图(a)所示。当采用模型并行时,Embedding 的参数被均匀切分到多个卡上。假设 Embedding 参数的维度为 N*D,并采用 K 张卡执行模型并行,那么模型并行模式下每张卡上的 Embedding 参数的维度为 N//K*D。当参数的维度 N 不能被卡数 K 整除时,最后一张卡的参数维度值为(N//K+N%K)*D。以下图(b)为例,Embedding 参数的维度为 8*D,采用 2 张卡执行模型并行,那么每张卡上 Embedding 参数的维度为 4*D。 -为了便于说明,以下我们均假设 Embedding 的参数维度值 D 可以被模型并行的卡数 D 整除。此时,每张卡上 Embedding 参数的索引值为[0, N/K),逻辑索引值为[k*N/K, (k+1)*N/K),其中 k 表示卡序号,0<=k +

图 1 不同维度的 Tensor 可视化表示
需要注意的是,Tensor 必须形如矩形,即在任何一个维度上,元素的数量必须相等,否则会抛出异常,示例如下: @@ -270,7 +270,7 @@ ndim_4_Tensor = paddle.ones([2, 3, 4, 5]) ``` -
+

图 2 Tensor 的 shape、axis、dimension、ndim 之间的关系
```python @@ -649,7 +649,7 @@ print(z.shape) ``` -
+

图 3 Tensor 广播示例
## 六、Tensor 与 Numpy 数组相互转换 diff --git a/docs/guides/beginner/tensor_en.md b/docs/guides/beginner/tensor_en.md index f894a55a191..e9c1a09e14f 100644 --- a/docs/guides/beginner/tensor_en.md +++ b/docs/guides/beginner/tensor_en.md @@ -68,7 +68,7 @@ Tensor(shape=[2, 2, 5], dtype=int64, place=Place(gpu:0), stop_gradient=True, ``` The visual representation of the **Tensor* above is: -
+

Figure1. Visual representation of Tensor with different dimensions
**Tensor** must be "rectangular" -- that is, along each dimension, the number of elements must be equal. For example: @@ -127,7 +127,7 @@ Create a 4-D **Tensor**, and visualize it to represents the relationship between ndim_4_tensor = paddle.ones([2, 3, 4, 5]) ``` -
+

Figure2. The relationship between Tensor shape, axis, dimension and ndim
```python diff --git a/docs/guides/flags/memory_en.rst b/docs/guides/flags/memory_en.rst index 74ad5a3910c..8c348eec57d 100644 --- a/docs/guides/flags/memory_en.rst +++ b/docs/guides/flags/memory_en.rst @@ -205,7 +205,7 @@ FLAGS_initial_gpu_memory_in_mb=4096 will allocate 4 GB as initial GPU chunk. Note ------- If you set this flag, the memory size set by FLAGS_fraction_of_gpu_memory_to_use will be overrided by this flag, PaddlePaddle will allocate the initial gpu memory with size specified by this flag. -If you don't set this flag, the dafault value 0 will disable this GPU memory strategy. PaddlePaddle will use FLAGS_fraction_of_gpu_memory_to_use to allocate the initial GPU chunk. +If you don't set this flag, the default value 0 will disable this GPU memory strategy. PaddlePaddle will use FLAGS_fraction_of_gpu_memory_to_use to allocate the initial GPU chunk. @@ -246,7 +246,7 @@ FLAGS_reallocate_gpu_memory_in_mb=1024 will re-allocate 1 GB if run out of GPU m Note ------- If this flag is set, the memory size set by FLAGS_fraction_of_gpu_memory_to_use will be overrided by this flag, PaddlePaddle will re-allocate the gpu memory with size specified by this flag. -If you don't set this flag, the dafault value 0 will disable this GPU memory strategy. PaddlePaddle will use FLAGS_fraction_of_gpu_memory_to_use to re-allocate GPU memory. +If you don't set this flag, the default value 0 will disable this GPU memory strategy. PaddlePaddle will use FLAGS_fraction_of_gpu_memory_to_use to re-allocate GPU memory. FLAGS_use_pinned_memory diff --git a/docs/guides/jit/debugging_en.md b/docs/guides/jit/debugging_en.md index ad75e68af94..55183b54219 100644 --- a/docs/guides/jit/debugging_en.md +++ b/docs/guides/jit/debugging_en.md @@ -58,7 +58,7 @@ The C++ error stack is hidden by default. You can set the C++ environment variab ## 2、Debugging Method Before debugging, **please ensure that the dynamic graph code before conversion can run successfully**. The following introduces several debugging methods recommended in Dynamic-to-Static. ### 2.1 Pdb Debugging -pdb is a module in Python that defines an interactive Pyhton source code debugger. It supports setting breakpoints and single stepping between source lines, listing source code and variables, running Python code, etc. +pdb is a module in Python that defines an interactive Python source code debugger. It supports setting breakpoints and single stepping between source lines, listing source code and variables, running Python code, etc. #### 2.1.1 Debugging steps - step1: Insert `import pdb; pdb.set_trace()` before the code where you want to enable pdb debugging. diff --git a/docs/guides/jit/limitations_cn.md b/docs/guides/jit/limitations_cn.md index 1063731868f..d25b02ae18d 100644 --- a/docs/guides/jit/limitations_cn.md +++ b/docs/guides/jit/limitations_cn.md @@ -351,7 +351,7 @@ TypeError: In transformed code: out.append(i) return out -TypeError: All values in `initialized_list` should be Variable, but recevied . +TypeError: All values in `initialized_list` should be Variable, but received . ``` **修改建议**:推荐将 [1,2] 和 [2,3] 转为 tensor,变为单层 list。如下面写法: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.autograd.function.FunctionCtx.mark_non_differentiable.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.autograd.function.FunctionCtx.mark_non_differentiable.md deleted file mode 100644 index 4b534c6392b..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.autograd.function.FunctionCtx.mark_non_differentiable.md +++ /dev/null @@ -1,18 +0,0 @@ -## [ 仅参数名不一致 ]torch.autograd.function.FunctionCtx.mark_non_differentiable -### [torch.autograd.function.FunctionCtx.mark_non_differentiable](https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.mark_non_differentiable.html#torch.autograd.function.FunctionCtx.mark_non_differentiable) -```python -torch.autograd.function.FunctionCtx.mark_non_differentiable(*args) -``` - -### [paddle.autograd.PyLayerContext.mark_non_differentiable](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayerContext_cn.html#mark-non-differentiable-self-tensors) -```python -paddle.autograd.PyLayerContext.mark_non_differentiable(*tensors) -``` - -两者功能一致,仅参数名不一致,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------- | ------------ | ----------------------------- | -| args | tensors | 需要标记不需要反向的 Tensor。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.Unfold.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.Unfold.md deleted file mode 100644 index 899dec470f1..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.Unfold.md +++ /dev/null @@ -1,28 +0,0 @@ -## [ 仅参数名不一致 ]torch.nn.Unfold -### [torch.nn.Unfold](https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html?highlight=nn+unfold#torch.nn.Unfold) -```python -torch.nn.Unfold(kernel_size, - dilation=1, - padding=0, - stride=1) -``` - -### [paddle.nn.Unfold](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Unfold_cn.html#unfold) -```python -paddle.nn.Unfold(kernel_sizes=[3, 3], - strides=1, - paddings=1, - dilations=1, - name=None) -``` - -其中功能一致, 仅参数名不一致,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| kernel_size | kernel_sizes | 卷积核的尺寸。 | -| dilation | dilations | 卷积膨胀。 | -| padding | paddings | 每个维度的扩展,仅参数名不一致。 | -| stride | strides | 卷积步长,仅参数名不一致。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.functional.glu.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.functional.glu.md index 48ff892695f..7af1a119417 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.functional.glu.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.functional.glu.md @@ -1,12 +1,12 @@ ## [ 仅参数名不一致 ]torch.nn.functional.glu ### [torch.nn.functional.glu](https://pytorch.org/docs/stable/generated/torch.nn.functional.glu.html?highlight=glu#torch.nn.functional.glu) ```python -torch.nn.functional.glu(input, dim=- 1) +torch.nn.functional.glu(input, dim=-1) ``` ### [paddle.nn.functional.glu](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/glu_cn.html) ```python -paddle.nn.functional.glu(x, axis=- 1, name=None) +paddle.nn.functional.glu(x, axis=-1, name=None) ``` 两者功能一致,仅参数名不一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.functional.log_sigmoid.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.functional.logsigmoid.md similarity index 100% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.functional.log_sigmoid.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/torch.nn.functional.logsigmoid.md diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/transformers.StoppingCriteriaList.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/transformers.StoppingCriteriaList.md deleted file mode 100644 index 330c2787468..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/args_name_diff/transformers.StoppingCriteriaList.md +++ /dev/null @@ -1,19 +0,0 @@ -## [ 仅参数名不一致 ]transformers.StoppingCriteriaList -### [transformers.StoppingCriteriaList](https://github.com/huggingface/transformers/blob/d625294d79341662784495551abdf45e6cb9372f/src/transformers/generation/stopping_criteria.py#L503) -```python -transformers.StoppingCriteriaList(input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -``` - -### [paddlenlp.generation.StoppingCriteriaList](https://github.com/PaddlePaddle/PaddleNLP/blob/e336e78c338d2514ee6c937982ce5d8c960b85ff/paddlenlp/generation/stopping_criteria.py#L72) -```python -paddlenlp.generation.StoppingCriteriaList(input_ids: paddle.Tensor, scores: paddle.Tensor, **kwargs) -``` - -两者功能一致,仅参数名不一致,具体如下: - -### 参数映射 - -| transformers | PaddlePaddle | 备注 | -| ----------------- | ----------------- | --------------------------------------- | -| input_ids | input_ids | 输入(tokens) 的 id 组成的 Tensor。 | -| scores | scores | 得分组成的 Tensor,仅参数名不一致。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/composite_implement/torch.is_pinned.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/composite_implement/torch.Tensor.is_pinned.md similarity index 100% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/composite_implement/torch.is_pinned.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/composite_implement/torch.Tensor.is_pinned.md diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomAffine.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomAffine.md deleted file mode 100644 index ae88388597e..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomAffine.md +++ /dev/null @@ -1,55 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.RandomAffine -### [torchvision.transforms.RandomAffine](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomAffine.html) -```python -torchvision.transforms.RandomAffine( - degrees: Union[List[float], Tuple[float, ...], float], - translate: Optional[Tuple[float, float]] = None, - scale: Optional[Tuple[float, float]] = None, - shear: Union[List[float], Tuple[float, ...], float] = None, - interpolation: InterpolationMode = InterpolationMode.NEAREST, - fill: Union[int, float, List[float], Tuple[float, ...]] = 0, - center: Optional[Union[List[int], Tuple[int, ...]]] = None -) -``` - -### [paddle.vision.transforms.RandomAffine](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomAffine_cn.html) -```python -paddle.vision.transforms.RandomAffine( - degrees: Union[Tuple[float, float], float, int], - translate: Optional[Union[Sequence[float], float, int]] = None, - scale: Optional[Tuple[float, float]] = None, - shear: Optional[Union[Sequence[float], float, int]] = None, - interpolation: Union[str, int] = 'nearest', - fill: Union[int, List[int], Tuple[int, ...]] = 0, - center: Optional[Tuple[int, int]] = None, - keys: Optional[Union[List[str], Tuple[str, ...]]] = None -) -``` - -两者功能一致但参数类型不一致,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------------ | ---------------- | ------------------------ | -| degrees | degrees | 随机旋转变换的角度大小。 | -| translate | translate | 随机水平平移和垂直平移变化的位移大小。 | -| scale | scale | 随机伸缩变换的比例大小。 | -| shear | shear | 随机剪切角度的大小范围。 | -| interpolation | interpolation | 插值的方法,PyTorch 参数为 InterpolationMode 枚举类, Paddle 参数为 int 或 string,需要转写。 | -| fill | fill | 对图像扩展时填充的像素值。 | -| center | center | 仿射变换的中心点坐标。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | - - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -transform = torchvision.transforms.RandomAffine(degrees=30, translate=(0.1, 0.2), scale=(0.8, 1.2), shear=10, interpolation=torchvision.transforms.InterpolationMode.BILINEAR, fill=0, center=(100, 100)) -transformed_img = transform(img) - -# Paddle 写法 -transform = paddle.vision.transforms.RandomAffine(degrees=30, translate=(0.1, 0.2), scale=(0.8, 1.2), shear=10, interpolation='bilinear', fill=0, center=(100, 100)) -transformed_img = transform(img) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomRotation.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomRotation.md deleted file mode 100644 index 2e0e568f556..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.RandomRotation.md +++ /dev/null @@ -1,48 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.RandomRotation -### [torchvision.transforms.RandomRotation](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomRotation.html) -```python -torchvision.transforms.RandomRotation( - degrees: Union[int, List[float], Tuple[float, ...]], - interpolation: InterpolationMode = InterpolationMode.NEAREST, - expand: bool = False, - center: Optional[Union[List[float], Tuple[float, ...]]] = None, - fill: Union[int, float, Tuple[int, ...]] = 0 -) -``` - -### [paddle.vision.transforms.RandomRotation](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomRotation_cn.html) -```python -paddle.vision.transforms.RandomRotation( - degrees: Union[int, List[float], Tuple[float, ...]], - interpolation: Union[str, int] = 'nearest', - expand: bool = False, - center: Optional[Tuple[int, int]] = None, - fill: int = 0, - keys: Optional[Union[List[str], Tuple[str, ...]]] = None -) -``` - -两者功能一致,但输入参数类型不一致。 - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------------- | ------------------ | ----------------------------------------------- | -| degrees | degrees | 旋转角度范围。 | -| interpolation | interpolation | 插值的方法,两者类型不一致,PyTorch 为 InterpolationMode 枚举类, Paddle 为 int 或 string,需要转写。 | -| expand | expand | 是否扩展图像尺寸。 | -| center | center | 旋转的中心点坐标。 | -| fill | fill | 对图像扩展时填充的值。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -transform = torchvision.transforms.RandomRotation(degrees=45, interpolation=torchvision.transforms.InterpolationMode.BILINEAR, expand=True, center=(100, 100), fill=(255, 0, 0)) -rotated_img = transform(img) - -# Paddle 写法 -transform = paddle.vision.transforms.RandomRotation(degrees=45, interpolation='bilinear', expand=True, center=(100, 100), fill=(255, 0, 0)) -rotated_img = transform(img) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.affine.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.affine.md deleted file mode 100644 index 54764e9ab5a..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.affine.md +++ /dev/null @@ -1,51 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.functional.affine -### [torchvision.transforms.functional.affine](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.affine.html) -```python -torchvision.transforms.functional.affine(img: Tensor, - angle: float, - translate: List[int], - scale: float, - shear: List[float], - interpolation: InterpolationMode = InterpolationMode.NEAREST, - fill: Optional[List[float]] = None, - center: Optional[List[int]] = None) -``` - -### [paddle.vision.transforms.affine](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/affine_cn.html) -```python -paddle.vision.transforms.affine( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], - angle: Union[float, int], - translate: List[float], - scale: float, - shear: Union[List[float], Tuple[float, ...]], - interpolation: Union[str, int] = 'nearest', - fill: Union[int, List[int], Tuple[int, ...]] = 0, - center: Optional[Tuple[int, int]] = None -) -``` - -两者功能一致,但输入参数类型不一致,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ----------- | ------------ | ------------------------------------------------------------ | -| img | img | 输入图片。 | -| angle | angle | 旋转角度。 | -| translate | translate | 随机水平平移和垂直平移变化的位移大小。 | -| scale | scale | 控制缩放比例。 | -| shear | shear | 剪切角度值。 | -| interpolation | interpolation | 插值的方法,两者类型不一致,PyTorch 为 InterpolationMode 枚举类, Paddle 为 int 或 string,需要转写。 | -| fill | fill | 对图像扩展时填充的像素值。 | -| center | center | 仿射变换的中心点坐标 。 | - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -rotated_img = torchvision.transforms.functional.affine(img, angle=30.0, translate=[10, 20], scale=1.2, shear=[10.0, 5.0], interpolation=torchvision.transforms.InterpolationMode.BILINEAR, fill=[0, 0, 0], center=[100, 100]) - -# Paddle 写法 -rotated_img = paddle.vision.transforms.affine(img=img, angle=30.0, translate=[10, 20], scale=1.2, shear=[10.0, 5.0], interpolation='bilinear', fill=[0, 0, 0], center=[100, 100]) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.perspective.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.perspective.md deleted file mode 100644 index 086695af1b1..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.perspective.md +++ /dev/null @@ -1,45 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.functional.perspective -### [torchvision.transforms.functional.perspective](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.perspective.html#perspective) -```python -torchvision.transforms.functional.perspective( - img: Tensor, - startpoints: List[List[int]], - endpoints: List[List[int]], - interpolation: InterpolationMode = InterpolationMode.BILINEAR, - fill: Optional[List[float]] = None -) -``` - -### [paddle.vision.transforms.perspective](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/vision/transforms/perspective_cn.html#cn-api-paddle-vision-transforms-perspective) -```python -paddle.vision.transforms.perspective( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], - startpoints: List[List[float]], - endpoints: List[List[float]], - interpolation: Union[str, int] = 'nearest', - fill: Union[int, List[int], Tuple[int, ...]] = 0 -) -``` - -两者功能一致,但参数类型不一致。 - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ----------------- | ----------------- | ------------ | -| img | img | 输入图片。 | -| startpoints | startpoints | 在原图上的四个角(左上、右上、右下、左下)的坐标。 | -| endpoints | endpoints | 在原图上的四个角(左上、右上、右下、左下)的坐标。 | -| interpolation | interpolation | 插值的方法,两者类型不一致,PyTorch 为 InterpolationMode 枚举类, Paddle 为 int 或 string,需要转写。 | -| fill | fill | 对图像扩展时填充的像素值。 | - - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -processed_img = torchvision.transforms.functional.perspective(img, startpoints, endpoints, interpolation=torchvision.transforms.InterpolationMode.BILINEAR, fill=[0, 0, 0]) - -# Paddle 写法 -processed_img = paddle.vision.transforms.perspective(img=img, startpoints=startpoints, endpoints=endpoints, interpolation='bilinear', fill=[0, 0, 0]) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transform.functional.resize.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.resize.md similarity index 100% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transform.functional.resize.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.resize.md diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.rotate.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.rotate.md deleted file mode 100644 index 63af0e66d10..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torchvision.transforms.functional.rotate.md +++ /dev/null @@ -1,34 +0,0 @@ -## [ 输入参数类型不一致 ]torchvision.transforms.functional.rotate -### [torchvision.transforms.functional.rotate](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.rotate.html) -```python -torchvision.transforms.functional.rotate(img: Tensor, angle: float, interpolation: InterpolationMode = InterpolationMode.NEAREST, expand: bool = False, center: Optional[List[int]] = None, fill: Optional[List[float]] = None) -``` - -### [paddle.vision.transforms.rotate](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/vision/transforms/rotate_cn.html#cn-api-paddle-vision-transforms-rotate) -```python -paddle.vision.transforms.rotate(img, angle, interpolation='nearest', expand=False, center=None, fill=0) -``` - -两者功能一致,但输入参数类型不一致。 - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------------------------------- | ------------------ | -------- | -| img | img | 输入图片。| -| angle | angle | 旋转角度。| -| interpolation | interpolation | 插值的方法,两者类型不一致,PyTorch 为 InterpolationMode 枚举类, Paddle 为 int 或 string,需要转写。 | -| expand | expand | 是否要对旋转后的图片进行大小扩展。| -| center | center | 旋转中心。| -| fill | fill | 旋转图像外部区域的 RGB 像素填充值。| - - -### 转写示例 -#### interpolation:插值的方法 -```python -# PyTorch 写法 -torchvision.transforms.functional.rotate(img, angle=90, interpolation=torchvision.transforms.InterpolationMode.BILINEAR) - -# Paddle 写法 -paddle.vision.transforms.rotate(img=img, angle=90, interpolation='bilinear') -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.cuda.Stream__upper.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.cuda.Stream.md similarity index 100% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.cuda.Stream__upper.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.cuda.Stream.md diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool1d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool1d.md index 91ff5eea643..6a31ddbba6f 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool1d.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool1d.md @@ -30,5 +30,5 @@ paddle.nn.functional.avg_pool1d(x, kernel_size, stride=None, padding=0, exclusiv torch.nn.functional.avg_pool1d(input=input, kernel_size=2, stride=2, padding=1, ceil_mode=True, count_include_pad=False) # Paddle 写法 -paddle.nn.functional.avg_pool1d(x=input, kernel_size=2, stride=2, padding=1, ceil_mode=True, exlusive=True) +paddle.nn.functional.avg_pool1d(x=input, kernel_size=2, stride=2, padding=1, ceil_mode=True, exclusive=True) ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool2d.md index 56361937f80..ed62625405b 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool2d.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool2d.md @@ -31,5 +31,5 @@ paddle.nn.functional.avg_pool2d(x, kernel_size, stride=None, padding=0, ceil_mod torch.nn.functional.avg_pool2d(input=input, kernel_size=2, stride=2, padding=1, ceil_mode=True, count_include_pad=False) # Paddle 写法 -paddle.nn.AvgPool2D(x=input, kernel_size=2, stride=2, padding=1, ceil_mode=True, exlusive=True) +paddle.nn.AvgPool2D(x=input, kernel_size=2, stride=2, padding=1, ceil_mode=True, exclusive=True) ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool3d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool3d.md index 5acf28491a3..9e8cbbd2776 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool3d.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.nn.functional.avg_pool3d.md @@ -31,5 +31,5 @@ paddle.nn.functional.avg_pool3d(x, kernel_size, stride=None, padding=0, ceil_mod torch.nn.functional.avg_pool3d(input=input, kernel_size=2, stride=2, padding=1, ceil_mode=True, count_include_pad=False) # Paddle 写法 -paddle.nn.functional.avg_pool3d(x=input, kernel_size=2, stride=2, padding=1, ceil_mode=True, exlusive=True) +paddle.nn.functional.avg_pool3d(x=input, kernel_size=2, stride=2, padding=1, ceil_mode=True, exclusive=True) ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.rand.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.rand.md deleted file mode 100644 index f5a85a60955..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.rand.md +++ /dev/null @@ -1,83 +0,0 @@ -## [ 输入参数用法不一致 ]torch.rand -### [torch.rand](https://pytorch.org/docs/stable/generated/torch.rand.html?highlight=rand#torch.rand) -```python -torch.rand(*size, - *, - generator=None, - out=None, - dtype=None, - layout=torch.strided, - device=None, - requires_grad=False, - pin_memory=False) -``` - -### [paddle.rand](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/rand_cn.html#rand) -```python -paddle.rand(shape, - dtype=None, - name=None) -``` - -其中 torch 的 `size` 和 paddle 的 `shape` 用法不一致,torch 还支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| *size | shape | 表示输出形状大小,PyTorch 以可变参数方式传入,Paddle 以 list 或 tuple 的方式传入。 | -| generator | - | 用于采样的伪随机数生成器, Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | -| out | - | 表示输出的 Tensor,Paddle 无此参数。 | -| dtype | dtype | 表示数据类型。 | -| layout | - | 表示布局方式,Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | -| device | - | 表示 Tensor 存放位置,Paddle 无此参数,需要转写。 | -| requires_grad | - | 表示是否不阻断梯度传导,Paddle 无此参数,需要转写。 | -| pin_memory | - | 表示是否使用锁页内存, Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### *size:输出形状大小 -```python -# PyTorch 写法 -torch.rand(3, 5) - -# Paddle 写法 -paddle.rand([3, 5]) -``` - -#### out:指定输出 -```python -# PyTorch 写法 -torch.rand([3, 5], out=y) - -# Paddle 写法 -paddle.assign(paddle.rand([3, 5]), y) -``` - -#### device: Tensor 的设备 -```python -# PyTorch 写法 -torch.rand(3, 5, device=torch.device('cpu')) - -# Paddle 写法 -y = paddle.rand([3, 5]) -y.cpu() -``` - -#### requires_grad:是否需要求反向梯度,需要修改该 Tensor 的 stop_gradient 属性 -```python -# PyTorch 写法 -x = torch.rand([3, 5], requires_grad=True) - -# Paddle 写法 -x = paddle.rand([3, 5]) -x.stop_gradient = False -``` - -#### pin_memory:是否分配到固定内存上 -```python -# PyTorch 写法 -torch.rand(3, 5, pin_memory=True) - -# Paddle 写法 -paddle.rand([3, 5]).pin_memory() -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.split.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.split.md deleted file mode 100644 index a757f119d4c..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_usage_diff/torch.split.md +++ /dev/null @@ -1,38 +0,0 @@ -## [ 输入参数用法不一致 ]torch.split -### [torch.split](https://pytorch.org/docs/stable/generated/torch.split.html?highlight=torch%20split#torch.split) -```python -torch.split(tensor, - split_size_or_sections, - dim=0) -``` - -### [paddle.split](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/split_cn.html#split) -```python -paddle.split(x, - num_or_sections, - axis=0, - name=None) -``` - -其中 PyTorch 的 `split_size_or_sections` 与 Paddle 的 `num_or_sections` 用法不一致,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| tensor | x | 表示输入 Tensor ,仅参数名不一致。 | -| split_size_or_sections | num_or_sections | 当类型为 int 时,torch 表示单个块大小,paddle 表示结果有多少个块,需要转写。 | -| dim | axis | 表示需要分割的维度,仅参数名不一致。 | - - -### 转写示例 -#### split_size_or_sections:单个块大小 -```python -split_size = 2 -dim = 1 -# PyTorch 写法 -torch.split(a, split_size, dim) -# 在输入 dim 时,返回 (values, indices) - -# Paddle 写法 -paddle.split(a, a.shape[dims]/split_size, dim) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/fairscale.nn.model_parallel.initialize.get_model_parallel_rank.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/fairscale.nn.model_parallel.initialize.get_model_parallel_rank.md deleted file mode 100644 index a4e7e1a9d81..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/fairscale.nn.model_parallel.initialize.get_model_parallel_rank.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]fairscale.nn.model_parallel.initialize.get_model_parallel_rank -### [fairscale.nn.model_parallel.initialize.get_model_parallel_rank](https://github.com/facebookresearch/fairscale/blob/164cc0f3170b4a3951dd84dda29c3e1504ac4d6e/fairscale/nn/model_parallel/initialize.py#L155) -```python -fairscale.nn.model_parallel.initialize.get_model_parallel_rank() -``` - -### [paddle.distributed.fleet.base.topology._HYBRID_PARALLEL_GROUP.get_model_parallel_rank](https://github.com/PaddlePaddle/Paddle/blob/ddac1b431483ddc0f1ee600e799aa31fc0a75961/python/paddle/distributed/fleet/base/topology.py#L463) -```python -paddle.distributed.fleet.base.topology._HYBRID_PARALLEL_GROUP.get_model_parallel_rank() -``` - -两者功能一致,均无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/fairscale.nn.model_parallel.initialize.get_model_parallel_world_size.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/fairscale.nn.model_parallel.initialize.get_model_parallel_world_size.md deleted file mode 100644 index f7e77ed3b12..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/fairscale.nn.model_parallel.initialize.get_model_parallel_world_size.md +++ /dev/null @@ -1,11 +0,0 @@ -## [ 仅 API 调用方式不一致 ]fairscale.nn.model_parallel.initialize.get_model_parallel_world_size -### [fairscale.nn.model_parallel.initialize.get_model_parallel_world_size](https://github.com/facebookresearch/fairscale/blob/164cc0f3170b4a3951dd84dda29c3e1504ac4d6e/fairscale/nn/model_parallel/initialize.py#L150) -```python -fairscale.nn.model_parallel.initialize.get_model_parallel_world_size() -``` - -### [paddle.distributed.fleet.base.topology._HYBRID_PARALLEL_GROUP._mp_degree](https://github.com/PaddlePaddle/Paddle/blob/ddac1b431483ddc0f1ee600e799aa31fc0a75961/python/paddle/distributed/fleet/base/topology.py#L185) -```python -paddle.distributed.fleet.base.topology._HYBRID_PARALLEL_GROUP._mp_degree -``` -两者功能一致,均无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/flash_attn.__version__.split.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/flash_attn.__version__.split.md deleted file mode 100644 index 4864b6a4514..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/flash_attn.__version__.split.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]flash_attn._\_version__.split -### [flash_attn._\_version__.split](https://github.com/Dao-AILab/flash-attention/blob/72e27c6320555a37a83338178caa25a388e46121/flash_attn/__init__.py) -```python -flash_attn.__version__.split(sep=None, maxsplit=-1) -``` - -### [paddle._\_version__.split](https://github.com/PaddlePaddle/Paddle/tree/develop) -```python -paddle.__version__.split(sep=None, maxsplit=-1) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.clamp_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.clamp_.md deleted file mode 100644 index d0194099d89..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.clamp_.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.clamp_ -### [torch.Tensor.clamp_](https://pytorch.org/docs/stable/generated/torch.Tensor.clamp_.html?highlight=clamp_#torch.Tensor.clamp_) -```python -torch.Tensor.clamp_(min=None, max=None) -``` - -### [paddle.Tensor.clip_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html#id6) -```python -paddle.Tensor.clip_(min=None, max=None, name=None) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.col_indices.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.col_indices.md deleted file mode 100644 index 18d95da9805..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.col_indices.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.col_indices -### [torch.Tensor.col_indices](https://pytorch.org/docs/stable/generated/torch.Tensor.col_indices.html) -```python -torch.Tensor.col_indices() -``` - -### [paddle.Tensor.cols]() -```python -paddle.Tensor.cols() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.conj_physical.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.conj_physical.md deleted file mode 100644 index 0012606562e..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.conj_physical.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.conj_physical -### [torch.Tensor.conj_physical](https://pytorch.org/docs/stable/generated/torch.Tensor.conj_physical.html#torch.Tensor.conj_physical) -```python -torch.Tensor.conj_physical() -``` - -### [paddle.Tensor.conj](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html#conj-name-none) -```python -paddle.Tensor.conj(name=None) -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.crow_indices.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.crow_indices.md deleted file mode 100644 index 8fae880836d..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.crow_indices.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.crow_indices -### [torch.Tensor.crow_indices](https://pytorch.org/docs/stable/generated/torch.Tensor.crow_indices.html) -```python -torch.Tensor.crow_indices() -``` - -### [paddle.Tensor.crows]() -```python -paddle.Tensor.crows() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.det.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.det.md deleted file mode 100644 index af2ea21c9f7..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.det.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.det -### [torch.Tensor.det](https://pytorch.org/docs/stable/generated/torch.Tensor.det.html?highlight=det#torch.Tensor.det) -```python -torch.Tensor.det() -``` - -### [paddle.linalg.det](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/linalg/det_cn.html#det) -```python -paddle.linalg.det(x, name=None) -``` - -Pytorch 为 Tensor 类方法,PaddlePaddle 为普通函数,将调用 torch.Tensor 类方法的 self Tensor 传入到 Paddle 接口中即可。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.device.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.device.md deleted file mode 100644 index 0d6a778b9c9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.device.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.device -### [torch.Tensor.device](https://pytorch.org/docs/stable/generated/torch.Tensor.device.html) -```python -torch.Tensor.device -``` - -### [paddle.Tensor.place](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html#place) -```python -paddle.Tensor.place -``` - -两者功能一致,均无参数,都用来查看一个 Tensor 的设备位置。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.erf_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.erf_.md deleted file mode 100644 index 2522212c24f..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.erf_.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.erf_ -### [torch.Tensor.erf_](https://pytorch.org/docs/stable/generated/torch.Tensor.erf_.html) -```python -torch.Tensor.erf_() -``` - -### [paddle.erf_]() -```python -paddle.erf_(x) -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.expm1_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.expm1_.md deleted file mode 100644 index bbb1b16a69b..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.expm1_.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.expm1_ -### [torch.Tensor.expm1_](https://pytorch.org/docs/stable/generated/torch.Tensor.expm1_.html) -```python -torch.Tensor.expm1_() -``` - -### [paddle.expm1_]() -```python -paddle.expm1_(x) -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.fix.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.fix.md deleted file mode 100644 index 8467e925391..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.fix.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.fix -### [torch.Tensor.fix](https://pytorch.org/docs/stable/generated/torch.Tensor.fix.html?highlight=fix#torch.Tensor.fix) -```python -torch.Tensor.fix() -``` - -### [paddle.Tensor.trunc](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html#trunc-name-none) -```python -paddle.Tensor.trunc(name=None) -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.fix_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.fix_.md deleted file mode 100644 index 319329edbf7..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.fix_.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.fix_ -### [torch.Tensor.fix_](https://pytorch.org/docs/stable/generated/torch.Tensor.fix_.html) -```python -torch.Tensor.fix_() -``` - -### [paddle.Tensor.trunc_]() -```python -paddle.Tensor.trunc_() -``` - -两者功能一致,均无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.imag.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.imag.md deleted file mode 100644 index 4f2715a5bca..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.imag.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.imag -### [torch.Tensor.imag](https://pytorch.org/docs/stable/generated/torch.Tensor.imag.html) -```python -torch.Tensor.imag -``` - -### [paddle.Tensor.imag](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html#imag-name-none) -```python -paddle.Tensor.imag -``` - -两者功能一致,均无参数,用于返回原复数 Tensor 的虚部数值。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.is_inference.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.is_inference.md deleted file mode 100644 index ff578646bfd..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.is_inference.md +++ /dev/null @@ -1,21 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.is_inference -### [torch.Tensor.is_inference](https://pytorch.org/docs/stable/generated/torch.Tensor.is_inference.html) -```python -torch.Tensor.is_inference() -``` - -### [paddle.Tensor.stop_gradient]() -```python -paddle.Tensor.stop_gradient -``` - -两者功能一致,无参数。 `is_inference` 会强制关闭梯度记录。并且不能在中途设置梯度,而 `stop_gradient` 仅为停止计算该算子梯度,可在中途重新设为 `True` ,`Paddle` 为近似实现。 - -### 转写示例 -```python -# PyTorch 写法 -x.is_inference() - -# Paddle 写法 -x.stop_gradient -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.is_sparse.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.is_sparse.md deleted file mode 100644 index 344fa5dc258..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.is_sparse.md +++ /dev/null @@ -1,23 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.is_sparse -### [torch.Tensor.is_sparse](https://pytorch.org/docs/stable/generated/torch.Tensor.is_sparse.html) -```python -torch.Tensor.is_sparse -``` - -### [paddle.Tensor.is_sparse](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html) -```python -paddle.Tensor.is_sparse() -``` - -两者功能一致,但使用方式不一致,前者可以直接访问属性,后者需要调用方法,具体如下: - -### 转写示例 -```python -# torch 版本可以直接访问属性 -# x = torch.rand(3) -# print(x.is_sparse) - -# Paddle 版本需要调用 -x = paddle.rand([3]) -print(x.is_sparse()) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.is_sparse_csr.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.is_sparse_csr.md deleted file mode 100644 index a621b5ab2c9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.is_sparse_csr.md +++ /dev/null @@ -1,21 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.is_sparse_csr -### [torch.Tensor.is_sparse_csr](https://pytorch.org/docs/stable/generated/torch.Tensor.is_sparse_csr.html) -```python -torch.Tensor.is_sparse_csr -``` - -### [paddle.Tensor.is_sparse_csr](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html) -```python -paddle.Tensor.is_sparse_csr() -``` - -两者功能一致,但使用方式不一致,前者可以直接访问属性,后者需要调用方法,具体如下: - -### 转写示例 -```python -# torch 版本可以直接访问属性 -x.is_sparse_csr - -# Paddle 版本需要调用 -x.is_sparse_csr() -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.movedim.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.movedim.md deleted file mode 100644 index a2273b00a4d..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.movedim.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.movedim -### [torch.Tensor.movedim](https://pytorch.org/docs/stable/generated/torch.Tensor.movedim.html) -```python -torch.Tensor.movedim(source, destination) -``` - -### [paddle.Tensor.moveaxis](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/moveaxis_cn.html) -```python -paddle.Tensor.moveaxis(source, destination, name = None) -``` - -两者功能一致且参数用法一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.mvlgamma.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.mvlgamma.md deleted file mode 100644 index 16785a43b35..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.mvlgamma.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.mvlgamma -### [torch.Tensor.mvlgamma](https://pytorch.org/docs/stable/generated/torch.Tensor.mvlgamma.html#torch-tensor-mvlgamma) -```python -torch.Tensor.mvlgamma(p) -``` - -### [paddle.Tensor.multigammaln](https://github.com/PaddlePaddle/Paddle/blob/be090bd0bc9ac7a8595296c316b3a6ed3dc60ba6/python/paddle/tensor/math.py#L5099) -```python -paddle.Tensor.multigammaln(p, name=None) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.mvlgamma_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.mvlgamma_.md deleted file mode 100644 index 420cb3624c6..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.mvlgamma_.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.mvlgamma_ -### [torch.Tensor.mvlgamma_](https://pytorch.org/docs/stable/generated/torch.Tensor.mvlgamma_.html#torch-tensor-mvlgamma) -```python -torch.Tensor.mvlgamma_(p) -``` - -### [paddle.Tensor.multigammaln_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/multigammaln__cn.html#multigammaln) -```python -paddle.Tensor.multigammaln_(p, name=None) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.negative.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.negative.md deleted file mode 100644 index 7b70d7a3760..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.negative.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.negative -### [torch.Tensor.negative](https://pytorch.org/docs/stable/generated/torch.negative.html#torch.negative) -```python -torch.Tensor.negative() -``` - -### [paddle.Tensor.neg](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/neg_cn.html#cn-api-paddle-neg) -```python -paddle.Tensor.neg() -``` - -两者功能一致,均无参数,用于计算输入 x 的相反数并返回。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.negative_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.negative_.md deleted file mode 100644 index c294b75b952..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.negative_.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.negative_ -### [torch.Tensor.negative_](https://pytorch.org/docs/stable/generated/torch.Tensor.negative_.html) -```python -torch.Tensor.negative_() -``` - -### [paddle.Tensor.neg_]() -```python -paddle.Tensor.neg_() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.nelement.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.nelement.md deleted file mode 100644 index 5525ed9db9f..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.nelement.md +++ /dev/null @@ -1,14 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.nelement -### [torch.Tensor.nelement](https://pytorch.org/docs/stable/generated/torch.Tensor.nelement.html?highlight=nelement#torch.Tensor.nelement) -```python -torch.Tensor.nelement() -``` - -### [paddle.Tensor.size](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/fluid/layers/size_cn.html#cn-api-fluid-layers-size) -```python -paddle.Tensor.size() -``` - - - -两者功能一致,均无参数,用于返回张量的单元数量,是一个 int 型的整数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.numel.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.numel.md deleted file mode 100644 index 59e977371d9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.numel.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.numel -### [torch.Tensor.numel](https://pytorch.org/docs/stable/generated/torch.numel.html?highlight=numel#torch.numel) -```python -torch.Tensor.numel() -``` - -### [paddle.Tensor.size](https://www.paddlepaddle.org.cn/documentation/docs/guides/beginner/tensor_cn.html#tensor-shape) -```python -paddle.Tensor.size -``` - -两者功能一致,均无参数,用于返回张量的单元数量,是一个 int 型的整数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.positive.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.positive.md deleted file mode 100644 index 1ca198147d5..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.positive.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.positive -### [torch.Tensor.positive](https://pytorch.org/docs/stable/generated/torch.Tensor.positive.html#torch.Tensor.positive) -```python -torch.Tensor.positive() -``` - -### [paddle.positive](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/positive_cn.html#positive) -```python -paddle.positive(x) -``` - -Pytorch 为 Tensor 类方法,Paddle 为普通函数,将调用 torch.Tensor 类方法的 self Tensor 传入到 Paddle 接口中即可。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.real.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.real.md deleted file mode 100644 index 312bd67fe7a..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.real.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.real -### [torch.Tensor.real](https://pytorch.org/docs/stable/generated/torch.Tensor.real.html) -```python -torch.Tensor.real -``` - -### [paddle.Tensor.real](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html#real-name-none) -```python -paddle.Tensor.real -``` - -两者功能一致,均无参数,用于返回 Tensor 的实部数值。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.retain_grad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.retain_grad.md deleted file mode 100644 index 0a003bcc91f..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.retain_grad.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.retain_grad -### [torch.Tensor.retain_grad](https://pytorch.org/docs/stable/generated/torch.Tensor.retain_grad.html) -```python -torch.Tensor.retain_grad() -``` - -### [paddle.Tensor.retain_grads](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Overview_cn.html#paddle) -```python -paddle.Tensor.retain_grads() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.sparse_mask.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.sparse_mask.md deleted file mode 100644 index 8f7814e550d..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.sparse_mask.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.sparse_mask -### [torch.Tensor.sparse_mask](https://pytorch.org/docs/stable/generated/torch.Tensor.sparse_mask.html) -```python -torch.Tensor.sparse_mask(mask) -``` - -### [paddle.sparse.mask_as](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/sparse/mask_as_cn.html) -```python -paddle.sparse.mask_as(x, mask, name=None) -``` - -两者功能一致,但调用方式不同,torch 通过 Tensor 类方法调用,而 paddle 是直接调用函数,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.square_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.square_.md deleted file mode 100644 index 857e6b30c80..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.square_.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.square_ -### [torch.Tensor.square_](https://pytorch.org/docs/stable/generated/torch.Tensor.square_.html) -```python -torch.Tensor.square_() -``` - -### [paddle.square_]() -```python -paddle.square_(x) -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.to_sparse.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.to_sparse.md deleted file mode 100644 index 970d2a6c512..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.to_sparse.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.to_sparse -### [torch.Tensor.to_sparse](https://pytorch.org/docs/stable/generated/torch.Tensor.to_sparse.html#torch.Tensor.to_sparse) -```python -torch.Tensor.to_sparse(sparse_dim) -``` - -### [paddle.Tensor.to_sparse_coo]() -```python -paddle.Tensor.to_sparse_coo(sparse_dim) -``` - -两者功能一致,参数用法一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.Function.forward.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.Function.forward.md deleted file mode 100644 index 504fb2b5c6e..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.Function.forward.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.autograd.Function.forward -### [torch.autograd.Function.forward](https://pytorch.org/docs/stable/generated/torch.autograd.Function.forward.html#torch.autograd.Function.forward) -```python -torch.autograd.Function.forward(ctx, *args, **kwargs) -``` - -### [paddle.autograd.PyLayer.forward](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayer_cn.html#forward-ctx-args-kwargs) -```python -paddle.autograd.PyLayer.forward(ctx, *args, **kwargs) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.enable_grad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.enable_grad.md deleted file mode 100644 index 5cb1fecbde5..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.enable_grad.md +++ /dev/null @@ -1,10 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.autograd.enable_grad -### [torch.autograd.enable_grad](https://pytorch.org/docs/stable/generated/torch.enable_grad.html#enable-grad) -```python -torch.autograd.enable_grad() -``` - -### [paddle.enable_grad](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/enable_grad.html#enable-grad) -```python -paddle.enable_grad() -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.md deleted file mode 100644 index 54f529aa4dd..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.autograd.function.FunctionCtx -### [torch.autograd.function.FunctionCtx]() -```python -torch.autograd.function.FunctionCtx -``` - -### [paddle.autograd.PyLayerContext](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayerContext_cn.html#pylayercontext) -```python -paddle.autograd.PyLayerContext -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.save_for_backward.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.save_for_backward.md deleted file mode 100644 index 5a63180e878..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.save_for_backward.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.autograd.function.FunctionCtx.save_for_backward -### [torch.autograd.function.FunctionCtx.save_for_backward](https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.save_for_backward.html#torch.autograd.function.FunctionCtx.save_for_backward) -```python -torch.autograd.function.FunctionCtx.save_for_backward(*tensors) -``` - -### [paddle.autograd.PyLayerContext.save_for_backward](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayerContext_cn.html#save-for-backward-tensors) -```python -paddle.autograd.PyLayerContext.save_for_backward(*tensors) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.set_materialize_grads.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.set_materialize_grads.md deleted file mode 100644 index ffd92e6cd48..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.function.FunctionCtx.set_materialize_grads.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.autograd.function.FunctionCtx.set_materialize_grads -### [torch.autograd.function.FunctionCtx.set_materialize_grads](https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.set_materialize_grads.html#torch.autograd.function.FunctionCtx.set_materialize_grads) -```python -torch.autograd.function.FunctionCtx.set_materialize_grads(value) -``` - -### [paddle.autograd.PyLayerContext.set_materialize_grads](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayerContext_cn.html#set-materialize-grads-self-value) -```python -paddle.autograd.PyLayerContext.set_materialize_grads(value) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.grad_mode.set_grad_enabled.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.grad_mode.set_grad_enabled.md deleted file mode 100644 index f47abbdf0bf..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.grad_mode.set_grad_enabled.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.autograd.grad_mode.set_grad_enabled -### [torch.autograd.grad_mode.set_grad_enabled](https://docs.pytorch.org/docs/stable/generated/torch.autograd.grad_mode.set_grad_enabled.html#torch.autograd.grad_mode.set_grad_enabled) -```python -torch.autograd.grad_mode.set_grad_enabled(mode) -``` - -### [paddle.set_grad_enabled](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/set_grad_enabled_cn.html) -```python -paddle.set_grad_enabled(mode) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.graph.saved_tensors_hooks.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.graph.saved_tensors_hooks.md deleted file mode 100644 index ff6c4e522d9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.autograd.graph.saved_tensors_hooks.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.autograd.graph.saved_tensors_hooks -### [torch.autograd.graph.saved_tensors_hooks](https://pytorch.org/docs/stable/autograd.html?highlight=saved_tensors_hooks#torch.autograd.graph.saved_tensors_hooks) -```python -torch.autograd.graph.saved_tensors_hooks(pack_hook, unpack_hook) -``` - -### [paddle.autograd.saved_tensors_hooks](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/saved_tensors_hooks_cn.html) -```python -paddle.autograd.saved_tensors_hooks(pack_hook, unpack_hook) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.backends.cuda.is_built.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.backends.cuda.is_built.md deleted file mode 100644 index bcf05bb6a1b..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.backends.cuda.is_built.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.backends.cuda.is_built -### [torch.backends.cuda.is_built](https://pytorch.org/docs/stable/backends.html?highlight=torch+backends+cudnn+is_available#torch.backends.cuda.is_built) -```python -torch.backends.cuda.is_built() -``` - -### [paddle.device.is_compiled_with_cuda](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/is_compiled_with_cuda_cn.html#is-compiled-with-cuda) -```python -paddle.device.is_compiled_with_cuda() -``` - -检测是否在 cuda 环境下编译安装包。无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.backends.cudnn.version.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.backends.cudnn.version.md deleted file mode 100644 index 2b9a38727cc..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.backends.cudnn.version.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.backends.cudnn.version -### [torch.backends.cudnn.version](https://pytorch.org/docs/stable/generated/torch.backends.cudnn.version.html) -```python -torch.backends.cudnn.version() -``` - -### [paddle.device.get\_cudnn\_version](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/get_cudnn_version_cn.html#get-cudnn-version) -```python -paddle.device.get_cudnn_version() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cda.StreamContext.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cda.StreamContext.md deleted file mode 100644 index c83df4e7edd..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cda.StreamContext.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.StreamContext -### [torch.cuda.StreamContext](https://pytorch.org/docs/stable/generated/torch.cuda.StreamContext.html#torch.cuda.StreamContext) -```python -torch.cuda.StreamContext(stream) -``` - -### [paddle.device.stream_guard](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/device/stream_guard_cn.html#stream-guard) -```python -paddle.device.stream_guard(stream) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cpu.current_device.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cpu.current_device.md deleted file mode 100644 index e66413d08e0..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cpu.current_device.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cpu.current_device -### [torch.cpu.current_device](https://pytorch.org/docs/stable/generated/torch.cpu.current_device.html) -```python -torch.cpu.current_device() -``` - -### [paddle.get_device](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/get_device_cn.html#get-device) -```python -paddle.get_device() -``` - -功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.get_device_name.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.get_device_name.md deleted file mode 100644 index 02192c8d79d..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.get_device_name.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.get_device_name -### [torch.cuda.get_device_name](https://pytorch.org/docs/stable/generated/torch.cuda.get_device_name.html) -```python -torch.cuda.get_device_name(device=None) -``` - -### [paddle.device.cuda.get_device_name](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/get_device_name_cn.html) -```python -paddle.device.cuda.get_device_name(device=None) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.is_bf16_supported.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.is_bf16_supported.md deleted file mode 100644 index ca2a674f51a..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.is_bf16_supported.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.is_bf16_supported -### [torch.cuda.is_bf16_supported](https://pytorch.org/docs/stable/cuda.html) -```python -torch.cuda.is_bf16_supported() -``` - -### [paddle.amp.is_bfloat16_supported](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/amp/is_bfloat16_supported_cn.html#is-bfloat16-supported) -```python -paddle.amp.is_bfloat16_supported() -``` - -功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.max_memory_allocated.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.max_memory_allocated.md deleted file mode 100644 index 8dd6856a6ee..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.max_memory_allocated.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.max_memory_allocated -### [torch.cuda.max_memory_allocated](https://pytorch.org/docs/stable/generated/torch.cuda.max_memory_allocated.html#torch.cuda.max_memory_allocated) -```python -torch.cuda.max_memory_allocated(device) -``` - -### [paddle.device.cuda.max_memory_allocated](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/max_memory_allocated_cn.html) -```python -paddle.device.cuda.max_memory_allocated(device) -``` - -功能一致,参数完全一致(PyTorch 参数是 PaddlePaddle 参数子集),具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.max_memory_reserved.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.max_memory_reserved.md deleted file mode 100644 index d428dcc16a1..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.max_memory_reserved.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.max_memory_reserved -### [torch.cuda.max_memory_reserved](https://pytorch.org/docs/stable/generated/torch.cuda.max_memory_reserved.html#torch.cuda.max_memory_reserved) -```python -torch.cuda.max_memory_reserved(device) -``` - -### [paddle.device.cuda.max_memory_reserved](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/max_memory_reserved_cn.html) -```python -paddle.device.cuda.max_memory_reserved(device) -``` - -功能一致,参数完全一致(PyTorch 参数是 PaddlePaddle 参数子集),具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.nvtx.range_pop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.nvtx.range_pop.md deleted file mode 100644 index 51598ede266..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.nvtx.range_pop.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.nvtx.range_pop -### [torch.cuda.nvtx.range_pop](https://pytorch.org/docs/stable/generated/torch.cuda.nvtx.range_pop.html#torch.cuda.nvtx.range_pop) -```python -torch.cuda.nvtx.range_pop() -``` - -### [paddle.framework.core.nvprof_nvtx_pop](https://github.com/PaddlePaddle/Paddle/blob/645dfb4040a15712cea9ccfed4dcb0655aeeb0ea/paddle/fluid/pybind/pybind.cc#L2468) -```python -paddle.framework.core.nvprof_nvtx_pop() -``` - -功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.reset_max_memory_allocated.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.reset_max_memory_allocated.md deleted file mode 100644 index 1f49b45e0d6..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.reset_max_memory_allocated.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.reset_max_memory_allocated -### [torch.cuda.reset_max_memory_allocated](https://pytorch.org/docs/stable/generated/torch.cuda.reset_max_memory_allocated.html#torch.cuda.reset_max_memory_allocated) -```python -torch.cuda.reset_max_memory_allocated(device) -``` - -### [paddle.device.cuda.reset_max_memory_allocated](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/reset_max_memory_allocated_cn.html) -```python -paddle.device.cuda.reset_max_memory_allocated(device) -``` - -功能不一致(Pytorch 通过调用 reset_peak_memory_stats 函数实现,重置所有 CUDA 内存分配器跟踪的峰值统计。PaddlePaddle 仅重置分配给 Tensor 的显存峰值统计),参数完全一致(PyTorch 参数是 PaddlePaddle 参数子集),具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.reset_max_memory_cached.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.reset_max_memory_cached.md deleted file mode 100644 index 63c64aaf0fb..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.reset_max_memory_cached.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.reset_max_memory_cached -### [torch.cuda.reset_max_memory_cached](https://docs.pytorch.org/docs/stable/generated/torch.cuda.reset_max_memory_cached.html#torch-cuda-reset-max-memory-cached) -```python -torch.cuda.reset_max_memory_cached(device) -``` - -### [paddle.device.cuda.reset_max_memory_reserved](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/reset_max_memory_reserved_cn.html) -```python -paddle.device.cuda.reset_max_memory_reserved(device) -``` - -功能不一致(Pytorch 目前已弃用该函数。类似函数通过调用 reset_peak_memory_stats 函数实现,重置所有 CUDA 内存分配器跟踪的峰值统计。PaddlePaddle 仅重置由 Allocator 管理的显存峰值统计),参数完全一致(PyTorch 参数是 PaddlePaddle 参数子集),具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.set_stream.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.set_stream.md deleted file mode 100644 index fbc123a820d..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.set_stream.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.set_stream -### [torch.cuda.set_stream](https://pytorch.org/docs/stable/generated/torch.cuda.set_stream.html#torch.cuda.set_stream) -```python -torch.cuda.set_stream(stream) -``` - -### [paddle.device.set_stream](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/device/set_stream_cn.html#set-stream) -```python -paddle.device.set_stream(stream=None) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.stream.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.stream.md deleted file mode 100644 index e7c79abd0ad..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.stream.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.cuda.stream -### [torch.cuda.stream](https://pytorch.org/docs/stable/generated/torch.cuda.stream.html) -```python -torch.cuda.stream(stream) -``` - -### [paddle.device.stream_guard](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/stream_guard_cn.html#stream-guard) -```python -paddle.device.stream_guard(stream) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributed.ReduceOp.PRODUCT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributed.ReduceOp.PRODUCT.md deleted file mode 100644 index 50b1149ed5b..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributed.ReduceOp.PRODUCT.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.distributed.ReduceOp.PRODUCT -### [torch.distributed.ReduceOp.PRODUCT](https://pytorch.org/docs/stable/distributed.html#torch.distributed.ReduceOp) -```python -torch.distributed.ReduceOp.PRODUCT -``` - -### [paddle.distributed.ReduceOp.PROD](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/distributed/ReduceOp_cn.html#reduceop) -```python -paddle.distributed.ReduceOp.PROD -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributed.is_nccl_available.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributed.is_nccl_available.md deleted file mode 100644 index 7f9cd0c9568..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributed.is_nccl_available.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.distributed.is_nccl_available -### [torch.distributed.is_nccl_available](https://pytorch.org/docs/stable/distributed.html#torch.distributed.is_nccl_available) -```python -torch.distributed.is_nccl_available() -``` - -### [paddle.core.is_compiled_with_nccl](https://github.com/PaddlePaddle/Paddle/blob/61de6003525166856157b6220205fe53df638376/python/paddle/jit/sot/utils/paddle_api_config.py#L159) -```python -paddle.core.is_compiled_with_nccl() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributions.constraints.Constraint.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributions.constraints.Constraint.md deleted file mode 100644 index 0619f720026..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributions.constraints.Constraint.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.distributions.constraints.Constraint -### [torch.distributions.constraints.Constraint](https://pytorch.org/docs/stable/distributions.html#module-torch.distributions.constraints) -```python -torch.distributions.constraints.Constraint() -``` - -### [paddle.distribution.constraint.Constraint](https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/distribution/constraint.py) -```python -paddle.distribution.constraint.Constraint() -``` - -两者功能一致,无参数,对象均使用 `check` 进行回调。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributions.distribution.Distribution.log_prob.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributions.distribution.Distribution.log_prob.md deleted file mode 100644 index b963db968e0..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributions.distribution.Distribution.log_prob.md +++ /dev/null @@ -1,13 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.distributions.distribution.Distribution.log_prob -### [torch.distributions.distribution.Distribution.log\_prob](https://pytorch.org/docs/stable/distributions.html#torch.distributions.distribution.Distribution.log_prob) -```python -torch.distributions.distribution.Distribution.log_prob(value) -``` - -### [paddle.distribution.Distribution.log\_prob](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/distribution/Distribution_cn.html#log-prob-value) -```python -paddle.distribution.Distribution.log_prob(value) -``` - - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributions.kl.kl_divergence.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributions.kl.kl_divergence.md deleted file mode 100644 index d034adb8b25..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.distributions.kl.kl_divergence.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.distributions.kl.kl_divergence -### [torch.distributions.kl.kl_divergence](https://pytorch.org/docs/stable/distributions.html?highlight=torch+distributions+kl+kl_divergence#torch.distributions.kl.kl_divergence) -```python -torch.distributions.kl.kl_divergence(p, q) -``` - -### [paddle.distribution.kl_divergence](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/distribution/kl_divergence_cn.html) -```python -paddle.distribution.kl_divergence(p, q) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.is_inference.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.is_inference.md deleted file mode 100644 index 62fb2d91143..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.is_inference.md +++ /dev/null @@ -1,21 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.is_inference -### [torch.is_inference]() -```python -torch.is_inference(input) -``` - -### [paddle.Tensor.stop_gradient]() -```python -paddle.Tensor.stop_gradient -``` - -两者功能一致,无参数。 `is_inference` 会强制关闭梯度记录。并且不能在中途设置梯度,而 `stop_gradient` 仅为停止计算该算子梯度,可在中途重新设为 `True` ,`Paddle` 为近似实现。 - -### 转写示例 -```python -# PyTorch 写法 -torch.is_inference(x) - -# Paddle 写法 -x.stop_gradient -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool1d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool1d.md deleted file mode 100644 index c5e144950c6..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.AdaptiveAvgPool1d.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.nn.AdaptiveAvgPool1d -### [torch.nn.AdaptiveAvgPool1d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool1d.html) -```python -torch.nn.AdaptiveAvgPool1d(output_size) -``` - -### [paddle.nn.AdaptiveAvgPool1D](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/AdaptiveAvgPool1D_cn.html#adaptiveavgpool1d) -```python -paddle.nn.AdaptiveAvgPool1D(output_size, name=None) -``` - -两者功能一致,参数完全一致。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.apply.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.apply.md deleted file mode 100644 index b80bea2f945..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.apply.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.nn.Module.apply -### [torch.nn.Module.apply](https://pytorch.org/docs/stable/generated/torch.nn.Module.html?highlight=torch+nn+module+apply#torch.nn.Module.apply) -```python -torch.nn.Module.apply(fn) -``` - -### [paddle.nn.Layer.apply](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer_cn.html) -```python -paddle.nn.Layer.apply(fn) -``` - -两者功能一致,参数完全一致。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.children.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.children.md deleted file mode 100644 index d77ca465257..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.children.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.nn.Module.children -### [torch.nn.Module.children](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.children) -```python -torch.nn.Module.children() -``` - -### [paddle.nn.Layer.children](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer_cn.html#children) -```python -paddle.nn.Layer.children() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.eval.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.eval.md deleted file mode 100644 index 696c615a036..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.eval.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.nn.Module.eval -### [torch.nn.Module.eval](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.eval) -```python -torch.nn.Module.eval() -``` - -### [paddle.nn.Layer.eval](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer_cn.html#eval) -```python -paddle.nn.Layer.eval() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.named_children.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.named_children.md deleted file mode 100644 index 1ca22ac10a4..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.named_children.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.nn.Module.named_children -### [torch.nn.Module.named_children](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.named_children) -```python -torch.nn.Module.named_children() -``` - -### [paddle.nn.Layer.named_children](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer_cn.html#named-children) -```python -paddle.nn.Layer.named_children() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.train.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.train.md deleted file mode 100644 index 8f7d7fd7965..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.Module.train.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.nn.Module.train -### [torch.nn.Module.train](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.train) -```python -torch.nn.Module.train() -``` - -### [paddle.nn.Layer.train](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer_cn.html#train) -```python -paddle.nn.Layer.train() -``` - -两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.add_param_group.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.add_param_group.md deleted file mode 100644 index 79c3cf3fef6..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.add_param_group.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.optim.Optimizer.add_param_group -### [torch.optim.Optimizer.add_param_group](https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.add_param_group.html?highlight=torch+optim+optimizer+add_param_group#torch.optim.Optimizer.add_param_group) -```python -torch.optim.Optimizer.add_param_group(param_group) -``` - -### [paddle.optimizer.Optimizer._add_param_group]() -```python -paddle.optimizer.Optimizer._add_param_group(param_group) -``` - -参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.load_state_dict.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.load_state_dict.md deleted file mode 100644 index c7ef34004d5..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.load_state_dict.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.optim.Optimizer.load_state_dict -### [torch.optim.Optimizer.load_state_dict](https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.load_state_dict.html#torch.optim.Optimizer.load_state_dict) -```python -torch.optim.Optimizer.load_state_dict(state_dict) -``` - -### [paddle.optimizer.Optimizer.load_state_dict](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/optimizer/Optimizer_cn.html) -```python -paddle.optimizer.Optimizer.load_state_dict(state_dict) -``` - -两者功能一致,参数完全一致。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.state_dict.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.state_dict.md deleted file mode 100644 index 48bf3fcccad..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.optim.Optimizer.state_dict.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.optim.Optimizer.state_dict -### [torch.optim.Optimizer.state_dict](https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.state_dict.html?highlight=torch+optim+optimizer+state_dict#torch.optim.Optimizer.state_dict) -```python -torch.optim.Optimizer.state_dict() -``` - -### [paddle.optimizer.Optimizer.state_dict](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/optimizer/Optimizer_cn.html) -```python -paddle.optimizer.Optimizer.state_dict() -``` - -两者功能一致,均无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.ChainDataset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.ChainDataset.md deleted file mode 100644 index d9af795d1aa..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.ChainDataset.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.utils.data.ChainDataset -### [torch.utils.data.ChainDataset](https://pytorch.org/docs/stable/data.html#torch.utils.data.ChainDataset) -```python -torch.utils.data.ChainDataset(datasets) -``` - -### [paddle.io.ChainDataset](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/ChainDataset_cn.html) -```python -paddle.io.ChainDataset(datasets) -``` - -paddle 参数和 torch 参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.ConcatDataset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.ConcatDataset.md deleted file mode 100644 index 128339e940c..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.ConcatDataset.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.utils.data.ConcatDataset -### [torch.utils.data.ConcatDataset](https://pytorch.org/docs/stable/data.html#torch.utils.data.ConcatDataset) -```python -torch.utils.data.ConcatDataset(datasets) -``` - -### [paddle.io.ConcatDataset](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/ConcatDataset_cn.html) -```python -paddle.io.ConcatDataset(datasets) -``` - -paddle 参数和 torch 参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.Dataset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.Dataset.md deleted file mode 100644 index 8de0920b70f..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.Dataset.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.utils.data.Dataset -### [torch.utils.data.Dataset](https://pytorch.org/docs/stable/data.html?highlight=torch%20utils%20data%20dataset#torch.utils.data.Dataset) -```python -torch.utils.data.Dataset() -``` - -### [paddle.io.Dataset](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/io/Dataset_cn.html#dataset) -```python -paddle.io.Dataset() -``` - -功能一致,参数完全一致 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.IterableDataset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.IterableDataset.md deleted file mode 100644 index c25ee737715..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.IterableDataset.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.utils.data.IterableDataset -### [torch.utils.data.IterableDataset](https://pytorch.org/docs/stable/data.html#torch.utils.data.IterableDataset) -```python -torch.utils.data.IterableDataset() -``` - -### [paddle.io.IterableDataset](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/IterableDataset_cn.html#iterabledataset) -```python -paddle.io.IterableDataset() -``` - -无参数,二者都为可迭代数据集的基类。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.Sampler.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.Sampler.md deleted file mode 100644 index 0a2031c2dbf..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.Sampler.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.utils.data.Sampler -### [torch.utils.data.Sampler](https://pytorch.org/docs/stable/data.html#torch.utils.data.Sampler) -```python -torch.utils.data.Sampler(data_source) -``` - -### [paddle.io.Sampler](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/Sampler_cn.html) -```python -paddle.io.Sampler(data_source) -``` - -paddle 参数和 torch 参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.SequentialSampler.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.SequentialSampler.md deleted file mode 100644 index be273516023..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.SequentialSampler.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.utils.data.SequentialSampler -### [torch.utils.data.SequentialSampler](https://pytorch.org/docs/stable/generated/torch.utils.data.SequentialSampler.html) -```python -torch.utils.data.SequentialSampler(data_source) -``` - -### [paddle.io.SequenceSampler](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/SequenceSampler_cn.html#sequencesampler) -```python -paddle.io.SequenceSampler(data_source) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.Subset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.Subset.md deleted file mode 100644 index 2d463d88f56..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.Subset.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.utils.data.Subset -### [torch.utils.data.Subset](https://pytorch.org/docs/stable/data.html#torch.utils.data.Subset) -```python -torch.utils.data.Subset(dataset, indices) -``` - -### [paddle.io.Subset](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/Subset_cn.html) -```python -paddle.io.Subset(dataset, indices) -``` - -paddle 参数和 torch 参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.random_split.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.random_split.md deleted file mode 100644 index bf764184e26..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.random_split.md +++ /dev/null @@ -1,16 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torch.utils.data.random_split -### [torch.utils.data.random_split](https://pytorch.org/docs/stable/data.html?highlight=torch+utils+data+random_split#torch.utils.data.random_split) -```python -torch.utils.data.random_split(dataset, - lengths, - generator=) -``` - -### [paddle.io.random_split](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/random_split_cn.html) -```python -paddle.io.random_split(dataset, - lengths, - generator=None) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.ops.RoIPool.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.ops.RoIPool.md deleted file mode 100644 index 534335c0234..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.ops.RoIPool.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.ops.RoIPool -### [torchvision.ops.RoIPool](https://pytorch.org/vision/main/generated/torchvision.ops.RoIPool.html) -```python -torchvision.ops.RoIPool(output_size: None, spatial_scale: float) -``` - -### [paddle.vision.ops.RoIPool](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/vision/ops/RoIPool_cn.html) -```python -paddle.vision.ops.RoIPool(output_size, spatial_scale=1.0) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transform.functional.pad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transform.functional.pad.md deleted file mode 100644 index 170a6794f2a..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transform.functional.pad.md +++ /dev/null @@ -1,22 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.pad -### [torchvision.transforms.functional.pad](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.pad.html) -```python -torchvision.transforms.functional.pad( - img: Union[PIL.Image.Image, torch.Tensor], - padding: Union[int, List[int], Tuple[int, ...]], - fill: Union[int, List[int], Tuple[int, ...]] = 0, - padding_mode: Literal['constant', 'edge', 'reflect', 'symmetric'] = 'constant' -) -``` - -### [paddle.vision.transforms.pad](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/vision/transforms/pad_cn.html) -```python -paddle.vision.transforms.pad( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], - padding: Union[int, List[int], Tuple[int, ...]], - fill: Union[int, List[int], Tuple[int, ...]] = 0, - padding_mode: Literal['constant', 'edge', 'reflect', 'symmetric'] = 'constant' -) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.Compose.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.Compose.md deleted file mode 100644 index 2afeb4331b9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.Compose.md +++ /dev/null @@ -1,16 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.Compose -### [torchvision.transforms.Compose](https://pytorch.org/vision/main/generated/torchvision.transforms.Compose.html) -```python -torchvision.transforms.Compose( - transforms: List[Transform] -) -``` - -### [paddle.vision.transforms.Compose](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/Compose_cn.html) -```python -paddle.vision.transforms.Compose( - transforms: Union[List[Transform], Tuple[Transform, ...]] -) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.BICUBIC.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.BICUBIC.md deleted file mode 100644 index 66cb335dd1d..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.BICUBIC.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.BICUBIC -### [torchvision.transforms.InterpolationMode.BICUBIC](https://pytorch.org/vision/stable/index.html) -```python -torchvision.transforms.InterpolationMode.BICUBIC -``` - -### ['bicubic']() -```python -'bicubic' -``` - -枚举对应到字符串,两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.BILINEAR.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.BILINEAR.md deleted file mode 100644 index f29d36366d2..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.BILINEAR.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.BILINEAR -### [torchvision.transforms.InterpolationMode.BILINEAR](https://pytorch.org/vision/stable/index.html) -```python -torchvision.transforms.InterpolationMode.BILINEAR -``` - -### ['bilinear']() -```python -'bilinear' -``` - -枚举对应到字符串,两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.BOX.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.BOX.md deleted file mode 100644 index b6b9604b3d9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.BOX.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.BOX -### [torchvision.transforms.InterpolationMode.BOX](https://pytorch.org/vision/stable/index.html) -```python -torchvision.transforms.InterpolationMode.BOX -``` - -### ['box']() -```python -'box' -``` - -枚举对应到字符串,两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.HAMMING.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.HAMMING.md deleted file mode 100644 index 207bb5033d4..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.HAMMING.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.HAMMING -### [torchvision.transforms.InterpolationMode.HAMMING](https://pytorch.org/vision/stable/index.html) -```python -torchvision.transforms.InterpolationMode.HAMMING -``` - -### ['hamming']() -```python -'hamming' -``` - -枚举对应到字符串,两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.LANCZOS.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.LANCZOS.md deleted file mode 100644 index ffa836ce394..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.LANCZOS.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.LANCZOS -### [torchvision.transforms.InterpolationMode.LANCZOS](https://pytorch.org/vision/stable/index.html) -```python -torchvision.transforms.InterpolationMode.LANCZOS -``` - -### ['lanczos']() -```python -'lanczos' -``` - -枚举对应到字符串,两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.NEAREST.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.NEAREST.md deleted file mode 100644 index 9daacb7e048..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.NEAREST.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.NEAREST -### [torchvision.transforms.InterpolationMode.NEAREST](https://pytorch.org/vision/stable/index.html) -```python -torchvision.transforms.InterpolationMode.NEAREST -``` - -### ['nearest']() -```python -'nearest' -``` - -枚举对应到字符串,两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.NEAREST_EXACT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.NEAREST_EXACT.md deleted file mode 100644 index 44b9a0ff852..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.InterpolationMode.NEAREST_EXACT.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.NEAREST_EXACT -### [torchvision.transforms.InterpolationMode.NEAREST_EXACT](https://pytorch.org/vision/stable/index.html) -```python -torchvision.transforms.InterpolationMode.NEAREST_EXACT -``` - -### ['nearest_exact']() -```python -'nearest_exact' -``` - -枚举对应到字符串,两者功能一致,无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.adjust_brightness.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.adjust_brightness.md deleted file mode 100644 index 63b5c780e63..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.adjust_brightness.md +++ /dev/null @@ -1,15 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.adjust_brightness -### [torchvision.transforms.functional.adjust_brightness](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.adjust_brightness.html) -```python -torchvision.transforms.functional.adjust_brightness(img: Tensor, brightness_factor: float) -``` - -### [paddle.vision.transforms.adjust_brightness](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/adjust_brightness_cn.html) -```python -paddle.vision.transforms.adjust_brightness( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], - brightness_factor: float -) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.adjust_contrast.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.adjust_contrast.md deleted file mode 100644 index d2eb7fe3752..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.adjust_contrast.md +++ /dev/null @@ -1,15 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.adjust_contrast -### [torchvision.transforms.functional.adjust_contrast](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.adjust_contrast.html) -```python -torchvision.transforms.functional.adjust_contrast(img: Tensor, contrast_factor: float) -``` - -### [paddle.vision.transforms.adjust_contrast](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/adjust_contrast_cn.html) -```python -paddle.vision.transforms.adjust_contrast( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], - contrast_factor: float -) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.adjust_hue.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.adjust_hue.md deleted file mode 100644 index 93f127dcf8b..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.adjust_hue.md +++ /dev/null @@ -1,15 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.adjust_hue -### [torchvision.transforms.functional.adjust_hue](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.adjust_hue.html) -```python -torchvision.transforms.functional.adjust_hue(img: Tensor, hue_factor: float) -``` - -### [paddle.vision.transforms.adjust_hue](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/adjust_hue_cn.html) -```python -paddle.vision.transforms.adjust_hue( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], - hue_factor: float -) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.center_crop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.center_crop.md deleted file mode 100644 index fccde598f5a..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.center_crop.md +++ /dev/null @@ -1,15 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.center_crop -### [torchvision.transforms.functional.center_crop](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.center_crop.html) -```python -torchvision.transforms.functional.center_crop(img: Tensor, output_size: List[int]) -``` - -### [paddle.vision.transforms.center_crop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/center_crop_cn.html) -```python -paddle.vision.transforms.center_crop( - img: Union[PIL.Image.Image, paddle.Tensor, np.ndarray], - output_size: List[int] -) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.crop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.crop.md deleted file mode 100644 index d1475bb4e1e..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.crop.md +++ /dev/null @@ -1,24 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.crop -### [torchvision.transforms.functional.crop](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.crop.html) -```python -torchvision.transforms.functional.crop( - img: Union[PIL.Image.Image, torch.Tensor], - top: int, - left: int, - height: int, - width: int -) -``` - -### [paddle.vision.transforms.crop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/crop_cn.html) -```python -paddle.vision.transforms.crop( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor], - top: int, - left: int, - height: int, - width: int -) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.erase.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.erase.md deleted file mode 100644 index 597d609eb55..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.erase.md +++ /dev/null @@ -1,28 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.erase -### [torchvision.transforms.functional.erase](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.erase.html?highlight=erase#torchvision.transforms.functional.erase) -```python -torchvision.transforms.functional.erase( - img: Tensor, - i: int, - j: int, - h: int, - w: int, - v: Tensor, - inplace: bool = False -) -``` - -### [paddle.vision.transforms.erase](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/erase_cn.html) -```python -paddle.vision.transforms.erase( - img: Union[paddle.Tensor, np.ndarray, PIL.Image.Image], - i: int, - j: int, - h: int, - w: int, - v: Union[paddle.Tensor, np.ndarray], - inplace: bool = False -) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.hflip.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.hflip.md deleted file mode 100644 index 9164c718754..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.hflip.md +++ /dev/null @@ -1,16 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.hflip -### [torchvision.transforms.functional.hflip](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.hflip.html) -```python -torchvision.transforms.functional.hflip( - img: Union[PIL.Image.Image, torch.Tensor] -) -``` - -### [paddle.vision.transforms.hflip](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/hflip_cn.html) -```python -paddle.vision.transforms.hflip( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor] -) -``` - -两者功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.to_grayscale.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.to_grayscale.md deleted file mode 100644 index 63f0672b728..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.to_grayscale.md +++ /dev/null @@ -1,16 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.to_grayscale -### [torchvision.transforms.functional.to_grayscale](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.to_grayscale.html?highlight=to_grayscale#torchvision.transforms.functional.to_grayscale) -```python -torchvision.transforms.functional.to_grayscale(img: PIL.Image.Image, - num_output_channels: int = 1) -``` - -### [paddle.vision.transforms.to_grayscale](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/to_grayscale_cn.html#to-grayscale) -```python -paddle.vision.transforms.to_grayscale( - img: Union[PIL.Image.Image, np.ndarray], - num_output_channels: int = 1 -) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.vflip.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.vflip.md deleted file mode 100644 index c1eaa58646a..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torchvision.transforms.functional.vflip.md +++ /dev/null @@ -1,16 +0,0 @@ -## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.vflip -### [torchvision.transforms.functional.vflip](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.vflip.html) -```python -torchvision.transforms.functional.vflip( - img: Union[PIL.Image.Image, torch.Tensor] -) -``` - -### [paddle.vision.transforms.vflip](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/vflip_cn.html) -```python -paddle.vision.transforms.vflip( - img: Union[PIL.Image.Image, np.ndarray, paddle.Tensor] -) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.generation.LogitsProcessorList.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.generation.LogitsProcessorList.md deleted file mode 100644 index 7c122ed9a17..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.generation.LogitsProcessorList.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]transformers.generation.LogitsProcessorList -### [transformers.generation.LogitsProcessorList](https://hf-mirror.com/docs/transformers/v4.42.0/en/internal/generation_utils#transformers.LogitsProcessorList) -```python -transformers.generation.LogitsProcessorList() -``` - -### [paddlenlp.generation.LogitsProcessorList](https://github.com/PaddlePaddle/PaddleNLP/blob/e336e78c338d2514ee6c937982ce5d8c960b85ff/paddlenlp/transformers/bloom/processor.py#L24) -```python -paddlenlp.generation.LogitsProcessorList() -``` - -虚基类,用于被继承。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.generation.utils.GenerateOutput.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.generation.utils.GenerateOutput.md deleted file mode 100644 index be6681c5ed4..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.generation.utils.GenerateOutput.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]transformers.generation.utils.GenerateOutput -### [transformers.generation.utils.GenerateOutput](https://github.com/huggingface/transformers/blob/v4.42.0/src/transformers/generation/utils.py#L345) -```python -transformers.generation.utils.GenerateOutput() -``` - -### [paddlenlp.transformers.model_outputs.BaseModelOutput](https://github.com/PaddlePaddle/PaddleNLP/blob/e336e78c338d2514ee6c937982ce5d8c960b85ff/paddlenlp/transformers/model_outputs.py#L513) -```python -paddlenlp.transformers.model_outputs.BaseModelOutput() -``` - -两者功能一致且无参数。 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.modeling_outputs.BaseModelOutputWithPast.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.modeling_outputs.BaseModelOutputWithPast.md deleted file mode 100644 index d14561c9037..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.modeling_outputs.BaseModelOutputWithPast.md +++ /dev/null @@ -1,13 +0,0 @@ -## [ 仅 API 调用方式不一致 ]transformers.modeling_outputs.BaseModelOutputWithPast -### [transformers.modeling_outputs.BaseModelOutputWithPast](https://hf-mirror.com/docs/transformers/v4.42.0/en/main_classes/output#transformers.modeling_outputs.BaseModelOutputWithPast) -```python -transformers.modeling_outputs.BaseModelOutputWithPast(last_hidden_state: FloatTensor = None, past_key_values: Optional = None, hidden_states: Optional = None, attentions: Optional = None) -``` - -### [paddlenlp.transformers.model_outputs.BaseModelOutputWithPast](https://github.com/PaddlePaddle/PaddleNLP/blob/e336e78c338d2514ee6c937982ce5d8c960b85ff/paddlenlp/transformers/model_outputs.py#L590) -```python -paddlenlp.transformers.model_outputs.BaseModelOutputWithPast(last_hidden_state: paddle.Tensor = None, past_key_values: Optional[Tuple[Tuple[paddle.Tensor]]] = None, hidden_states: Optional[Tuple[paddle.Tensor]] = None, attentions: Optional[Tuple[paddle.Tensor]] = None) -``` - - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.modeling_outputs.CausalLMOutputWithPast.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.modeling_outputs.CausalLMOutputWithPast.md deleted file mode 100644 index d4024f02265..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.modeling_outputs.CausalLMOutputWithPast.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]transformers.modeling_outputs.CausalLMOutputWithPast -### [transformers.modeling_outputs.CausalLMOutputWithPast](https://hf-mirror.com/docs/transformers/v4.42.0/en/main_classes/output#transformers.modeling_outputs.CausalLMOutputWithPast) -```python -transformers.modeling_outputs.CausalLMOutputWithPast(loss: Optional = None, logits: FloatTensor = None, past_key_values: Optional = None, hidden_states: Optional = None, attentions: Optional = None) -``` - -### [paddlenlp.transformers.model_outputs.CausalLMOutputWithPast](https://github.com/PaddlePaddle/PaddleNLP/blob/e336e78c338d2514ee6c937982ce5d8c960b85ff/paddlenlp/transformers/model_outputs.py#L874) -```python -paddlenlp.transformers.model_outputs.CausalLMOutputWithPast(loss: Optional[paddle.Tensor] = None, logits: paddle.Tensor = None, past_key_values: Optional[Tuple[Tuple[paddle.Tensor]]] = None, hidden_states: Optional[Tuple[paddle.Tensor]] = None, attentions: Optional[Tuple[paddle.Tensor]] = None) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.utils.add_start_docstrings_to_model_forward.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.utils.add_start_docstrings_to_model_forward.md deleted file mode 100644 index 6c88fcbc2e8..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/transformers.utils.add_start_docstrings_to_model_forward.md +++ /dev/null @@ -1,12 +0,0 @@ -## [ 仅 API 调用方式不一致 ]transformers.utils.add_start_docstrings_to_model_forward -### [transformers.utils.add_start_docstrings_to_model_forward](https://github.com/huggingface/transformers/blob/44b231671db25974cfebcdae34402ad5099bf37a/src/transformers/utils/doc.py#L45) -```python -transformers.utils.add_start_docstrings_to_model_forward(*docstr) -``` - -### [paddlenlp.trainer.utils.add_start_docstrings_to_model_forward](https://github.com/PaddlePaddle/PaddleNLP/blob/8fd74f0b74cdae12e74518b9dbbb8f6c6219c338/paddlenlp/trainer/utils/doc.py#L27) -```python -paddlenlp.trainer.utils.add_start_docstrings_to_model_forward(*docstr) -``` - -功能一致,参数完全一致,具体如下: diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.argwhere.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.argwhere.md new file mode 100644 index 00000000000..cf4e280a4f6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.argwhere.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.argwhere + +### [torch.Tensor.argwhere](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.argwhere) + +```python +torch.Tensor.argwhere() +``` + +### [paddle.Tensor.nonzero](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/nonzero_cn.html#paddle/Tensor/nonzero_cn#cn-api-paddle-Tensor-nonzero) + +```python +paddle.Tensor.nonzero(as_tuple=False) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = input.argwhere() + +# Paddle 写法 +result = input.nonzero() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.bernoulli.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.bernoulli.md new file mode 100644 index 00000000000..aa971fbb396 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.bernoulli.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.bernoulli + +### [torch.Tensor.bernoulli](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.bernoulli) + +```python +torch.Tensor.bernoulli(generator=None) +``` + +### [paddle.bernoulli](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/bernoulli_cn.html#paddle/bernoulli_cn#cn-api-paddle-bernoulli) + +```python +paddle.bernoulli(x, p=None, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.bernoulli() + +# Paddle 写法 +result = paddle.bernoulli(a) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.clamp_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.clamp_.md new file mode 100644 index 00000000000..bd6c968f52a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.clamp_.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.clamp_ + +### [torch.Tensor.clamp_](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.clamp_) + +```python +torch.Tensor.clamp_(min=None, max=None) +``` + +### [paddle.Tensor.clip_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/clip__cn.html#paddle/Tensor/clip__cn#cn-api-paddle-Tensor-clip_) + +```python +paddle.Tensor.clip_(min=None, max=None, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.clamp_(-0.5, 0.5) + +# Paddle 写法 +result = a.clip_(-0.5, 0.5) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.col_indices.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.col_indices.md new file mode 100644 index 00000000000..3a71d945cbc --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.col_indices.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.col_indices + +### [torch.Tensor.col_indices](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.col_indices) + +```python +torch.Tensor.col_indices() +``` + +### [paddle.Tensor.cols](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/cols_cn.html#paddle/Tensor/cols_cn#cn-api-paddle-Tensor-cols) + +```python +paddle.Tensor.cols() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.col_indices() + +# Paddle 写法 +result = a.cols() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.conj_physical.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.conj_physical.md new file mode 100644 index 00000000000..875f029843d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.conj_physical.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.conj_physical + +### [torch.Tensor.conj_physical](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.conj_physical) + +```python +torch.Tensor.conj_physical() +``` + +### [paddle.Tensor.conj](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/conj_cn.html#paddle/Tensor/conj_cn#cn-api-paddle-Tensor-conj) + +```python +paddle.Tensor.conj(name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = src.conj_physical() + +# Paddle 写法 +result = src.conj() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.crow_indices.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.crow_indices.md new file mode 100644 index 00000000000..b2117d87f3b --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.crow_indices.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.crow_indices + +### [torch.Tensor.crow_indices](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.crow_indices) + +```python +torch.Tensor.crow_indices() +``` + +### [paddle.Tensor.crows](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/crows_cn.html#paddle/Tensor/crows_cn#cn-api-paddle-Tensor-crows) + +```python +paddle.Tensor.crows() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.crow_indices() + +# Paddle 写法 +result = a.crows() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.det.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.det.md new file mode 100644 index 00000000000..4522f22fdc4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.det.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.det + +### [torch.Tensor.det](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.det) + +```python +torch.Tensor.det() +``` + +### [paddle.linalg.det](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/linalg/det_cn.html#paddle/linalg/det_cn#cn-api-paddle-linalg-det) + +```python +paddle.linalg.det(x, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = x.det() + +# Paddle 写法 +result = paddle.linalg.det(x) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.device.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.device.md new file mode 100644 index 00000000000..36654568596 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.device.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.device + +### [torch.Tensor.device](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.device) + +```python +torch.Tensor.device +``` + +### [paddle.Tensor.place](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/place_cn.html#paddle/Tensor/place_cn#cn-api-paddle-Tensor-place) + +```python +paddle.Tensor.place +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = src.device + +# Paddle 写法 +result = src.place +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.erf_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.erf_.md new file mode 100644 index 00000000000..20dc16b9d0c --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.erf_.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.erf_ + +### [torch.Tensor.erf_](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.erf_) + +```python +torch.Tensor.erf_() +``` + +### [paddle.erf_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/erf__cn.html#paddle/erf__cn#cn-api-paddle-erf_) + +```python +paddle.erf_(x, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +a.erf_() + +# Paddle 写法 +paddle.erf_(a) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.expm1_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.expm1_.md new file mode 100644 index 00000000000..9e38efae281 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.expm1_.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.expm1_ + +### [torch.Tensor.expm1_](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.expm1_) + +```python +torch.Tensor.expm1_() +``` + +### [paddle.expm1_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/expm1__cn.html#paddle/expm1__cn#cn-api-paddle-expm1_) + +```python +paddle.expm1_(x, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +a.expm1_() + +# Paddle 写法 +paddle.expm1_(a) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.fix.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.fix.md new file mode 100644 index 00000000000..7609bb41268 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.fix.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.fix + +### [torch.Tensor.fix](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.fix) + +```python +torch.Tensor.fix() +``` + +### [paddle.Tensor.trunc](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/trunc_cn.html#paddle/Tensor/trunc_cn#cn-api-paddle-Tensor-trunc) + +```python +paddle.Tensor.trunc(name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = input.fix() + +# Paddle 写法 +result = input.trunc() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.fix_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.fix_.md new file mode 100644 index 00000000000..77fce690efb --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.fix_.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.fix_ + +### [torch.Tensor.fix_](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.fix_) + +```python +torch.Tensor.fix_() +``` + +### [paddle.Tensor.trunc_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/trunc__cn.html#paddle/Tensor/trunc__cn#cn-api-paddle-Tensor-trunc_) + +```python +paddle.Tensor.trunc_(name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = input.fix_() + +# Paddle 写法 +result = input.trunc_() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.hardshrink.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.hardshrink.md new file mode 100644 index 00000000000..cb5e71976fc --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.hardshrink.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.hardshrink + +### [torch.Tensor.hardshrink](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.hardshrink) + +```python +torch.Tensor.hardshrink() +``` + +### [paddle.nn.functional.hardshrink](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/hardshrink_cn.html#paddle/nn/functional/hardshrink_cn#cn-api-paddle-nn-functional-hardshrink) + +```python +paddle.nn.functional.hardshrink(x, threshold=0.5, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = x.hardshrink() + +# Paddle 写法 +result = paddle.nn.functional.hardshrink(x) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.imag.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.imag.md new file mode 100644 index 00000000000..23385c8c093 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.imag.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.imag + +### [torch.Tensor.imag](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.imag) + +```python +torch.Tensor.imag +``` + +### [paddle.Tensor.imag](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/imag_cn.html#paddle/Tensor/imag_cn#cn-api-paddle-Tensor-imag) + +```python +paddle.Tensor.imag(name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = src.imag + +# Paddle 写法 +result = src.imag() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.is_inference.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.is_inference.md new file mode 100644 index 00000000000..a7ebe4efbd7 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.is_inference.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.is_inference + +### [torch.Tensor.is_inference](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.is_inference) + +```python +torch.Tensor.is_inference() +``` + +### [paddle.Tensor.stop_gradient](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/stop_gradient_cn.html#paddle/Tensor/stop_gradient_cn#cn-api-paddle-Tensor-stop_gradient) + +```python +paddle.Tensor.stop_gradient +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = x.is_inference() + +# Paddle 写法 +result = x.stop_gradient +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.is_sparse.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.is_sparse.md new file mode 100644 index 00000000000..5aa2d54d0b0 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.is_sparse.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.is_sparse + +### [torch.Tensor.is_sparse](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.is_sparse) + +```python +torch.Tensor.is_sparse +``` + +### [paddle.Tensor.is_sparse](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/is_sparse_cn.html#paddle/Tensor/is_sparse_cn#cn-api-paddle-Tensor-is_sparse) + +```python +paddle.Tensor.is_sparse() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.is_sparse + +# Paddle 写法 +result = a.is_sparse() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.is_sparse_csr.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.is_sparse_csr.md new file mode 100644 index 00000000000..2af468637f6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.is_sparse_csr.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.is_sparse_csr + +### [torch.Tensor.is_sparse_csr](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.is_sparse_csr) + +```python +torch.Tensor.is_sparse_csr +``` + +### [paddle.Tensor.is_sparse_csr](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/is_sparse_csr_cn.html#paddle/Tensor/is_sparse_csr_cn#cn-api-paddle-Tensor-is_sparse_csr) + +```python +paddle.Tensor.is_sparse_csr() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.is_sparse_csr + +# Paddle 写法 +result = a.is_sparse_csr() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.matrix_exp.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.matrix_exp.md similarity index 54% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.matrix_exp.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.matrix_exp.md index 9cd9974b6f9..eb4bd4baad7 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.Tensor.matrix_exp.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.matrix_exp.md @@ -1,21 +1,25 @@ ## [ 仅 API 调用方式不一致 ]torch.Tensor.matrix_exp -### [torch.Tensor.matrix_exp](https://pytorch.org/docs/stable/generated/torch.Tensor.matrix_exp.html#torch-tensor-matrix-exp) + +### [torch.Tensor.matrix_exp](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.matrix_exp) + ```python torch.Tensor.matrix_exp() ``` -### [paddle.linalg.matrix_exp](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/linalg/matrix_exp_cn.html) +### [paddle.linalg.matrix_exp](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/linalg/matrix_exp_cn.html#paddle/linalg/matrix_exp_cn#cn-api-paddle-linalg-matrix_exp) + ```python paddle.linalg.matrix_exp(x, name=None) ``` -两者功能一致,无参数。 +两者功能一致,但调用方式不一致,具体如下: ### 转写示例 + ```python # PyTorch 写法 -out = x.matrix_exp() +result = x.matrix_exp() # Paddle 写法 -out = paddle.linalg.matrix_exp(x) +result = paddle.linalg.matrix_exp(x) ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.movedim.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.movedim.md new file mode 100644 index 00000000000..e630f6c64ac --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.movedim.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.movedim + +### [torch.Tensor.movedim](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.movedim) + +```python +torch.Tensor.movedim(source, destination) +``` + +### [paddle.Tensor.moveaxis](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/moveaxis_cn.html#paddle/Tensor/moveaxis_cn#cn-api-paddle-Tensor-moveaxis) + +```python +paddle.Tensor.moveaxis(source, destination, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = x.movedim(1, 0) + +# Paddle 写法 +result = x.moveaxis(1, 0) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.mvlgamma.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.mvlgamma.md new file mode 100644 index 00000000000..c82127db9ee --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.mvlgamma.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.mvlgamma + +### [torch.Tensor.mvlgamma](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.mvlgamma) + +```python +torch.Tensor.mvlgamma(p) +``` + +### [paddle.Tensor.multigammaln](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/multigammaln_cn.html#paddle/Tensor/multigammaln_cn#cn-api-paddle-Tensor-multigammaln) + +```python +paddle.Tensor.multigammaln(p, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = x.mvlgamma(2) + +# Paddle 写法 +result = x.multigammaln(2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.mvlgamma_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.mvlgamma_.md new file mode 100644 index 00000000000..eb86818b1dd --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.mvlgamma_.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.mvlgamma_ + +### [torch.Tensor.mvlgamma_](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.mvlgamma_) + +```python +torch.Tensor.mvlgamma_(p) +``` + +### [paddle.Tensor.multigammaln_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/multigammaln__cn.html#paddle/Tensor/multigammaln__cn#cn-api-paddle-Tensor-multigammaln_) + +```python +paddle.Tensor.multigammaln_(p, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = x.mvlgamma_(2) + +# Paddle 写法 +result = x.multigammaln_(2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.negative.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.negative.md new file mode 100644 index 00000000000..2766d94f6f6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.negative.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.negative + +### [torch.Tensor.negative](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.negative) + +```python +torch.Tensor.negative() +``` + +### [paddle.Tensor.neg](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/neg_cn.html#paddle/Tensor/neg_cn#cn-api-paddle-Tensor-neg) + +```python +paddle.Tensor.neg(name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.negative() + +# Paddle 写法 +result = a.neg() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.negative_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.negative_.md new file mode 100644 index 00000000000..38677c1268f --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.negative_.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.negative_ + +### [torch.Tensor.negative_](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.negative_) + +```python +torch.Tensor.negative_() +``` + +### [paddle.Tensor.neg_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/neg__cn.html#paddle/Tensor/neg__cn#cn-api-paddle-Tensor-neg_) + +```python +paddle.Tensor.neg_(name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +a.negative_() + +# Paddle 写法 +a.neg_() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.nelement.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.nelement.md new file mode 100644 index 00000000000..0fc364b423b --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.nelement.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.nelement + +### [torch.Tensor.nelement](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.nelement) + +```python +torch.Tensor.nelement() +``` + +### [paddle.Tensor.size](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/size_cn.html#paddle/Tensor/size_cn#cn-api-paddle-Tensor-size) + +```python +paddle.Tensor.size +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.nelement() + +# Paddle 写法 +result = a.size +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.numel.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.numel.md new file mode 100644 index 00000000000..e80f89f6a02 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.numel.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.numel + +### [torch.Tensor.numel](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.numel) + +```python +torch.Tensor.numel() +``` + +### [paddle.Tensor.size](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/size_cn.html#paddle/Tensor/size_cn#cn-api-paddle-Tensor-size) + +```python +paddle.Tensor.size +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.numel() + +# Paddle 写法 +result = a.size +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.pinverse.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.pinverse.md new file mode 100644 index 00000000000..89810be491a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.pinverse.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.pinverse + +### [torch.Tensor.pinverse](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.pinverse) + +```python +torch.Tensor.pinverse() +``` + +### [paddle.Tensor.pinv](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/pinv_cn.html#paddle/Tensor/pinv_cn#cn-api-paddle-Tensor-pinv) + +```python +paddle.Tensor.pinv(rcond=1e-15, hermitian=False, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = a.pinverse() + +# Paddle 写法 +result = a.pinv() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.positive.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.positive.md new file mode 100644 index 00000000000..061b26d0ffc --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.positive.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.positive + +### [torch.Tensor.positive](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.positive) + +```python +torch.Tensor.positive() +``` + +### [paddle.positive](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/positive_cn.html#paddle/positive_cn#cn-api-paddle-positive) + +```python +paddle.positive(x) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = x.positive() + +# Paddle 写法 +result = paddle.positive(x) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.real.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.real.md new file mode 100644 index 00000000000..2736e15e5f0 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.real.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.real + +### [torch.Tensor.real](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.real) + +```python +torch.Tensor.real +``` + +### [paddle.Tensor.real](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/real_cn.html#paddle/Tensor/real_cn#cn-api-paddle-Tensor-real) + +```python +paddle.Tensor.real(name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = src.real + +# Paddle 写法 +result = src.real() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.retain_grad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.retain_grad.md new file mode 100644 index 00000000000..f7d725a96fc --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.retain_grad.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.retain_grad + +### [torch.Tensor.retain_grad](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.retain_grad) + +```python +torch.Tensor.retain_grad() +``` + +### [paddle.Tensor.retain_grads](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/retain_grads_cn.html#paddle/Tensor/retain_grads_cn#cn-api-paddle-Tensor-retain_grads) + +```python +paddle.Tensor.retain_grads() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result.retain_grad() + +# Paddle 写法 +result.retain_grads() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.sparse_mask.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.sparse_mask.md new file mode 100644 index 00000000000..4483d4f4b50 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.sparse_mask.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.sparse_mask + +### [torch.Tensor.sparse_mask](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.sparse_mask) + +```python +torch.Tensor.sparse_mask(mask) +``` + +### [paddle.sparse.mask_as](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/sparse/mask_as_cn.html#paddle/sparse/mask_as_cn#cn-api-paddle-sparse-mask_as) + +```python +paddle.sparse.mask_as(x, mask, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +out = x.sparse_mask(coo) + +# Paddle 写法 +out = paddle.sparse.mask_as(x, coo) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.square_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.square_.md new file mode 100644 index 00000000000..b78d706f0d4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.square_.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.square_ + +### [torch.Tensor.square_](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.square_) + +```python +torch.Tensor.square_() +``` + +### [paddle.square_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/square__cn.html#paddle/square__cn#cn-api-paddle-square_) + +```python +paddle.square_(x, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +x.square_() + +# Paddle 写法 +paddle.square_(x) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.to_sparse.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.to_sparse.md new file mode 100644 index 00000000000..effb7248a25 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.to_sparse.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.Tensor.to_sparse + +### [torch.Tensor.to_sparse](https://pytorch.org/docs/stable/tensors.html#torch.Tensor.to_sparse) + +```python +torch.Tensor.to_sparse(sparse_dim) +``` + +### [paddle.Tensor.to_sparse_coo](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/to_sparse_coo_cn.html#paddle/Tensor/to_sparse_coo_cn#cn-api-paddle-Tensor-to_sparse_coo) + +```python +paddle.Tensor.to_sparse_coo(sparse_dim) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +b = a.to_sparse(1) + +# Paddle 写法 +b = a.to_sparse_coo(1) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.Function.forward.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.Function.forward.md new file mode 100644 index 00000000000..84e8ff2a1fc --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.Function.forward.md @@ -0,0 +1,45 @@ +## [ 仅 API 调用方式不一致 ]torch.autograd.Function.forward + +### [torch.autograd.Function.forward](https://pytorch.org/docs/stable/generated/torch.autograd.Function.html#torch.autograd.Function.forward) + +```python +torch.autograd.Function.forward(*args, **kwargs) +``` + +### [paddle.autograd.PyLayer.forward](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayer/forward_cn.html#paddle/autograd/PyLayer/forward_cn#cn-api-paddle-autograd-PyLayer-forward) + +```python +paddle.autograd.PyLayer.forward(ctx, *args, **kwargs) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class cus_tanh(torch.autograd.Function): + @staticmethod + def forward(ctx, x, func=torch.square): + ctx.func = func + y = func(x) + return y + + @staticmethod + def backward(ctx, dy): + grad = dy + 1 + return grad + +# Paddle 写法 +class cus_tanh(paddle.autograd.PyLayer): + @staticmethod + def forward(ctx, x, func=paddle.square): + ctx.func = func + y = func(x) + return y + + @staticmethod + def backward(ctx, dy): + grad = dy + 1 + return grad +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.enable_grad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.enable_grad.md new file mode 100644 index 00000000000..11ba79ee671 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.enable_grad.md @@ -0,0 +1,36 @@ +## [ 仅 API 调用方式不一致 ]torch.autograd.enable_grad + +### [torch.autograd.enable_grad](https://pytorch.org/docs/stable/generated/torch.autograd.html#torch.autograd.enable_grad) + +```python +torch.autograd.enable_grad(*args, **kwargs) +``` + +### [paddle.enable_grad](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/enable_grad_cn.html#paddle/enable_grad_cn#cn-api-paddle-enable_grad) + +```python +paddle.enable_grad(*args, **kwargs) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +@torch.autograd.enable_grad() +def doubler(x): + return x * 2 + +with torch.no_grad(): + result = doubler(x) + +# Paddle 写法 +@paddle.enable_grad() +def doubler(x): + return x * 2 + +with paddle.no_grad(): + result = doubler(x) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.mark_non_differentiable.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.mark_non_differentiable.md new file mode 100644 index 00000000000..7f01c9f93e8 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.mark_non_differentiable.md @@ -0,0 +1,47 @@ +## [ 仅 API 调用方式不一致 ]torch.autograd.function.FunctionCtx.mark_non_differentiable + +### [torch.autograd.function.FunctionCtx.mark_non_differentiable](https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.html#torch.autograd.function.FunctionCtx.mark_non_differentiable) + +```python +torch.autograd.function.FunctionCtx.mark_non_differentiable(*args) +``` + +### [paddle.autograd.PyLayerContext.mark_non_differentiable](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayerContext/mark_non_differentiable_cn.html#paddle/autograd/PyLayerContext/mark_non_differentiable_cn#cn-api-paddle-autograd-PyLayerContext-mark_non_differentiable) + +```python +paddle.autograd.PyLayerContext.mark_non_differentiable(*args) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class cus_func(torch.autograd.Function): + @staticmethod + def forward(ctx, x): + a = x + x + b = x + x + x + ctx.mark_non_differentiable(a) + return a, b + + @staticmethod + def backward(ctx, grad_a, grad_b): + grad_x = 3 * grad_b + return grad_x + +# Paddle 写法 +class cus_func(paddle.autograd.PyLayer): + @staticmethod + def forward(ctx, x): + a = x + x + b = x + x + x + ctx.mark_non_differentiable(a) + return a, b + + @staticmethod + def backward(ctx, grad_a, grad_b): + grad_x = 3 * grad_b + return grad_x +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.md new file mode 100644 index 00000000000..9916d548db9 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.md @@ -0,0 +1,45 @@ +## [ 仅 API 调用方式不一致 ]torch.autograd.function.FunctionCtx + +### [torch.autograd.function.FunctionCtx](https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.html#torch.autograd.function.FunctionCtx) + +```python +torch.autograd.function.FunctionCtx(*args, **kwargs) +``` + +### [paddle.autograd.PyLayerContext](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayerContext_cn.html#paddle/autograd/PyLayerContext_cn#cn-api-paddle-autograd-PyLayerContext) + +```python +paddle.autograd.PyLayerContext(*args, **kwargs) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class MyFunction(torch.autograd.Function): + @staticmethod + def forward(ctx, x): + ctx.x = x + return x * 2 + + @staticmethod + def backward(ctx, grad_output): + x = ctx.x + grad_input = grad_output * 2 + return grad_input + +# Paddle 写法 +class MyFunction(paddle.autograd.PyLayer): + @staticmethod + def forward(ctx, x): + ctx.x = x + return x * 2 + + @staticmethod + def backward(ctx, grad_output): + x = ctx.x + grad_input = grad_output * 2 + return grad_input +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.save_for_backward.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.save_for_backward.md new file mode 100644 index 00000000000..b29b29160f2 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.save_for_backward.md @@ -0,0 +1,45 @@ +## [ 仅 API 调用方式不一致 ]torch.autograd.function.FunctionCtx.save_for_backward + +### [torch.autograd.function.FunctionCtx.save_for_backward](https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.html#torch.autograd.function.FunctionCtx.save_for_backward) + +```python +torch.autograd.function.FunctionCtx.save_for_backward(*tensors) +``` + +### [paddle.autograd.PyLayerContext.save_for_backward](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayerContext/save_for_backward_cn.html#paddle/autograd/PyLayerContext/save_for_backward_cn#cn-api-paddle-autograd-PyLayerContext-save_for_backward) + +```python +paddle.autograd.PyLayerContext.save_for_backward(*tensors) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class cus_tanh(torch.autograd.Function): + @staticmethod + def forward(ctx, x): + y = torch.nn.functional.tanh(x) + ctx.save_for_backward(y) + return y + + @staticmethod + def backward(ctx, dy): + grad = dy + 1 + return grad + +# Paddle 写法 +class cus_tanh(paddle.autograd.PyLayer): + @staticmethod + def forward(ctx, x): + y = paddle.nn.functional.tanh(x=x) + ctx.save_for_backward(y) + return y + + @staticmethod + def backward(ctx, dy): + grad = dy + 1 + return grad +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.saved_tensors.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.saved_tensors.md new file mode 100644 index 00000000000..f56e2392d77 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.saved_tensors.md @@ -0,0 +1,47 @@ +## [ 仅 API 调用方式不一致 ]torch.autograd.function.FunctionCtx.saved_tensors + +### [torch.autograd.function.FunctionCtx.saved_tensors](https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.html#torch.autograd.function.FunctionCtx.saved_tensors) + +```python +torch.autograd.function.FunctionCtx.saved_tensors +``` + +### [paddle.autograd.PyLayerContext.saved_tensor](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayerContext/saved_tensor_cn.html#paddle/autograd/PyLayerContext/saved_tensor_cn#cn-api-paddle-autograd-PyLayerContext-saved_tensor) + +```python +paddle.autograd.PyLayerContext.saved_tensor() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class cus_tanh(torch.autograd.Function): + @staticmethod + def forward(ctx, x): + y = torch.nn.functional.tanh(x) + ctx.save_for_backward(x, y) + return y + + @staticmethod + def backward(ctx, dy): + x, y = ctx.saved_tensors + grad = y + dy + 1 + return grad + +# Paddle 写法 +class cus_tanh(paddle.autograd.PyLayer): + @staticmethod + def forward(ctx, x): + y = paddle.nn.functional.tanh(x=x) + ctx.save_for_backward(x, y) + return y + + @staticmethod + def backward(ctx, dy): + x, y = ctx.saved_tensor() + grad = y + dy + 1 + return grad +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.set_materialize_grads.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.set_materialize_grads.md new file mode 100644 index 00000000000..0b27f929aad --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.function.FunctionCtx.set_materialize_grads.md @@ -0,0 +1,43 @@ +## [ 仅 API 调用方式不一致 ]torch.autograd.function.FunctionCtx.set_materialize_grads + +### [torch.autograd.function.FunctionCtx.set_materialize_grads](https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.html#torch.autograd.function.FunctionCtx.set_materialize_grads) + +```python +torch.autograd.function.FunctionCtx.set_materialize_grads(value) +``` + +### [paddle.autograd.PyLayerContext.set_materialize_grads](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/PyLayerContext/set_materialize_grads_cn.html#paddle/autograd/PyLayerContext/set_materialize_grads_cn#cn-api-paddle-autograd-PyLayerContext-set_materialize_grads) + +```python +paddle.autograd.PyLayerContext.set_materialize_grads(value) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class cus_tanh(torch.autograd.Function): + @staticmethod + def forward(ctx, x): + ctx.set_materialize_grads(False) + return x + x + x, x + x + + @staticmethod + def backward(ctx, grad, grad2): + assert grad2 == None + return grad + +# Paddle 写法 +class cus_tanh(paddle.autograd.PyLayer): + @staticmethod + def forward(ctx, x): + ctx.set_materialize_grads(False) + return x + x + x, x + x + + @staticmethod + def backward(ctx, grad, grad2): + assert grad2 == None + return grad +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.grad_mode.set_grad_enabled.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.grad_mode.set_grad_enabled.md new file mode 100644 index 00000000000..c246e3ea2a2 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.grad_mode.set_grad_enabled.md @@ -0,0 +1,27 @@ +## [ 仅 API 调用方式不一致 ]torch.autograd.grad_mode.set_grad_enabled + +### [torch.autograd.grad_mode.set_grad_enabled](https://pytorch.org/docs/stable/generated/torch.autograd.grad_mode.html#torch.autograd.grad_mode.set_grad_enabled) + +```python +torch.autograd.grad_mode.set_grad_enabled(mode) +``` + +### [paddle.set_grad_enabled](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/set_grad_enabled_cn.html#paddle/set_grad_enabled_cn#cn-api-paddle-set_grad_enabled) + +```python +paddle.set_grad_enabled(mode) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +with torch.autograd.grad_mode.set_grad_enabled(is_train): + y = x * 2 + +# Paddle 写法 +with paddle.set_grad_enabled(is_train): + y = x * 2 +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.graph.saved_tensors_hooks.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.graph.saved_tensors_hooks.md new file mode 100644 index 00000000000..d99c7189205 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.autograd.graph.saved_tensors_hooks.md @@ -0,0 +1,27 @@ +## [ 仅 API 调用方式不一致 ]torch.autograd.graph.saved_tensors_hooks + +### [torch.autograd.graph.saved_tensors_hooks](https://pytorch.org/docs/stable/generated/torch.autograd.graph.html#torch.autograd.graph.saved_tensors_hooks) + +```python +torch.autograd.graph.saved_tensors_hooks(pack_hook, unpack_hook) +``` + +### [paddle.autograd.saved_tensors_hooks](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/autograd/saved_tensors_hooks_cn.html#paddle/autograd/saved_tensors_hooks_cn#cn-api-paddle-autograd-saved_tensors_hooks) + +```python +paddle.autograd.saved_tensors_hooks(pack_hook, unpack_hook) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +with torch.autograd.graph.saved_tensors_hooks(pack_hook, unpack_hook): + y = torch.mul(a, b) + +# Paddle 写法 +with paddle.autograd.saved_tensors_hooks(pack_hook, unpack_hook): + y = paddle.mul(a, b) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.backends.cuda.is_built.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.backends.cuda.is_built.md new file mode 100644 index 00000000000..2487d9c57cb --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.backends.cuda.is_built.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.backends.cuda.is_built + +### [torch.backends.cuda.is_built](https://pytorch.org/docs/stable/generated/torch.backends.cuda.html#torch.backends.cuda.is_built) + +```python +torch.backends.cuda.is_built() +``` + +### [paddle.device.is_compiled_with_cuda](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/is_compiled_with_cuda_cn.html#paddle/device/is_compiled_with_cuda_cn#cn-api-paddle-device-is_compiled_with_cuda) + +```python +paddle.device.is_compiled_with_cuda() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.backends.cuda.is_built() + +# Paddle 写法 +result = paddle.device.is_compiled_with_cuda() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.backends.cudnn.version.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.backends.cudnn.version.md new file mode 100644 index 00000000000..ef3ae4ef111 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.backends.cudnn.version.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.backends.cudnn.version + +### [torch.backends.cudnn.version](https://pytorch.org/docs/stable/generated/torch.backends.cudnn.html#torch.backends.cudnn.version) + +```python +torch.backends.cudnn.version() +``` + +### [paddle.device.get_cudnn_version](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/get_cudnn_version_cn.html#paddle/device/get_cudnn_version_cn#cn-api-paddle-device-get_cudnn_version) + +```python +paddle.device.get_cudnn_version() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.backends.cudnn.version() + +# Paddle 写法 +result = paddle.device.get_cudnn_version() + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cpu.current_device.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cpu.current_device.md new file mode 100644 index 00000000000..9067e2b2ce4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cpu.current_device.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.cpu.current_device + +### [torch.cpu.current_device](https://pytorch.org/docs/stable/generated/torch.cpu.html#torch.cpu.current_device) + +```python +torch.cpu.current_device() +``` + +### [paddle.get_device](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/get_device_cn.html#paddle/get_device_cn#cn-api-paddle-get_device) + +```python +paddle.get_device() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cpu.current_device() + +# Paddle 写法 +result = paddle.get_device() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.Event.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.Event.md similarity index 61% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.Event.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.Event.md index 91089728d97..63ab7639d36 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.cuda.Event.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.Event.md @@ -1,12 +1,25 @@ ## [ 仅 API 调用方式不一致 ]torch.cuda.Event + ### [torch.cuda.Event](https://pytorch.org/docs/stable/generated/torch.cuda.Event.html#torch.cuda.Event) + ```python torch.cuda.Event(enable_timing=False, blocking=False, interprocess=False) ``` -### [paddle.device.cuda.Event](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/Event_cn.html) +### [paddle.device.cuda.Event](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/Event_cn.html#paddle/device/cuda/Event_cn#cn-api-paddle-device-cuda-Event) + ```python paddle.device.cuda.Event(enable_timing=False, blocking=False, interprocess=False) ``` -功能一致,参数完全一致,具体如下: +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cuda.Event(enable_timing=True) + +# Paddle 写法 +result = paddle.device.cuda.Event(enable_timing=True) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.StreamContext.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.StreamContext.md new file mode 100644 index 00000000000..b84878e5b90 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.StreamContext.md @@ -0,0 +1,27 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.StreamContext + +### [torch.cuda.StreamContext](https://pytorch.org/docs/stable/generated/torch.cuda.StreamContext.html#torch.cuda.StreamContext) + +```python +torch.cuda.StreamContext(stream) +``` + +### [paddle.device.stream_guard](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/stream_guard_cn.html#paddle/device/stream_guard_cn#cn-api-paddle-device-stream_guard) + +```python +paddle.device.stream_guard(stream) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +with torch.cuda.StreamContext(stream=s1): + result = a + b + +# Paddle 写法 +with paddle.device.stream_guard(stream=s1): + result = a + b +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.get_device_name.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.get_device_name.md new file mode 100644 index 00000000000..c96c63d9617 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.get_device_name.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.get_device_name + +### [torch.cuda.get_device_name](https://pytorch.org/docs/stable/generated/torch.cuda.get_device_name.html#torch.cuda.get_device_name) + +```python +torch.cuda.get_device_name(device) +``` + +### [paddle.device.cuda.get_device_name](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/get_device_name_cn.html#paddle/device/cuda/get_device_name_cn#cn-api-paddle-device-cuda-get_device_name) + +```python +paddle.device.cuda.get_device_name(device) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cuda.get_device_name(current_device) + +# Paddle 写法 +result = paddle.device.cuda.get_device_name(current_device) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.get_rng_state_all.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.get_rng_state_all.md new file mode 100644 index 00000000000..f5039d37f1a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.get_rng_state_all.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.get_rng_state_all + +### [torch.cuda.get_rng_state_all](https://pytorch.org/docs/stable/generated/torch.cuda.get_rng_state_all.html#torch.cuda.get_rng_state_all) + +```python +torch.cuda.get_rng_state_all() +``` + +### [paddle.get_rng_state](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/get_rng_state_cn.html#paddle/get_rng_state_cn#cn-api-paddle-get_rng_state) + +```python +paddle.get_rng_state(device=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cuda.get_rng_state_all() + +# Paddle 写法 +result = paddle.get_rng_state() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.manual_seed.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.manual_seed.md new file mode 100644 index 00000000000..8df630e5af6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.manual_seed.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.manual_seed + +### [torch.cuda.manual_seed](https://pytorch.org/docs/stable/generated/torch.cuda.manual_seed.html#torch.cuda.manual_seed) + +```python +torch.cuda.manual_seed(seed) +``` + +### [paddle.seed](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/seed_cn.html#paddle/seed_cn#cn-api-paddle-seed) + +```python +paddle.seed(seed) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +torch.cuda.manual_seed(123) + +# Paddle 写法 +paddle.seed(123) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.max_memory_allocated.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.max_memory_allocated.md new file mode 100644 index 00000000000..c42af001279 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.max_memory_allocated.md @@ -0,0 +1,24 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.max_memory_allocated + +### [torch.cuda.max_memory_allocated](https://pytorch.org/docs/stable/generated/torch.cuda.max_memory_allocated.html#torch.cuda.max_memory_allocated) + +```python +torch.cuda.max_memory_allocated(device=None) +``` +### [paddle.device.cuda.max_memory_allocated](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/max_memory_allocated_cn.html#paddle/device/cuda/max_memory_allocated_cn#cn-api-paddle-device-cuda-max_memory_allocated) + +```python +paddle.device.cuda.max_memory_allocated(device=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cuda.max_memory_allocated() + +# Paddle 写法 +result = paddle.device.cuda.max_memory_allocated() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.max_memory_reserved.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.max_memory_reserved.md new file mode 100644 index 00000000000..6d2124a8c15 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.max_memory_reserved.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.max_memory_reserved + +### [torch.cuda.max_memory_reserved](https://pytorch.org/docs/stable/generated/torch.cuda.max_memory_reserved.html#torch.cuda.max_memory_reserved) + +```python +torch.cuda.max_memory_reserved(device=None) +``` + +### [paddle.device.cuda.max_memory_reserved](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/max_memory_reserved_cn.html#paddle/device/cuda/max_memory_reserved_cn#cn-api-paddle-device-cuda-max_memory_reserved) + +```python +paddle.device.cuda.max_memory_reserved(device=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cuda.max_memory_reserved() + +# Paddle 写法 +result = paddle.device.cuda.max_memory_reserved() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.nvtx.range_pop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.nvtx.range_pop.md new file mode 100644 index 00000000000..76200f4aa84 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.nvtx.range_pop.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.nvtx.range_pop + +### [torch.cuda.nvtx.range_pop](https://pytorch.org/docs/stable/generated/torch.cuda.nvtx.range_pop.html#torch.cuda.nvtx.range_pop) + +```python +torch.cuda.nvtx.range_pop() +``` + +### [paddle.core.nvprof_nvtx_pop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/framework/core/nvprof_nvtx_pop_cn.html#paddle/core/nvprof_nvtx_pop_cn#cn-api-paddle-core-nvprof_nvtx_pop) + +```python +paddle.core.nvprof_nvtx_pop() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cuda.nvtx.range_pop() + +# Paddle 写法 +result = paddle.core.nvprof_nvtx_pop() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.reset_max_memory_allocated.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.reset_max_memory_allocated.md new file mode 100644 index 00000000000..987b230acf3 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.reset_max_memory_allocated.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.reset_max_memory_allocated + +### [torch.cuda.reset_max_memory_allocated](https://pytorch.org/docs/stable/generated/torch.cuda.reset_max_memory_allocated.html#torch.cuda.reset_max_memory_allocated) + +```python +torch.cuda.reset_max_memory_allocated(device=None) +``` + +### [paddle.device.cuda.reset_max_memory_allocated](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/reset_max_memory_allocated_cn.html#paddle/device/cuda/reset_max_memory_allocated_cn#cn-api-paddle-device-cuda-reset_max_memory_allocated) + +```python +paddle.device.cuda.reset_max_memory_allocated(device=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cuda.reset_max_memory_allocated() + +# Paddle 写法 +result = paddle.device.cuda.reset_max_memory_allocated() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.reset_max_memory_cached.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.reset_max_memory_cached.md new file mode 100644 index 00000000000..76c47040abf --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.reset_max_memory_cached.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.reset_max_memory_cached + +### [torch.cuda.reset_max_memory_cached](https://pytorch.org/docs/stable/generated/torch.cuda.reset_max_memory_cached.html#torch.cuda.reset_max_memory_cached) + +```python +torch.cuda.reset_max_memory_cached(device=None) +``` + +### [paddle.device.cuda.reset_max_memory_reserved](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/cuda/reset_max_memory_reserved_cn.html#paddle/device/cuda/reset_max_memory_reserved_cn#cn-api-paddle-device-cuda-reset_max_memory_reserved) + +```python +paddle.device.cuda.reset_max_memory_reserved(device=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cuda.reset_max_memory_cached() + +# Paddle 写法 +result = paddle.device.cuda.reset_max_memory_reserved() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.set_stream.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.set_stream.md new file mode 100644 index 00000000000..4b151ae4c10 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.set_stream.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.set_stream + +### [torch.cuda.set_stream](https://pytorch.org/docs/stable/generated/torch.cuda.set_stream.html#torch.cuda.set_stream) + +```python +torch.cuda.set_stream(stream) +``` + +### [paddle.device.set_stream](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/set_stream_cn.html#paddle/device/set_stream_cn#cn-api-paddle-device-set_stream) + +```python +paddle.device.set_stream(stream) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.cuda.set_stream(stream) + +# Paddle 写法 +result = paddle.device.set_stream(stream) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.stream.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.stream.md new file mode 100644 index 00000000000..e4d7534d312 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.cuda.stream.md @@ -0,0 +1,28 @@ +## [ 仅 API 调用方式不一致 ]torch.cuda.stream + +### [torch.cuda.stream](https://pytorch.org/docs/stable/generated/torch.cuda.stream.html#torch.cuda.stream) + +```python +torch.cuda.stream(stream) +``` + +### [paddle.device.stream_guard](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/device/stream_guard_cn.html#paddle/device/stream_guard_cn#cn-api-paddle-device-stream_guard) + +```python +paddle.device.stream_guard(stream) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +with torch.cuda.stream(stream=s): + result = data1 + data2 + +# Paddle 写法 +with paddle.device.stream_guard(stream=s): + result = data1 + data2 + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributed.ReduceOp.PRODUCT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributed.ReduceOp.PRODUCT.md new file mode 100644 index 00000000000..5f4c8d86a84 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributed.ReduceOp.PRODUCT.md @@ -0,0 +1,37 @@ +## [ 仅 API 调用方式不一致 ]torch.distributed.ReduceOp.PRODUCT + +### [torch.distributed.ReduceOp.PRODUCT](https://pytorch.org/docs/stable/distributed.html#torch.distributed.ReduceOp.PRODUCT) + +```python +torch.distributed.ReduceOp.PRODUCT +``` + +### [paddle.distributed.ReduceOp.PROD](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/distributed/ReduceOp/PROD_cn.html#paddle/distributed/ReduceOp/PROD_cn#cn-api-paddle-distributed-ReduceOp-PROD) + +```python +paddle.distributed.ReduceOp.PROD +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +torch.distributed.reduce_scatter( + data1, + [data1, data2], + op=torch.distributed.ReduceOp.PRODUCT, + group=None, + async_op=False +) + +# Paddle 写法 +paddle.distributed.reduce_scatter( + tensor=data1, + tensor_list=[data1, data2], + op=paddle.distributed.ReduceOp.PROD, + group=None, + sync_op=not False, +) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributed.ReduceOp.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributed.ReduceOp.md new file mode 100644 index 00000000000..cd276737220 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributed.ReduceOp.md @@ -0,0 +1,27 @@ +## [ 仅 API 调用方式不一致 ]torch.distributed.ReduceOp + +### [torch.distributed.ReduceOp](https://pytorch.org/docs/stable/generated/torch.distributed.ReduceOp.html#torch.distributed.ReduceOp) + +```python +torch.distributed.ReduceOp +``` + +### [paddle.distributed.ReduceOp](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/distributed/ReduceOp_cn.html#paddle/distributed/ReduceOp_cn#cn-api-paddle-distributed-ReduceOp) + +```python +paddle.distributed.ReduceOp +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +torch.distributed.init_process_group(backend="nccl") +print(torch.distributed.ReduceOp) + +# Paddle 写法 +paddle.distributed.init_parallel_env() +print(paddle.distributed.ReduceOp) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributed.is_nccl_available.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributed.is_nccl_available.md new file mode 100644 index 00000000000..25b4fe80f51 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributed.is_nccl_available.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.distributed.is_nccl_available + +### [torch.distributed.is_nccl_available](https://pytorch.org/docs/stable/distributed.html#torch.distributed.is_nccl_available) + +```python +torch.distributed.is_nccl_available() +``` + +### [paddle.core.is_compiled_with_nccl](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/core/is_compiled_with_nccl_cn.html#paddle/core/is_compiled_with_nccl_cn#cn-api-paddle-core-is_compiled_with_nccl) + +```python +paddle.core.is_compiled_with_nccl() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.distributed.is_nccl_available() + +# Paddle 写法 +result = paddle.core.is_compiled_with_nccl() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributions.constraints.Constraint.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributions.constraints.Constraint.md new file mode 100644 index 00000000000..5d9150f4274 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributions.constraints.Constraint.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.distributions.constraints.Constraint + +### [torch.distributions.constraints.Constraint](https://pytorch.org/docs/stable/generated/torch.distributions.constraints.Constraint.html#torch.distributions.constraints.Constraint) + +```python +torch.distributions.constraints.Constraint(*args, **kwargs) +``` + +### [paddle.distribution.constraint.Constraint](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/distribution/constraint/Constraint_cn.html#paddle/distribution/constraint/Constraint_cn#cn-api-paddle-distribution-constraint-Constraint) + +```python +paddle.distribution.constraint.Constraint(*args, **kwargs) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.distributions.constraints.Constraint().check(1) + +# Paddle 写法 +result = paddle.distribution.constraint.Constraint().check(1) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributions.distribution.Distribution.log_prob.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributions.distribution.Distribution.log_prob.md new file mode 100644 index 00000000000..51bad4ffe2e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributions.distribution.Distribution.log_prob.md @@ -0,0 +1,27 @@ +## [ 仅 API 调用方式不一致 ]torch.distributions.distribution.Distribution.log_prob + +### [torch.distributions.distribution.Distribution.log_prob](https://pytorch.org/docs/stable/generated/torch.distributions.distribution.Distribution.html#torch.distributions.distribution.Distribution.log_prob) + +```python +torch.distributions.distribution.Distribution.log_prob(value) +``` + +### [paddle.distribution.Distribution.log_prob](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/distribution/Distribution/log_prob_cn.html#paddle/distribution/Distribution/log_prob_cn#cn-api-paddle-distribution-Distribution-log_prob) + +```python +paddle.distribution.Distribution.log_prob(value) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +uniform = torch.distributions.Uniform(0.0, 1.0) +result = uniform.log_prob(torch.tensor(0.3)) + +# Paddle 写法 +uniform = paddle.distribution.Uniform(0.0, 1.0) +result = uniform.log_prob(paddle.to_tensor(0.3)) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributions.kl.kl_divergence.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributions.kl.kl_divergence.md new file mode 100644 index 00000000000..dd12d031c11 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.distributions.kl.kl_divergence.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.distributions.kl.kl_divergence + +### [torch.distributions.kl.kl_divergence](https://pytorch.org/docs/stable/generated/torch.distributions.kl.html#torch.distributions.kl.kl_divergence) + +```python +torch.distributions.kl.kl_divergence(p, q) +``` + +### [paddle.distribution.kl_divergence](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/distribution/kl_divergence_cn.html#paddle/distribution/kl_divergence_cn#cn-api-paddle-distribution-kl_divergence) + +```python +paddle.distribution.kl_divergence(p, q) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.distributions.kl.kl_divergence(m, n) + +# Paddle 写法 +result = paddle.distribution.kl_divergence(m, n) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.is_inference.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.is_inference.md new file mode 100644 index 00000000000..d20d4a1b7a7 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.is_inference.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.is_inference + +### [torch.is_inference](https://pytorch.org/docs/stable/generated/torch.is_inference.html) + +```python +torch.is_inference(input) +``` + +### [paddle.Tensor.stop_gradient](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/stop_gradient_cn.html#paddle/Tensor/stop_gradient_cn#cn-api-paddle-Tensor-stop_gradient) + +```python +paddle.Tensor.stop_gradient +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.is_inference(x) + +# Paddle 写法 +result = x.stop_gradient +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.max.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.max.md new file mode 100644 index 00000000000..384ef3efaf4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.max.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.max + +### [torch.max](https://pytorch.org/docs/stable/generated/torch.max.html) + +```python +torch.max(*args, **kwargs) +``` + +### [paddle.compat.max](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/compat/max_cn.html#paddle/compat/max_cn#cn-api-paddle-compat-max) + +```python +paddle.compat.max(*args, **kwargs) +``` + +torch.max 有多种签名与用法,均只需修改 torch 前缀为 paddle.compat,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.max(x) + +# Paddle 写法 +result = paddle.compat.max(x) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.median.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.median.md new file mode 100644 index 00000000000..a0ce0e54988 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.median.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.median + +### [torch.median](https://pytorch.org/docs/stable/generated/torch.median.html) + +```python +torch.median(*args, **kwargs) +``` + +### [paddle.compat.median](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/compat/median_cn.html#paddle/compat/median_cn#cn-api-paddle-compat-median) + +```python +paddle.compat.median(*args, **kwargs) +``` + +torch.median 有多种签名与用法,均只需修改 torch 前缀为 paddle.compat,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.median(input) + +# Paddle 写法 +result = paddle.compat.median(input) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.min.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.min.md new file mode 100644 index 00000000000..c1a3b9307d5 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.min.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.min + +### [torch.min](https://pytorch.org/docs/stable/generated/torch.min.html) + +```python +torch.min(*args, **kwargs) +``` + +### [paddle.compat.min](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/compat/min_cn.html#paddle/compat/min_cn#cn-api-paddle-compat-min) + +```python +paddle.compat.min(*args, **kwargs) +``` + +torch.min 有多种签名与用法,均只需修改 torch 前缀为 paddle.compat,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.min(x) + +# Paddle 写法 +result = paddle.compat.min(x) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nanmedian.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nanmedian.md new file mode 100644 index 00000000000..5f05cb92349 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nanmedian.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.nanmedian + +### [torch.nanmedian](https://pytorch.org/docs/stable/generated/torch.nanmedian.html) + +```python +torch.nanmedian(*args, **kwargs) +``` + +### [paddle.compat.nanmedian](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/compat/nanmedian_cn.html#paddle/compat/nanmedian_cn#cn-api-paddle-compat-nanmedian) + +```python +paddle.compat.nanmedian(*args, **kwargs) +``` + +torch.namedian 有多种签名与用法,均只需修改 torch 前缀为 paddle.compat,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.nanmedian(input) + +# Paddle 写法 +result = paddle.compat.nanmedian(input) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.AdaptiveAvgPool1d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.AdaptiveAvgPool1d.md new file mode 100644 index 00000000000..ba5e32ad431 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.AdaptiveAvgPool1d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.AdaptiveAvgPool1d + +### [torch.nn.AdaptiveAvgPool1d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool1d.html#torch.nn.AdaptiveAvgPool1d) + +```python +torch.nn.AdaptiveAvgPool1d(output_size) +``` + +### [paddle.nn.AdaptiveAvgPool1D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/AdaptiveAvgPool1D_cn.html#paddle/nn/AdaptiveAvgPool1D_cn#cn-api-paddle-nn-AdaptiveAvgPool1D) + +```python +paddle.nn.AdaptiveAvgPool1D(output_size, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.AdaptiveAvgPool1d(5) + +# Paddle 写法 +model = paddle.nn.AdaptiveAvgPool1D(5) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.AdaptiveAvgPool2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.AdaptiveAvgPool2d.md new file mode 100644 index 00000000000..77cd446bdf8 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.AdaptiveAvgPool2d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.AdaptiveAvgPool2d + +### [torch.nn.AdaptiveAvgPool2d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool2d.html#torch.nn.AdaptiveAvgPool2d) + +```python +torch.nn.AdaptiveAvgPool2d(output_size) +``` + +### [paddle.nn.AdaptiveAvgPool2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/AdaptiveAvgPool2D_cn.html#paddle/nn/AdaptiveAvgPool2D_cn#cn-api-paddle-nn-AdaptiveAvgPool2D) + +```python +paddle.nn.AdaptiveAvgPool2D(output_size, data_format="NCHW", name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.AdaptiveAvgPool2d(5) + +# Paddle 写法 +model = paddle.nn.AdaptiveAvgPool2D(5) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.AdaptiveAvgPool3d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.AdaptiveAvgPool3d.md new file mode 100644 index 00000000000..d60017ce4e4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.AdaptiveAvgPool3d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.AdaptiveAvgPool3d + +### [torch.nn.AdaptiveAvgPool3d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool3d.html#torch.nn.AdaptiveAvgPool3d) + +```python +torch.nn.AdaptiveAvgPool3d(output_size) +``` + +### [paddle.nn.AdaptiveAvgPool3D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/AdaptiveAvgPool3D_cn.html#paddle/nn/AdaptiveAvgPool3D_cn#cn-api-paddle-nn-AdaptiveAvgPool3D) + +```python +paddle.nn.AdaptiveAvgPool3D(output_size, data_format="NCDHW", name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.AdaptiveAvgPool3d(1) + +# Paddle 写法 +model = paddle.nn.AdaptiveAvgPool3D(1) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.HuberLoss.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.HuberLoss.md similarity index 54% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.HuberLoss.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.HuberLoss.md index 0d9bf858ff6..50016a891a6 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.nn.HuberLoss.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.HuberLoss.md @@ -1,12 +1,25 @@ ## [ 仅 API 调用方式不一致 ]torch.nn.HuberLoss + ### [torch.nn.HuberLoss](https://pytorch.org/docs/stable/generated/torch.nn.HuberLoss.html#torch.nn.HuberLoss) + ```python torch.nn.HuberLoss(reduction='mean', delta=1.0) ``` -### [paddle.nn.SmoothL1Loss](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/SmoothL1Loss_cn.html) +### [paddle.nn.SmoothL1Loss](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/SmoothL1Loss_cn.html#paddle/nn/SmoothL1Loss_cn#cn-api-paddle-nn-SmoothL1Loss) + ```python paddle.nn.SmoothL1Loss(reduction='mean', delta=1.0, name=None) ``` -功能一致,参数完全一致,具体如下: +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +loss = torch.nn.HuberLoss() + +# Paddle 写法 +loss = paddle.nn.SmoothL1Loss() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.MaxUnpool1d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.MaxUnpool1d.md new file mode 100644 index 00000000000..0730bfdd975 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.MaxUnpool1d.md @@ -0,0 +1,24 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.MaxUnpool1d + +### [torch.nn.MaxUnpool1d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool1d.html#torch.nn.MaxUnpool1d) + +```python +torch.nn.MaxUnpool1d(kernel_size, stride=None, padding=0) +``` + +### [paddle.nn.MaxUnPool1D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool1D_cn.html#paddle/nn/MaxUnPool1D_cn#cn-api-paddle-nn-MaxUnPool1D) + +```python +paddle.nn.MaxUnPool1D(kernel_size, stride=None, padding=0, data_format='NCL', output_size=None, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +unpool = torch.nn.MaxUnpool1d(2, 2) +# Paddle 写法) +unpool = paddle.nn.MaxUnPool1D(2, 2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.MaxUnpool2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.MaxUnpool2d.md new file mode 100644 index 00000000000..b6341ca64d9 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.MaxUnpool2d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.MaxUnpool2d + +### [torch.nn.MaxUnpool2d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool2d.html#torch.nn.MaxUnpool2d) + +```python +torch.nn.MaxUnpool2d(kernel_size, stride=None, padding=0) +``` + +### [paddle.nn.MaxUnPool2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool2D_cn.html#paddle/nn/MaxUnPool2D_cn#cn-api-paddle-nn-MaxUnPool2D) + +```python +paddle.nn.MaxUnPool2D(kernel_size, stride=None, padding=0, data_format='NCHW', output_size=None, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +unpool = torch.nn.MaxUnpool2d(2, stride=2) + +# Paddle 写法 +unpool = paddle.nn.MaxUnPool2D(2, stride=2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.MaxUnpool3d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.MaxUnpool3d.md new file mode 100644 index 00000000000..7e6080d9417 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.MaxUnpool3d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.MaxUnpool3d + +### [torch.nn.MaxUnpool3d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool3d.html#torch.nn.MaxUnpool3d) + +```python +torch.nn.MaxUnpool3d(kernel_size, stride=None, padding=0) +``` + +### [paddle.nn.MaxUnPool3D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool3D_cn.html#paddle/nn/MaxUnPool3D_cn#cn-api-paddle-nn-MaxUnPool3D) + +```python +paddle.nn.MaxUnPool3D(kernel_size, stride=None, padding=0, data_format='NCDHW', output_size=None, name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +unpool = torch.nn.MaxUnpool3d(3, stride=2) + +# Paddle 写法 +unpool = paddle.nn.MaxUnPool3D(3, stride=2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.apply.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.apply.md new file mode 100644 index 00000000000..caa662004a4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.apply.md @@ -0,0 +1,36 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.Module.apply + +### [torch.nn.Module.apply](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.apply) + +```python +torch.nn.Module.apply(fn) +``` + +### [paddle.nn.Layer.apply](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer/apply_cn.html#paddle/nn/Layer/apply_cn#cn-api-paddle-nn-Layer-apply) + +```python +paddle.nn.Layer.apply(fn) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +def init_weights(m): + pass +net = torch.nn.Sequential( + torch.nn.Linear(2, 2, bias=False), torch.nn.Linear(2, 2, bias=False) +) +net.apply(init_weights) + +# Paddle 写法 +def init_weights(m): + pass +net = paddle.nn.Sequential( + paddle.nn.Linear(in_features=2, out_features=2, bias_attr=False), + paddle.nn.Linear(in_features=2, out_features=2, bias_attr=False), +) +net.apply(init_weights) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.children.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.children.md new file mode 100644 index 00000000000..7a045d52274 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.children.md @@ -0,0 +1,29 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.Module.children + +### [torch.nn.Module.children](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.children) + +```python +torch.nn.Module.children() +``` + +### [paddle.nn.Layer.children](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer/children_cn.html#paddle/nn/Layer/children_cn#cn-api-paddle-nn-Layer-children) + +```python +paddle.nn.Layer.children() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.Sequential(net1, net2) +for layer in model.children(): + print(layer) + +# Paddle 写法 +model = paddle.nn.Sequential(net1, net2) +for layer in model.children(): + print(layer) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.eval.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.eval.md new file mode 100644 index 00000000000..1f3a502ef15 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.eval.md @@ -0,0 +1,27 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.Module.eval + +### [torch.nn.Module.eval](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.eval) + +```python +torch.nn.Module.eval() +``` + +### [paddle.nn.Layer.eval](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer/eval_cn.html#paddle/nn/Layer/eval_cn#cn-api-paddle-nn-Layer-eval) + +```python +paddle.nn.Layer.eval() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.Linear(10, 10) +model.eval() + +# Paddle 写法 +model = paddle.nn.Linear(10, 10) +model.eval() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.md new file mode 100644 index 00000000000..658d27804d3 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.md @@ -0,0 +1,45 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.Module + +### [torch.nn.Module](https://pytorch.org/docs/stable/generated/torch.nn.Module.html) + +```python +torch.nn.Module(*args, **kwargs) +``` + +### [paddle.nn.Layer](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer_cn.html#paddle/nn/Layer_cn#cn-api-paddle-nn-Layer) + +```python +paddle.nn.Layer(name_scope=None, dtype='float32') +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class MLP(torch.nn.Module): + def __init__(self, input_size, hidden_size, output_size): + super(MLP, self).__init__() + self.fc1 = torch.nn.Linear(input_size, hidden_size) + with torch.no_grad(): + self.fc1.weight.fill_(1.0) + self.fc1.bias.fill_(0.1) + + def forward(self, x): + x = self.fc1(x) + return x + +# Paddle 写法 +class MLP(paddle.nn.Layer): + def __init__(self, input_size, hidden_size, output_size): + super(MLP, self).__init__() + self.fc1 = paddle.nn.Linear(in_features=input_size, out_features=hidden_size) + with paddle.no_grad(): + self.fc1.weight.fill_(1.0) + self.fc1.bias.fill_(0.1) + + def forward(self, x): + x = self.fc1(x) + return x +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.modules.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.modules.md new file mode 100644 index 00000000000..3e0dd9bb523 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.modules.md @@ -0,0 +1,29 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.Module.modules + +### [torch.nn.Module.modules](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.modules) + +```python +torch.nn.Module.modules() +``` + +### [paddle.nn.Layer.sublayers](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer/sublayers_cn.html#paddle/nn/Layer/sublayers_cn#cn-api-paddle-nn-Layer-sublayers) + +```python +paddle.nn.Layer.sublayers(include_self=False) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.Sequential(net1, net2) +for layer in model.modules(): + print(layer) + +# Paddle 写法 +model = paddle.nn.Sequential(net1, net2) +for layer in model.sublayers(): + print(layer) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.named_children.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.named_children.md new file mode 100644 index 00000000000..b63dbef1d97 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Module.named_children.md @@ -0,0 +1,29 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.Module.named_children + +### [torch.nn.Module.named_children](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.named_children) + +```python +torch.nn.Module.named_children() +``` + +### [paddle.nn.Layer.named_children](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer/named_children_cn.html#paddle/nn/Layer/named_children_cn#cn-api-paddle-nn-Layer-named_children) + +```python +paddle.nn.Layer.named_children() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.Sequential(OrderedDict([("wfs", l), ("wfs1", l1)])) +for name, module in model.named_children(): + print(name, module) + +# Paddle 写法 +model = paddle.nn.Sequential(OrderedDict([("wfs", l), ("wfs1", l1)])) +for name, module in model.named_children(): + print(name, module) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Unfold.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Unfold.md new file mode 100644 index 00000000000..1ec08363426 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.Unfold.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.Unfold + +### [torch.nn.Unfold](https://pytorch.org/docs/stable/generated/torch.nn.Unfold.html#torch.nn.Unfold) + +```python +torch.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1) +``` + +### [paddle.compat.nn.Unfold](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/compat/nn/Unfold_cn.html#paddle/compat/nn/Unfold_cn#cn-api-paddle-compat-nn-Unfold) + +```python +paddle.compat.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +unfold = torch.nn.Unfold(kernel_size=(2, 2)) + +# Paddle 写法 +unfold = paddle.compat.nn.Unfold(kernel_size=(2, 2)) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.UpsamplingBilinear2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.UpsamplingBilinear2d.md new file mode 100644 index 00000000000..5370178305b --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.UpsamplingBilinear2d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.UpsamplingBilinear2d + +### [torch.nn.UpsamplingBilinear2d](https://pytorch.org/docs/stable/generated/torch.nn.UpsamplingBilinear2d.html#torch.nn.UpsamplingBilinear2d) + +```python +torch.nn.UpsamplingBilinear2d(size=None, scale_factor=None) +``` + +### [paddle.nn.UpsamplingBilinear2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/UpsamplingBilinear2D_cn.html#paddle/nn/UpsamplingBilinear2D_cn#cn-api-paddle-nn-UpsamplingBilinear2D) + +```python +paddle.nn.UpsamplingBilinear2D(size=None, scale_factor=None, data_format='NCHW', name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.UpsamplingBilinear2d(scale_factor=2) + +# Paddle 写法 +model = paddle.nn.UpsamplingBilinear2D(scale_factor=2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.UpsamplingNearest2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.UpsamplingNearest2d.md new file mode 100644 index 00000000000..59903f373e1 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.UpsamplingNearest2d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.UpsamplingNearest2d + +### [torch.nn.UpsamplingNearest2d](https://pytorch.org/docs/stable/generated/torch.nn.UpsamplingNearest2d.html#torch.nn.UpsamplingNearest2d) + +```python +torch.nn.UpsamplingNearest2d(size=None, scale_factor=None) +``` + +### [paddle.nn.UpsamplingNearest2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/UpsamplingNearest2D_cn.html#paddle/nn/UpsamplingNearest2D_cn#cn-api-paddle-nn-UpsamplingNearest2D) + +```python +paddle.nn.UpsamplingNearest2D(size=None, scale_factor=None, data_format='NCHW', name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.UpsamplingNearest2d(scale_factor=2) + +# Paddle 写法 +model = paddle.nn.UpsamplingNearest2D(scale_factor=2) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.ZeroPad2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.ZeroPad2d.md new file mode 100644 index 00000000000..74f3177ddca --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.ZeroPad2d.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.ZeroPad2d + +### [torch.nn.ZeroPad2d](https://pytorch.org/docs/stable/generated/torch.nn.ZeroPad2d.html#torch.nn.ZeroPad2d) + +```python +torch.nn.ZeroPad2d(padding) +``` + +### [paddle.nn.ZeroPad2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/ZeroPad2D_cn.html#paddle/nn/ZeroPad2D_cn#cn-api-paddle-nn-ZeroPad2D) + +```python +paddle.nn.ZeroPad2D(padding, data_format='NCHW', name=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +model = torch.nn.ZeroPad2d(1) + +# Paddle 写法 +model = paddle.nn.ZeroPad2D(1) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.functional.pad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.functional.pad.md new file mode 100644 index 00000000000..279e4cdce82 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.functional.pad.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.functional.pad + +### [torch.nn.functional.pad](https://pytorch.org/docs/stable/nn.functional.html#torch.nn.functional.pad) + +```python +torch.nn.functional.pad(input, pad, mode="constant", value=None) +``` + +### [paddle.compat.nn.functional.pad](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/compat/nn/functional/pad_cn.html#paddle/compat/nn/pad_cn#cn-api-paddle-compat-nn-pad) + +```python +paddle.compat.nn.functional.pad(input, pad, mode="constant", value=0.0) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.nn.functional.pad(x, [0, 0, 0, 0, 0, 1, 2, 3], value=1) + +# Paddle 写法 +result = paddle.compat.nn.functional.pad(x, [0, 0, 0, 0, 0, 1, 2, 3], value=1) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.functional.softmax.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.functional.softmax.md new file mode 100644 index 00000000000..22a8ac882d2 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.nn.functional.softmax.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.nn.functional.softmax + +### [torch.nn.functional.softmax](https://pytorch.org/docs/stable/nn.functional.html#torch.nn.functional.softmax) + +```python +torch.nn.functional.softmax(input, dim=None, _stacklevel=3, dtype=None) +``` + +### [paddle.compat.nn.functional.softmax](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/compat/nn/functional/softmax_cn.html#paddle/compat/nn/softmax_cn#cn-api-paddle-compat-nn-softmax) + +```python +paddle.compat.nn.functional.softmax(input, dim=None, _stacklevel=3, dtype=None, out=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.nn.functional.softmax(x, -1) + +# Paddle 写法 +result = paddle.compat.nn.functional.softmax(x, -1) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.numel.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.numel.md similarity index 57% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.numel.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.numel.md index 0ba0c9a7736..65083702ccd 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.numel.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.numel.md @@ -1,21 +1,25 @@ ## [ 仅 API 调用方式不一致 ]torch.numel -### [torch.numel](https://pytorch.org/docs/stable/generated/torch.numel.html?highlight=numel#torch.numel) + +### [torch.numel](https://pytorch.org/docs/stable/generated/torch.numel.html) + ```python torch.numel(input) ``` -### [paddle.Tensor.size](https://www.paddlepaddle.org.cn/documentation/docs/guides/beginner/tensor_cn.html#tensor-shape) +### [paddle.Tensor.size](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor/size_cn.html#paddle/Tensor/size_cn#cn-api-paddle-Tensor-size) + ```python paddle.Tensor.size ``` -两者功能一致,均无参数。 +两者功能一致,但调用方式不一致,具体如下: ### 转写示例 + ```python # PyTorch 写法 -torch.numel(x) +result = torch.numel(a) # Paddle 写法 -x.size +result = a.size ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.optim.Optimizer.add_param_group.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.optim.Optimizer.add_param_group.md new file mode 100644 index 00000000000..05aa4edbcf9 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.optim.Optimizer.add_param_group.md @@ -0,0 +1,36 @@ +## [ 仅 API 调用方式不一致 ]torch.optim.Optimizer.add_param_group + +### [torch.optim.Optimizer.add_param_group](https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.html#torch.optim.Optimizer.add_param_group) + +```python +torch.optim.Optimizer.add_param_group(param_group) +``` + +### [paddle.optimizer.Optimizer._add_param_group](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/optimizer/Optimizer/_add_param_group_cn.html#paddle/optimizer/Optimizer/_add_param_group_cn#cn-api-paddle-optimizer-Optimizer-_add_param_group) + +```python +paddle.optimizer.Optimizer._add_param_group(param_group) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +optimizer = torch.optim.SGD(pg1, lr=0.1, momentum=0.9, weight_decay=0.0005) +optimizer.add_param_group({ + 'params': pg2, + 'lr': 0.1 * 2, + 'weight_decay': 0.0 +}) + +# Paddle 写法 +optimizer = paddle.optimizer.SGD(learning_rate=0.1, parameters=pg1, weight_decay=0.0005) +optimizer._add_param_group({ + 'params': pg2, + 'learning_rate': 0.1 * 2, + 'weight_decay': 0.0 +}) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.optim.Optimizer.load_state_dict.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.optim.Optimizer.load_state_dict.md new file mode 100644 index 00000000000..7921324578f --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.optim.Optimizer.load_state_dict.md @@ -0,0 +1,30 @@ +## [ 仅 API 调用方式不一致 ]torch.optim.Optimizer.load_state_dict + +### [torch.optim.Optimizer.load_state_dict](https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.html#torch.optim.Optimizer.load_state_dict) + +```python +torch.optim.Optimizer.load_state_dict(state_dict) +``` + +### [paddle.optimizer.Optimizer.load_state_dict](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/optimizer/Optimizer/load_state_dict_cn.html#paddle/optimizer/Optimizer/load_state_dict_cn#cn-api-paddle-optimizer-Optimizer-load_state_dict) + +```python +paddle.optimizer.Optimizer.load_state_dict(state_dict) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +optim = torch.optim.SGD([theta], lr=1.0) +result = optim.state_dict() +optim.load_state_dict(result) + +# Paddle 写法 +optim = paddle.optimizer.SGD(learning_rate=1.0, parameters=[theta]) +result = optim.state_dict() +optim.load_state_dict(result) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.optim.Optimizer.state_dict.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.optim.Optimizer.state_dict.md new file mode 100644 index 00000000000..bffa352b1c8 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.optim.Optimizer.state_dict.md @@ -0,0 +1,27 @@ +## [ 仅 API 调用方式不一致 ]torch.optim.Optimizer.state_dict + +### [torch.optim.Optimizer.state_dict](https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.html#torch.optim.Optimizer.state_dict) + +```python +torch.optim.Optimizer.state_dict() +``` + +### [paddle.optimizer.Optimizer.state_dict](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/optimizer/Optimizer/state_dict_cn.html#paddle/optimizer/Optimizer/state_dict_cn#cn-api-paddle-optimizer-Optimizer-state_dict) + +```python +paddle.optimizer.Optimizer.state_dict() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +optim = torch.optim.Optimizer([theta], defaults={"learning_rate": 1.0}) +result = optim.state_dict() + +# Paddle 写法 +optim = paddle.optimizer.Optimizer(parameters=[theta], **{"learning_rate": 1.0}) +result = optim.state_dict() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.sort.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.sort.md new file mode 100644 index 00000000000..e3b905bcfb5 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.sort.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.sort + +### [torch.sort](https://pytorch.org/docs/stable/generated/torch.sort.html) + +```python +torch.sort(input, dim=-1, descending=False, *, stable=False, out=None) +``` + +### [paddle.compat.sort](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/compat/sort_cn.html#paddle/compat/sort_cn#cn-api-paddle-compat-sort) + +```python +paddle.compat.sort(input, dim=-1, descending=False, stable=False, out=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.sort(a) + +# Paddle 写法 +result = paddle.compat.sort(a) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.split.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.split.md new file mode 100644 index 00000000000..96707a62103 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.split.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.split + +### [torch.split](https://pytorch.org/docs/stable/generated/torch.split.html) + +```python +torch.split(tensor, split_size_or_sections, dim=0) +``` + +### [paddle.compat.split](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/compat/split_cn.html#paddle/compat/split_cn#cn-api-paddle-compat-split) + +```python +paddle.compat.split(tensor, split_size_or_sections, dim=0) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.split(a, 2) + +# Paddle 写法 +result = paddle.compat.split(a, 2) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.ChainDataset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.ChainDataset.md new file mode 100644 index 00000000000..43fca687c27 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.ChainDataset.md @@ -0,0 +1,29 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.ChainDataset + +### [torch.utils.data.ChainDataset](https://pytorch.org/docs/stable/generated/torch.utils.data.ChainDataset.html#torch.utils.data.ChainDataset) + +```python +torch.utils.data.ChainDataset(datasets) +``` + +### [paddle.io.ChainDataset](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/ChainDataset_cn.html#paddle/io/ChainDataset_cn#cn-api-paddle-io-ChainDataset) + +```python +paddle.io.ChainDataset(datasets) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +dataset = torch.utils.data.ChainDataset( + [MyIterableDataset(start=3, end=7), MyIterableDataset(start=3, end=7)] +) + +# Paddle 写法 +dataset = paddle.io.ChainDataset( + [MyIterableDataset(start=3, end=7), MyIterableDataset(start=3, end=7)] +) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.ConcatDataset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.ConcatDataset.md new file mode 100644 index 00000000000..165bb7e8a2f --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.ConcatDataset.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.ConcatDataset + +### [torch.utils.data.ConcatDataset](https://pytorch.org/docs/stable/generated/torch.utils.data.ConcatDataset.html#torch.utils.data.ConcatDataset) + +```python +torch.utils.data.ConcatDataset(datasets) +``` + +### [paddle.io.ConcatDataset](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/ConcatDataset_cn.html#paddle/io/ConcatDataset_cn#cn-api-paddle-io-ConcatDataset) + +```python +paddle.io.ConcatDataset(datasets) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +dataset = torch.utils.data.ConcatDataset([RandomDataset(2), RandomDataset(2)]) + +# Paddle 写法 +dataset = paddle.io.ConcatDataset([RandomDataset(2), RandomDataset(2)]) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.Dataset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.Dataset.md new file mode 100644 index 00000000000..ebefc5954f6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.Dataset.md @@ -0,0 +1,41 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.Dataset + +### [torch.utils.data.Dataset](https://pytorch.org/docs/stable/generated/torch.utils.data.Dataset.html#torch.utils.data.Dataset) + +```python +torch.utils.data.Dataset(*args, **kwargs) +``` + +### [paddle.io.Dataset](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/Dataset_cn.html#paddle/io/Dataset_cn#cn-api-paddle-io-Dataset) + +```python +paddle.io.Dataset() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class Data(torch.utils.data.Dataset): + def __init__(self): + self.x = [1, 2, 3, 4] + + def __getitem__(self, idx): + return self.x[idx] + + def __len__(self): + return len(self.x) + +# Paddle 写法 +class Data(paddle.io.Dataset): + def __init__(self): + self.x = [1, 2, 3, 4] + + def __getitem__(self, idx): + return self.x[idx] + + def __len__(self): + return len(self.x) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.IterableDataset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.IterableDataset.md new file mode 100644 index 00000000000..372cde708ba --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.IterableDataset.md @@ -0,0 +1,39 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.IterableDataset + +### [torch.utils.data.IterableDataset](https://pytorch.org/docs/stable/generated/torch.utils.data.IterableDataset.html#torch.utils.data.IterableDataset) + +```python +torch.utils.data.IterableDataset(*args, **kwargs) +``` + +### [paddle.io.IterableDataset](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/IterableDataset_cn.html#paddle/io/IterableDataset_cn#cn-api-paddle-io-IterableDataset) + +```python +paddle.io.IterableDataset() +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class MyIterableDataset(torch.utils.data.IterableDataset): + def __init__(self, start, end): + super(MyIterableDataset).__init__() + self.start = start + self.end = end + + def __iter__(self): + return iter(range(self.start, self.end)) + +# Paddle 写法 +class MyIterableDataset(paddle.io.IterableDataset): + def __init__(self, start, end): + super(MyIterableDataset).__init__() + self.start = start + self.end = end + + def __iter__(self): + return iter(range(self.start, self.end)) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.Sampler.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.Sampler.md new file mode 100644 index 00000000000..066473e4f04 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.Sampler.md @@ -0,0 +1,41 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.Sampler + +### [torch.utils.data.Sampler](https://pytorch.org/docs/stable/generated/torch.utils.data.Sampler.html#torch.utils.data.Sampler) + +```python +torch.utils.data.Sampler(data_source) +``` + +### [paddle.io.Sampler](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/Sampler_cn.html#paddle/io/Sampler_cn#cn-api-paddle-io-Sampler) + +```python +paddle.io.Sampler(data_source) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class MySampler(torch.utils.data.Sampler): + def __init__(self, data_source): + self.data_source = data_source + + def __iter__(self): + return iter(range(len(self.data_source))) + + def __len__(self): + return len(self.data_source) + +# Paddle 写法 +class MySampler(paddle.io.Sampler): + def __init__(self, data_source): + super().__init__(data_source) + + def __iter__(self): + return iter(range(len(self.data_source))) + + def __len__(self): + return len(self.data_source) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.SequentialSampler.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.SequentialSampler.md new file mode 100644 index 00000000000..9234427586d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.SequentialSampler.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.SequentialSampler + +### [torch.utils.data.SequentialSampler](https://pytorch.org/docs/stable/generated/torch.utils.data.SequentialSampler.html#torch.utils.data.SequentialSampler) + +```python +torch.utils.data.SequentialSampler(data_source) +``` + +### [paddle.io.SequenceSampler](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/SequenceSampler_cn.html#paddle/io/SequenceSampler_cn#cn-api-paddle-io-SequenceSampler) + +```python +paddle.io.SequenceSampler(data_source) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +s = torch.utils.data.SequentialSampler(MyDataset()) + +# Paddle 写法 +s = paddle.io.SequenceSampler(MyDataset()) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.Subset.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.Subset.md new file mode 100644 index 00000000000..801d7052421 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.Subset.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.Subset + +### [torch.utils.data.Subset](https://pytorch.org/docs/stable/generated/torch.utils.data.Subset.html#torch.utils.data.Subset) + +```python +torch.utils.data.Subset(dataset, indices) +``` + +### [paddle.io.Subset](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/Subset_cn.html#paddle/io/Subset_cn#cn-api-paddle-io-Subset) + +```python +paddle.io.Subset(dataset, indices) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +subset = torch.utils.data.Subset(full_dataset, indices) + +# Paddle 写法 +subset = paddle.io.Subset(full_dataset, indices) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.default_collate.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.default_collate.md new file mode 100644 index 00000000000..84a8356c7a5 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.default_collate.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.default_collate + +### [torch.utils.data.default_collate](https://pytorch.org/docs/stable/data.html#torch.utils.data.default_collate) + +```python +torch.utils.data.default_collate(batch) +``` + +### [paddle.io.dataloader.collate.default_collate_fn](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/dataloader/collate/default_collate_fn_cn.html#paddle/io/dataloader/collate/default_collate_fn_cn#cn-api-paddle-io-dataloader-collate-default_collate_fn) + +```python +paddle.io.dataloader.collate.default_collate_fn(batch) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.tensor(torch.utils.data.default_collate([0, 1, 2, 3])) + +# Paddle 写法 +result = paddle.tensor(paddle.io.dataloader.collate.default_collate_fn([0, 1, 2, 3])) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.get_worker_info.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.get_worker_info.md similarity index 58% rename from docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.get_worker_info.md rename to docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.get_worker_info.md index 56909bc0fc7..a695367ccdb 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_diff_only/torch.utils.data.get_worker_info.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.get_worker_info.md @@ -1,12 +1,25 @@ ## [ 仅 API 调用方式不一致 ]torch.utils.data.get_worker_info + ### [torch.utils.data.get_worker_info](https://pytorch.org/docs/stable/data.html#torch.utils.data.get_worker_info) + ```python torch.utils.data.get_worker_info() ``` -### [paddle.io.get_worker_info](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/get_worker_info_cn.html#get-worker-info) +### [paddle.io.get_worker_info](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/get_worker_info_cn.html#paddle/io/get_worker_info_cn#cn-api-paddle-io-get_worker_info) + ```python paddle.io.get_worker_info() ``` -两者功能一致,无参数。 +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torch.utils.data.get_worker_info() + +# Paddle 写法 +result = paddle.io.get_worker_info() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.random_split.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.random_split.md new file mode 100644 index 00000000000..5fb5d3c2c87 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.utils.data.random_split.md @@ -0,0 +1,47 @@ +## [ 仅 API 调用方式不一致 ]torch.utils.data.random_split + +### [torch.utils.data.random_split](https://pytorch.org/docs/stable/data.html#torch.utils.data.random_split) + +```python +torch.utils.data.random_split(dataset, lengths, generator=) +``` + +### [paddle.io.random_split](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/io/random_split_cn.html#paddle/io/random_split_cn#cn-api-paddle-io-random_split) + +```python +paddle.io.random_split(dataset, lengths, generator=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +class Data(torch.utils.data.Dataset): + def __init__(self): + self.x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + + def __getitem__(self, idx): + return self.x[idx] + + def __len__(self): + return len(self.x) + +data = Data() +datasets = torch.utils.data.random_split(data, [3, 7]) + +# Paddle 写法 +class Data(paddle.io.Dataset): + def __init__(self): + self.x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + + def __getitem__(self, idx): + return self.x[idx] + + def __len__(self): + return len(self.x) + +data = Data() +datasets = paddle.io.random_split(data, [3, 7]) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.io.ImageReadMode.GRAY.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.io.ImageReadMode.GRAY.md new file mode 100644 index 00000000000..74235dadf77 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.io.ImageReadMode.GRAY.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.io.ImageReadMode.GRAY + +### [torchvision.io.ImageReadMode.GRAY](https://pytorch.org/vision/stable/generated/torchvision.io.ImageReadMode.html#torchvision.io.ImageReadMode.GRAY) + +```python +torchvision.io.ImageReadMode.GRAY +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.io.ImageReadMode.GRAY + +## Paddle 写法 +mode = 'gray' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.io.ImageReadMode.RGB.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.io.ImageReadMode.RGB.md new file mode 100644 index 00000000000..5a2359720fd --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.io.ImageReadMode.RGB.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.io.ImageReadMode.RGB + +### [torchvision.io.ImageReadMode.RGB](https://pytorch.org/vision/stable/generated/torchvision.io.ImageReadMode.html#torchvision.io.ImageReadMode.RGB) + +```python +torchvision.io.ImageReadMode.RGB +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.io.ImageReadMode.RGB + +## Paddle 写法 +mode = 'rgb' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.io.ImageReadMode.UNCHANGED.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.io.ImageReadMode.UNCHANGED.md new file mode 100644 index 00000000000..78261db6d63 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.io.ImageReadMode.UNCHANGED.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.io.ImageReadMode.UNCHANGED + +### [torchvision.io.ImageReadMode.UNCHANGED](https://pytorch.org/vision/stable/generated/torchvision.io.ImageReadMode.html#torchvision.io.ImageReadMode.UNCHANGED) + +```python +torchvision.io.ImageReadMode.UNCHANGED +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.io.ImageReadMode.UNCHANGED + +## Paddle 写法 +mode = 'unchanged' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.AlexNet_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.AlexNet_Weights.DEFAULT.md new file mode 100644 index 00000000000..040aa8fa861 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.AlexNet_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.AlexNet_Weights.DEFAULT + +### [torchvision.models.AlexNet_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/AlexNet_Weights.html#torchvision.models.AlexNet_Weights.DEFAULT) + +```python +torchvision.models.AlexNet_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.AlexNet_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.AlexNet_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.AlexNet_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..5b3cf82d113 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.AlexNet_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.AlexNet_Weights.IMAGENET1K_V1 + +### [torchvision.models.AlexNet_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/AlexNet_Weights.html#torchvision.models.AlexNet_Weights.IMAGENET1K_V1) + +```python +torchvision.models.AlexNet_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.AlexNet_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet121_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet121_Weights.DEFAULT.md new file mode 100644 index 00000000000..6075a8d798b --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet121_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.DenseNet121_Weights.DEFAULT + +### [torchvision.models.DenseNet121_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/DenseNet121_Weights.html#torchvision.models.DenseNet121_Weights.DEFAULT) + +```python +torchvision.models.DenseNet121_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.DenseNet121_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet121_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet121_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..d04e4c1cc65 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet121_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.DenseNet121_Weights.IMAGENET1K_V1 + +### [torchvision.models.DenseNet121_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/DenseNet121_Weights.html#torchvision.models.DenseNet121_Weights.IMAGENET1K_V1) + +```python +torchvision.models.DenseNet121_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.DenseNet121_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet161_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet161_Weights.DEFAULT.md new file mode 100644 index 00000000000..913411452e7 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet161_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.DenseNet161_Weights.DEFAULT + +### [torchvision.models.DenseNet161_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/DenseNet161_Weights.html#torchvision.models.DenseNet161_Weights.DEFAULT) + +```python +torchvision.models.DenseNet161_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.DenseNet161_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet161_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet161_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..875ae713b4c --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet161_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.DenseNet161_Weights.IMAGENET1K_V1 + +### [torchvision.models.DenseNet161_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/DenseNet161_Weights.html#torchvision.models.DenseNet161_Weights.IMAGENET1K_V1) + +```python +torchvision.models.DenseNet161_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.DenseNet161_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet169_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet169_Weights.DEFAULT.md new file mode 100644 index 00000000000..dc0a518110d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet169_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.DenseNet169_Weights.DEFAULT + +### [torchvision.models.DenseNet169_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/DenseNet169_Weights.html#torchvision.models.DenseNet169_Weights.DEFAULT) + +```python +torchvision.models.DenseNet169_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.DenseNet169_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet169_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet169_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..3128a54262c --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet169_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.DenseNet169_Weights.IMAGENET1K_V1 + +### [torchvision.models.DenseNet169_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/DenseNet169_Weights.html#torchvision.models.DenseNet169_Weights.IMAGENET1K_V1) + +```python +torchvision.models.DenseNet169_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.DenseNet169_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet201_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet201_Weights.DEFAULT.md new file mode 100644 index 00000000000..8cb282660f4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet201_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.DenseNet201_Weights.DEFAULT + +### [torchvision.models.DenseNet201_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/DenseNet201_Weights.html#torchvision.models.DenseNet201_Weights.DEFAULT) + +```python +torchvision.models.DenseNet201_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.DenseNet201_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet201_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet201_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..8abe95884d6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.DenseNet201_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.DenseNet201_Weights.IMAGENET1K_V1 + +### [torchvision.models.DenseNet201_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/DenseNet201_Weights.html#torchvision.models.DenseNet201_Weights.IMAGENET1K_V1) + +```python +torchvision.models.DenseNet201_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.DenseNet201_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.GoogLeNet_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.GoogLeNet_Weights.DEFAULT.md new file mode 100644 index 00000000000..7d4c9a51ef5 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.GoogLeNet_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.GoogLeNet_Weights.DEFAULT + +### [torchvision.models.GoogLeNet_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/GoogLeNet_Weights.html#torchvision.models.GoogLeNet_Weights.DEFAULT) + +```python +torchvision.models.GoogLeNet_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.GoogLeNet_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.GoogLeNet_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.GoogLeNet_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..d93878e866f --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.GoogLeNet_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.GoogLeNet_Weights.IMAGENET1K_V1 + +### [torchvision.models.GoogLeNet_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/GoogLeNet_Weights.html#torchvision.models.GoogLeNet_Weights.IMAGENET1K_V1) + +```python +torchvision.models.GoogLeNet_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.GoogLeNet_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Inception_V3_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Inception_V3_Weights.DEFAULT.md new file mode 100644 index 00000000000..d7560d9f4a8 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Inception_V3_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.Inception_V3_Weights.DEFAULT + +### [torchvision.models.Inception_V3_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/Inception_V3_Weights.html#torchvision.models.Inception_V3_Weights.DEFAULT) + +```python +torchvision.models.Inception_V3_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.Inception_V3_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Inception_V3_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Inception_V3_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..419ea753712 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Inception_V3_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.Inception_V3_Weights.IMAGENET1K_V1 + +### [torchvision.models.Inception_V3_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/Inception_V3_Weights.html#torchvision.models.Inception_V3_Weights.IMAGENET1K_V1) + +```python +torchvision.models.Inception_V3_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.Inception_V3_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V2_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V2_Weights.DEFAULT.md new file mode 100644 index 00000000000..1f3c5cd2d9d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V2_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.MobileNet_V2_Weights.DEFAULT + +### [torchvision.models.MobileNet_V2_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/MobileNet_V2_Weights.html#torchvision.models.MobileNet_V2_Weights.DEFAULT) + +```python +torchvision.models.MobileNet_V2_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.MobileNet_V2_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..9ceb12882de --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V1 + +### [torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/MobileNet_V2_Weights.html#torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V1) + +```python +torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V2.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V2.md new file mode 100644 index 00000000000..c90e7d79aef --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V2.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V2 + +### [torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V2](https://pytorch.org/vision/stable/models/generated/MobileNet_V2_Weights.html#torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V2) + +```python +torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V2 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.MobileNet_V2_Weights.IMAGENET1K_V2 + +## Paddle 写法 +mode = 'IMAGENET1K_V2' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Large_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Large_Weights.DEFAULT.md new file mode 100644 index 00000000000..e50320a0f1d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Large_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.MobileNet_V3_Large_Weights.DEFAULT + +### [torchvision.models.MobileNet_V3_Large_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/MobileNet_V3_Large_Weights.html#torchvision.models.MobileNet_V3_Large_Weights.DEFAULT) + +```python +torchvision.models.MobileNet_V3_Large_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.MobileNet_V3_Large_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..295e0e06d3b --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V1 + +### [torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/MobileNet_V3_Large_Weights.html#torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V1) + +```python +torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V2.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V2.md new file mode 100644 index 00000000000..a6e2de2b12a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V2.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V2 + +### [torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V2](https://pytorch.org/vision/stable/models/generated/MobileNet_V3_Large_Weights.html#torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V2) + +```python +torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V2 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.MobileNet_V3_Large_Weights.IMAGENET1K_V2 + +## Paddle 写法 +mode = 'IMAGENET1K_V2' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Small_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Small_Weights.DEFAULT.md new file mode 100644 index 00000000000..183050759ee --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Small_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.MobileNet_V3_Small_Weights.DEFAULT + +### [torchvision.models.MobileNet_V3_Small_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/MobileNet_V3_Small_Weights.html#torchvision.models.MobileNet_V3_Small_Weights.DEFAULT) + +```python +torchvision.models.MobileNet_V3_Small_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.MobileNet_V3_Small_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..52d3b9e2552 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V1 + +### [torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/MobileNet_V3_Small_Weights.html#torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V1) + +```python +torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V2.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V2.md new file mode 100644 index 00000000000..9203330a6e2 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V2.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V2 + +### [torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V2](https://pytorch.org/vision/stable/models/generated/MobileNet_V3_Small_Weights.html#torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V2) + +```python +torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V2 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.MobileNet_V3_Small_Weights.IMAGENET1K_V2 + +## Paddle 写法 +mode = 'IMAGENET1K_V2' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNeXt50_32X4D_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNeXt50_32X4D_Weights.DEFAULT.md new file mode 100644 index 00000000000..9b1451d18b9 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNeXt50_32X4D_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNeXt50_32X4D_Weights.DEFAULT + +### [torchvision.models.ResNeXt50_32X4D_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ResNeXt50_32X4D_Weights.html#torchvision.models.ResNeXt50_32X4D_Weights.DEFAULT) + +```python +torchvision.models.ResNeXt50_32X4D_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNeXt50_32X4D_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..e9aa71b9ad6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V1 + +### [torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ResNeXt50_32X4D_Weights.html#torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V2.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V2.md new file mode 100644 index 00000000000..4e0bf904c3e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V2.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V2 + +### [torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V2](https://pytorch.org/vision/stable/models/generated/ResNeXt50_32X4D_Weights.html#torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V2) + +```python +torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V2 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNeXt50_32X4D_Weights.IMAGENET1K_V2 + +## Paddle 写法 +mode = 'IMAGENET1K_V2' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_64x4d_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_64x4d_Weights.DEFAULT.md new file mode 100644 index 00000000000..64fc5b43a67 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_64x4d_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet101_64x4d_Weights.DEFAULT + +### [torchvision.models.ResNet101_64x4d_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ResNet101_64x4d_Weights.html#torchvision.models.ResNet101_64x4d_Weights.DEFAULT) + +```python +torchvision.models.ResNet101_64x4d_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet101_64x4d_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_64x4d_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_64x4d_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..a5bef529871 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_64x4d_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet101_64x4d_Weights.IMAGENET1K_V1 + +### [torchvision.models.ResNet101_64x4d_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ResNet101_64x4d_Weights.html#torchvision.models.ResNet101_64x4d_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ResNet101_64x4d_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet101_64x4d_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_Weights.DEFAULT.md new file mode 100644 index 00000000000..3557973de1b --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet101_Weights.DEFAULT + +### [torchvision.models.ResNet101_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ResNet101_Weights.html#torchvision.models.ResNet101_Weights.DEFAULT) + +```python +torchvision.models.ResNet101_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet101_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..207b4f7bf6e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet101_Weights.IMAGENET1K_V1 + +### [torchvision.models.ResNet101_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ResNet101_Weights.html#torchvision.models.ResNet101_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ResNet101_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet101_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_Weights.IMAGENET1K_V2.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_Weights.IMAGENET1K_V2.md new file mode 100644 index 00000000000..ac4e1ad3934 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet101_Weights.IMAGENET1K_V2.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet101_Weights.IMAGENET1K_V2 + +### [torchvision.models.ResNet101_Weights.IMAGENET1K_V2](https://pytorch.org/vision/stable/models/generated/ResNet101_Weights.html#torchvision.models.ResNet101_Weights.IMAGENET1K_V2) + +```python +torchvision.models.ResNet101_Weights.IMAGENET1K_V2 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet101_Weights.IMAGENET1K_V2 + +## Paddle 写法 +mode = 'IMAGENET1K_V2' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet152_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet152_Weights.DEFAULT.md new file mode 100644 index 00000000000..a398e104a22 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet152_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet152_Weights.DEFAULT + +### [torchvision.models.ResNet152_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ResNet152_Weights.html#torchvision.models.ResNet152_Weights.DEFAULT) + +```python +torchvision.models.ResNet152_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet152_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet152_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet152_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..999249a856d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet152_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet152_Weights.IMAGENET1K_V1 + +### [torchvision.models.ResNet152_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ResNet152_Weights.html#torchvision.models.ResNet152_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ResNet152_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet152_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet152_Weights.IMAGENET1K_V2.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet152_Weights.IMAGENET1K_V2.md new file mode 100644 index 00000000000..de6a2d053a3 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet152_Weights.IMAGENET1K_V2.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet152_Weights.IMAGENET1K_V2 + +### [torchvision.models.ResNet152_Weights.IMAGENET1K_V2](https://pytorch.org/vision/stable/models/generated/ResNet152_Weights.html#torchvision.models.ResNet152_Weights.IMAGENET1K_V2) + +```python +torchvision.models.ResNet152_Weights.IMAGENET1K_V2 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet152_Weights.IMAGENET1K_V2 + +## Paddle 写法 +mode = 'IMAGENET1K_V2' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet18_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet18_Weights.DEFAULT.md new file mode 100644 index 00000000000..ca30357bcf3 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet18_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet18_Weights.DEFAULT + +### [torchvision.models.ResNet18_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ResNet18_Weights.html#torchvision.models.ResNet18_Weights.DEFAULT) + +```python +torchvision.models.ResNet18_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet18_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet18_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet18_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..690e3f7ef3c --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet18_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet18_Weights.IMAGENET1K_V1 + +### [torchvision.models.ResNet18_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ResNet18_Weights.html#torchvision.models.ResNet18_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ResNet18_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet18_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet34_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet34_Weights.DEFAULT.md new file mode 100644 index 00000000000..042bad78efe --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet34_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet34_Weights.DEFAULT + +### [torchvision.models.ResNet34_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ResNet34_Weights.html#torchvision.models.ResNet34_Weights.DEFAULT) + +```python +torchvision.models.ResNet34_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet34_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet34_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet34_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..6ec77418962 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet34_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet34_Weights.IMAGENET1K_V1 + +### [torchvision.models.ResNet34_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ResNet34_Weights.html#torchvision.models.ResNet34_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ResNet34_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet34_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet50_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet50_Weights.DEFAULT.md new file mode 100644 index 00000000000..bc7d97c2a9e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet50_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet50_Weights.DEFAULT + +### [torchvision.models.ResNet50_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ResNet50_Weights.html#torchvision.models.ResNet50_Weights.DEFAULT) + +```python +torchvision.models.ResNet50_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet50_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet50_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet50_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..5bc41155e2c --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet50_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet50_Weights.IMAGENET1K_V1 + +### [torchvision.models.ResNet50_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ResNet50_Weights.html#torchvision.models.ResNet50_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ResNet50_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet50_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet50_Weights.IMAGENET1K_V2.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet50_Weights.IMAGENET1K_V2.md new file mode 100644 index 00000000000..bf66a9d0644 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ResNet50_Weights.IMAGENET1K_V2.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ResNet50_Weights.IMAGENET1K_V2 + +### [torchvision.models.ResNet50_Weights.IMAGENET1K_V2](https://pytorch.org/vision/stable/models/generated/ResNet50_Weights.html#torchvision.models.ResNet50_Weights.IMAGENET1K_V2) + +```python +torchvision.models.ResNet50_Weights.IMAGENET1K_V2 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ResNet50_Weights.IMAGENET1K_V2 + +## Paddle 写法 +mode = 'IMAGENET1K_V2' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X0_5_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X0_5_Weights.DEFAULT.md new file mode 100644 index 00000000000..239c4ed4e71 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X0_5_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ShuffleNet_V2_X0_5_Weights.DEFAULT + +### [torchvision.models.ShuffleNet_V2_X0_5_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ShuffleNet_V2_X0_5_Weights.html#torchvision.models.ShuffleNet_V2_X0_5_Weights.DEFAULT) + +```python +torchvision.models.ShuffleNet_V2_X0_5_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ShuffleNet_V2_X0_5_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X0_5_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X0_5_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..6745251851f --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X0_5_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ShuffleNet_V2_X0_5_Weights.IMAGENET1K_V1 + +### [torchvision.models.ShuffleNet_V2_X0_5_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ShuffleNet_V2_X0_5_Weights.html#torchvision.models.ShuffleNet_V2_X0_5_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ShuffleNet_V2_X0_5_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ShuffleNet_V2_X0_5_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_0_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_0_Weights.DEFAULT.md new file mode 100644 index 00000000000..ba85442c52f --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_0_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ShuffleNet_V2_X1_0_Weights.DEFAULT + +### [torchvision.models.ShuffleNet_V2_X1_0_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ShuffleNet_V2_X1_0_Weights.html#torchvision.models.ShuffleNet_V2_X1_0_Weights.DEFAULT) + +```python +torchvision.models.ShuffleNet_V2_X1_0_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ShuffleNet_V2_X1_0_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_0_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_0_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..35d211ecc3a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_0_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ShuffleNet_V2_X1_0_Weights.IMAGENET1K_V1 + +### [torchvision.models.ShuffleNet_V2_X1_0_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ShuffleNet_V2_X1_0_Weights.html#torchvision.models.ShuffleNet_V2_X1_0_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ShuffleNet_V2_X1_0_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ShuffleNet_V2_X1_0_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_5_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_5_Weights.DEFAULT.md new file mode 100644 index 00000000000..7a254f6299a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_5_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ShuffleNet_V2_X1_5_Weights.DEFAULT + +### [torchvision.models.ShuffleNet_V2_X1_5_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ShuffleNet_V2_X1_5_Weights.html#torchvision.models.ShuffleNet_V2_X1_5_Weights.DEFAULT) + +```python +torchvision.models.ShuffleNet_V2_X1_5_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ShuffleNet_V2_X1_5_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..804b0197ae4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1 + +### [torchvision.models.ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ShuffleNet_V2_X1_5_Weights.html#torchvision.models.ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X2_0_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X2_0_Weights.DEFAULT.md new file mode 100644 index 00000000000..173732e61cd --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X2_0_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ShuffleNet_V2_X2_0_Weights.DEFAULT + +### [torchvision.models.ShuffleNet_V2_X2_0_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/ShuffleNet_V2_X2_0_Weights.html#torchvision.models.ShuffleNet_V2_X2_0_Weights.DEFAULT) + +```python +torchvision.models.ShuffleNet_V2_X2_0_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ShuffleNet_V2_X2_0_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..709bd4fded4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1 + +### [torchvision.models.ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/ShuffleNet_V2_X2_0_Weights.html#torchvision.models.ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1) + +```python +torchvision.models.ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_0_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_0_Weights.DEFAULT.md new file mode 100644 index 00000000000..22d3fd77ae6 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_0_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.SqueezeNet1_0_Weights.DEFAULT + +### [torchvision.models.SqueezeNet1_0_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/SqueezeNet1_0_Weights.html#torchvision.models.SqueezeNet1_0_Weights.DEFAULT) + +```python +torchvision.models.SqueezeNet1_0_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.SqueezeNet1_0_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_0_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_0_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..958bd467204 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_0_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.SqueezeNet1_0_Weights.IMAGENET1K_V1 + +### [torchvision.models.SqueezeNet1_0_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/SqueezeNet1_0_Weights.html#torchvision.models.SqueezeNet1_0_Weights.IMAGENET1K_V1) + +```python +torchvision.models.SqueezeNet1_0_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.SqueezeNet1_0_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_1_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_1_Weights.DEFAULT.md new file mode 100644 index 00000000000..7e18c75559d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_1_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.SqueezeNet1_1_Weights.DEFAULT + +### [torchvision.models.SqueezeNet1_1_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/SqueezeNet1_1_Weights.html#torchvision.models.SqueezeNet1_1_Weights.DEFAULT) + +```python +torchvision.models.SqueezeNet1_1_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.SqueezeNet1_1_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_1_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_1_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..d8b7a6bb2d1 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.SqueezeNet1_1_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.SqueezeNet1_1_Weights.IMAGENET1K_V1 + +### [torchvision.models.SqueezeNet1_1_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/SqueezeNet1_1_Weights.html#torchvision.models.SqueezeNet1_1_Weights.IMAGENET1K_V1) + +```python +torchvision.models.SqueezeNet1_1_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.SqueezeNet1_1_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_BN_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_BN_Weights.DEFAULT.md new file mode 100644 index 00000000000..1c1885fd87e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_BN_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG11_BN_Weights.DEFAULT + +### [torchvision.models.VGG11_BN_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/VGG11_BN_Weights.html#torchvision.models.VGG11_BN_Weights.DEFAULT) + +```python +torchvision.models.VGG11_BN_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG11_BN_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_BN_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_BN_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..a02e7b880fc --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_BN_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG11_BN_Weights.IMAGENET1K_V1 + +### [torchvision.models.VGG11_BN_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/VGG11_BN_Weights.html#torchvision.models.VGG11_BN_Weights.IMAGENET1K_V1) + +```python +torchvision.models.VGG11_BN_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG11_BN_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_Weights.DEFAULT.md new file mode 100644 index 00000000000..1ca6066fb14 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG11_Weights.DEFAULT + +### [torchvision.models.VGG11_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/VGG11_Weights.html#torchvision.models.VGG11_Weights.DEFAULT) + +```python +torchvision.models.VGG11_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG11_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..17a5cd89079 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG11_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG11_Weights.IMAGENET1K_V1 + +### [torchvision.models.VGG11_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/VGG11_Weights.html#torchvision.models.VGG11_Weights.IMAGENET1K_V1) + +```python +torchvision.models.VGG11_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG11_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_BN_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_BN_Weights.DEFAULT.md new file mode 100644 index 00000000000..d1c0bfc128a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_BN_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG13_BN_Weights.DEFAULT + +### [torchvision.models.VGG13_BN_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/VGG13_BN_Weights.html#torchvision.models.VGG13_BN_Weights.DEFAULT) + +```python +torchvision.models.VGG13_BN_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG13_BN_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_BN_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_BN_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..f29d30e5802 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_BN_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG13_BN_Weights.IMAGENET1K_V1 + +### [torchvision.models.VGG13_BN_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/VGG13_BN_Weights.html#torchvision.models.VGG13_BN_Weights.IMAGENET1K_V1) + +```python +torchvision.models.VGG13_BN_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG13_BN_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_Weights.DEFAULT.md new file mode 100644 index 00000000000..cbe77edf8b5 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG13_Weights.DEFAULT + +### [torchvision.models.VGG13_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/VGG13_Weights.html#torchvision.models.VGG13_Weights.DEFAULT) + +```python +torchvision.models.VGG13_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG13_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..38da8f87d4d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG13_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG13_Weights.IMAGENET1K_V1 + +### [torchvision.models.VGG13_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/VGG13_Weights.html#torchvision.models.VGG13_Weights.IMAGENET1K_V1) + +```python +torchvision.models.VGG13_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG13_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_BN_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_BN_Weights.DEFAULT.md new file mode 100644 index 00000000000..fe923d840e7 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_BN_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG16_BN_Weights.DEFAULT + +### [torchvision.models.VGG16_BN_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/VGG16_BN_Weights.html#torchvision.models.VGG16_BN_Weights.DEFAULT) + +```python +torchvision.models.VGG16_BN_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG16_BN_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_BN_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_BN_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..d48fa536530 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_BN_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG16_BN_Weights.IMAGENET1K_V1 + +### [torchvision.models.VGG16_BN_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/VGG16_BN_Weights.html#torchvision.models.VGG16_BN_Weights.IMAGENET1K_V1) + +```python +torchvision.models.VGG16_BN_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG16_BN_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_Weights.DEFAULT.md new file mode 100644 index 00000000000..c8d06f272f4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG16_Weights.DEFAULT + +### [torchvision.models.VGG16_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/VGG16_Weights.html#torchvision.models.VGG16_Weights.DEFAULT) + +```python +torchvision.models.VGG16_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG16_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_Weights.IMAGENET1K_FEATURES.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_Weights.IMAGENET1K_FEATURES.md new file mode 100644 index 00000000000..722cb9adf7f --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_Weights.IMAGENET1K_FEATURES.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG16_Weights.IMAGENET1K_FEATURES + +### [torchvision.models.VGG16_Weights.IMAGENET1K_FEATURES](https://pytorch.org/vision/stable/models/generated/VGG16_Weights.html#torchvision.models.VGG16_Weights.IMAGENET1K_FEATURES) + +```python +torchvision.models.VGG16_Weights.IMAGENET1K_FEATURES +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG16_Weights.IMAGENET1K_FEATURES + +## Paddle 写法 +mode = 'IMAGENET1K_FEATURES' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..714173e2040 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG16_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG16_Weights.IMAGENET1K_V1 + +### [torchvision.models.VGG16_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/VGG16_Weights.html#torchvision.models.VGG16_Weights.IMAGENET1K_V1) + +```python +torchvision.models.VGG16_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG16_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_BN_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_BN_Weights.DEFAULT.md new file mode 100644 index 00000000000..d4972f6f6aa --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_BN_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG19_BN_Weights.DEFAULT + +### [torchvision.models.VGG19_BN_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/VGG19_BN_Weights.html#torchvision.models.VGG19_BN_Weights.DEFAULT) + +```python +torchvision.models.VGG19_BN_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG19_BN_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_BN_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_BN_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..3adbe65f58d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_BN_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG19_BN_Weights.IMAGENET1K_V1 + +### [torchvision.models.VGG19_BN_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/VGG19_BN_Weights.html#torchvision.models.VGG19_BN_Weights.IMAGENET1K_V1) + +```python +torchvision.models.VGG19_BN_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG19_BN_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_Weights.DEFAULT.md new file mode 100644 index 00000000000..3580e8d3dab --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG19_Weights.DEFAULT + +### [torchvision.models.VGG19_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/VGG19_Weights.html#torchvision.models.VGG19_Weights.DEFAULT) + +```python +torchvision.models.VGG19_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG19_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..679c83a291d --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.VGG19_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.VGG19_Weights.IMAGENET1K_V1 + +### [torchvision.models.VGG19_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/VGG19_Weights.html#torchvision.models.VGG19_Weights.IMAGENET1K_V1) + +```python +torchvision.models.VGG19_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.VGG19_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet101_2_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet101_2_Weights.DEFAULT.md new file mode 100644 index 00000000000..69299b14ae5 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet101_2_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.Wide_ResNet101_2_Weights.DEFAULT + +### [torchvision.models.Wide_ResNet101_2_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/Wide_ResNet101_2_Weights.html#torchvision.models.Wide_ResNet101_2_Weights.DEFAULT) + +```python +torchvision.models.Wide_ResNet101_2_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.Wide_ResNet101_2_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..43175d8d84a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V1 + +### [torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/Wide_ResNet101_2_Weights.html#torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V1) + +```python +torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V2.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V2.md new file mode 100644 index 00000000000..09aa14ff323 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V2.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V2 + +### [torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V2](https://pytorch.org/vision/stable/models/generated/Wide_ResNet101_2_Weights.html#torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V2) + +```python +torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V2 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.Wide_ResNet101_2_Weights.IMAGENET1K_V2 + +## Paddle 写法 +mode = 'IMAGENET1K_V2' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet50_2_Weights.DEFAULT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet50_2_Weights.DEFAULT.md new file mode 100644 index 00000000000..be637eebb78 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet50_2_Weights.DEFAULT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.Wide_ResNet50_2_Weights.DEFAULT + +### [torchvision.models.Wide_ResNet50_2_Weights.DEFAULT](https://pytorch.org/vision/stable/models/generated/Wide_ResNet50_2_Weights.html#torchvision.models.Wide_ResNet50_2_Weights.DEFAULT) + +```python +torchvision.models.Wide_ResNet50_2_Weights.DEFAULT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.Wide_ResNet50_2_Weights.DEFAULT + +## Paddle 写法 +mode = 'DEFAULT' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V1.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V1.md new file mode 100644 index 00000000000..a2ad1f11f84 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V1.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V1 + +### [torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V1](https://pytorch.org/vision/stable/models/generated/Wide_ResNet50_2_Weights.html#torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V1) + +```python +torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V1 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V1 + +## Paddle 写法 +mode = 'IMAGENET1K_V1' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V2.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V2.md new file mode 100644 index 00000000000..53bb2365eae --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V2.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V2 + +### [torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V2](https://pytorch.org/vision/stable/models/generated/Wide_ResNet50_2_Weights.html#torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V2) + +```python +torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V2 +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.models.Wide_ResNet50_2_Weights.IMAGENET1K_V2 + +## Paddle 写法 +mode = 'IMAGENET1K_V2' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.ops.RoIPool.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.ops.RoIPool.md new file mode 100644 index 00000000000..6f181526018 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.ops.RoIPool.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.ops.RoIPool + +### [torchvision.ops.RoIPool](https://pytorch.org/vision/stable/generated/torchvision.ops.RoIPool.html#torchvision.ops.RoIPool) + +```python +torchvision.ops.RoIPool(output_size, spatial_scale) +``` + +### [paddle.vision.ops.RoIPool](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/ops/RoIPool_cn.html#paddle/vision/ops/RoIPool_cn#cn-api-paddle-vision-ops-RoIPool) + +```python +paddle.vision.ops.RoIPool(output_size, spatial_scale) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +roi_pool = torchvision.ops.RoIPool(output_size=(7, 7), spatial_scale=1.0) + +# Paddle 写法 +roi_pool = paddle.vision.ops.RoIPool(output_size=(7, 7), spatial_scale=1.0) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.CenterCrop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.CenterCrop.md new file mode 100644 index 00000000000..5881987e631 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.CenterCrop.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.CenterCrop + +### [torchvision.transforms.CenterCrop](https://pytorch.org/vision/stable/generated/torchvision.transforms.CenterCrop.html#torchvision.transforms.CenterCrop) + +```python +torchvision.transforms.CenterCrop(size) +``` + +### [paddle.vision.transforms.CenterCrop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/CenterCrop_cn.html#paddle/vision/transforms/CenterCrop_cn#cn-api-paddle-vision-transforms-CenterCrop) + +```python +paddle.vision.transforms.CenterCrop(size, keys=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +center_crop = torchvision.transforms.CenterCrop(size) + +# Paddle 写法 +center_crop = paddle.vision.transforms.CenterCrop(size) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.ColorJitter.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.ColorJitter.md new file mode 100644 index 00000000000..994c551eb2b --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.ColorJitter.md @@ -0,0 +1,29 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.ColorJitter + +### [torchvision.transforms.ColorJitter](https://pytorch.org/vision/stable/generated/torchvision.transforms.ColorJitter.html#torchvision.transforms.ColorJitter) + +```python +torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0) +``` + +### [paddle.vision.transforms.ColorJitter](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/ColorJitter_cn.html#paddle/vision/transforms/ColorJitter_cn#cn-api-paddle-vision-transforms-ColorJitter) + +```python +paddle.vision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0, keys=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +jitter = torchvision.transforms.ColorJitter( + brightness=0.2, contrast=0.3, saturation=0.4, hue=0 +) + +# Paddle 写法 +jitter = paddle.vision.transforms.ColorJitter( + brightness=0.2, contrast=0.3, saturation=0.4, hue=0 +) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.Compose.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.Compose.md new file mode 100644 index 00000000000..2c48df0ad73 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.Compose.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.Compose + +### [torchvision.transforms.Compose](https://pytorch.org/vision/stable/generated/torchvision.transforms.Compose.html#torchvision.transforms.Compose) + +```python +torchvision.transforms.Compose(transforms) +``` + +### [paddle.vision.transforms.Compose](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/Compose_cn.html#paddle/vision/transforms/Compose_cn#cn-api-paddle-vision-transforms-Compose) + +```python +paddle.vision.transforms.Compose(transforms) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +composed = torchvision.transforms.Compose(transforms=process) + +# Paddle 写法 +composed = paddle.vision.transforms.Compose(transforms=process) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.Grayscale.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.Grayscale.md new file mode 100644 index 00000000000..cc5bc51ef2e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.Grayscale.md @@ -0,0 +1,34 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.Grayscale + +### [torchvision.transforms.Grayscale](https://pytorch.org/vision/stable/generated/torchvision.transforms.Grayscale.html#torchvision.transforms.Grayscale) + +```python +torchvision.transforms.Grayscale(num_output_channels) +``` + +### [paddle.vision.transforms.Grayscale](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/Grayscale_cn.html#paddle/vision/transforms/Grayscale_cn#cn-api-paddle-vision-transforms-Grayscale) + +```python +paddle.vision.transforms.Grayscale(num_output_channels, keys=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +grayscale = torchvision.transforms.Grayscale(num_output_channels=1) +img = torch.tensor( + [[[0.2, 0.4], [0.6, 0.8]], [[0.1, 0.3], [0.5, 0.7]], [[0.0, 0.2], [0.4, 0.6]]] +) +result = grayscale(img) + +# Paddle 写法 +grayscale = paddle.vision.transforms.Grayscale(num_output_channels=1) +img = paddle.tensor( + [[[0.2, 0.4], [0.6, 0.8]], [[0.1, 0.3], [0.5, 0.7]], [[0.0, 0.2], [0.4, 0.6]]] +) +result = grayscale(img) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.BICUBIC.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.BICUBIC.md new file mode 100644 index 00000000000..a533b6ce81b --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.BICUBIC.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.BICUBIC + +### [torchvision.transforms.InterpolationMode.BICUBIC](https://pytorch.org/vision/stable/generated/torchvision.transforms.InterpolationMode.html#torchvision.transforms.InterpolationMode.BICUBIC) + +```python +torchvision.transforms.InterpolationMode.BICUBIC +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.transforms.InterpolationMode.BICUBIC + +## Paddle 写法 +mode = 'bicubic' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.BILINEAR.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.BILINEAR.md new file mode 100644 index 00000000000..7f0e66c5222 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.BILINEAR.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.BILINEAR + +### [torchvision.transforms.InterpolationMode.BILINEAR](https://pytorch.org/vision/stable/generated/torchvision.transforms.InterpolationMode.html#torchvision.transforms.InterpolationMode.BILINEAR) + +```python +torchvision.transforms.InterpolationMode.BILINEAR +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.transforms.InterpolationMode.BILINEAR + +## Paddle 写法 +mode = 'bilinear' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.BOX.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.BOX.md new file mode 100644 index 00000000000..97b3eb89063 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.BOX.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.BOX + +### [torchvision.transforms.InterpolationMode.BOX](https://pytorch.org/vision/stable/generated/torchvision.transforms.InterpolationMode.html#torchvision.transforms.InterpolationMode.BOX) + +```python +torchvision.transforms.InterpolationMode.BOX +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.transforms.InterpolationMode.BOX + +## Paddle 写法 +mode = 'box' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.HAMMING.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.HAMMING.md new file mode 100644 index 00000000000..54e21fb0af2 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.HAMMING.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.HAMMING + +### [torchvision.transforms.InterpolationMode.HAMMING](https://pytorch.org/vision/stable/generated/torchvision.transforms.InterpolationMode.html#torchvision.transforms.InterpolationMode.HAMMING) + +```python +torchvision.transforms.InterpolationMode.HAMMING +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.transforms.InterpolationMode.HAMMING + +## Paddle 写法 +mode = 'hamming' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.LANCZOS.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.LANCZOS.md new file mode 100644 index 00000000000..33d1db9cfb4 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.LANCZOS.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.LANCZOS + +### [torchvision.transforms.InterpolationMode.LANCZOS](https://pytorch.org/vision/stable/generated/torchvision.transforms.InterpolationMode.html#torchvision.transforms.InterpolationMode.LANCZOS) + +```python +torchvision.transforms.InterpolationMode.LANCZOS +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.transforms.InterpolationMode.LANCZOS + +## Paddle 写法 +mode = 'lanczos' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.NEAREST.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.NEAREST.md new file mode 100644 index 00000000000..ee8aabfeed2 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.NEAREST.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.NEAREST + +### [torchvision.transforms.InterpolationMode.NEAREST](https://pytorch.org/vision/stable/generated/torchvision.transforms.InterpolationMode.html#torchvision.transforms.InterpolationMode.NEAREST) + +```python +torchvision.transforms.InterpolationMode.NEAREST +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.transforms.InterpolationMode.NEAREST + +## Paddle 写法 +mode = 'nearest' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.NEAREST_EXACT.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.NEAREST_EXACT.md new file mode 100644 index 00000000000..0243771e623 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.InterpolationMode.NEAREST_EXACT.md @@ -0,0 +1,19 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.InterpolationMode.NEAREST_EXACT + +### [torchvision.transforms.InterpolationMode.NEAREST_EXACT](https://pytorch.org/vision/stable/generated/torchvision.transforms.InterpolationMode.html#torchvision.transforms.InterpolationMode.NEAREST_EXACT) + +```python +torchvision.transforms.InterpolationMode.NEAREST_EXACT +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +## PyTorch 写法 +mode = torchvision.transforms.InterpolationMode.NEAREST_EXACT + +## Paddle 写法 +mode = 'nearest_exact' +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.Pad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.Pad.md new file mode 100644 index 00000000000..fe20efb57ec --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.Pad.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.Pad + +### [torchvision.transforms.Pad](https://pytorch.org/vision/stable/generated/torchvision.transforms.Pad.html#torchvision.transforms.Pad) + +```python +torchvision.transforms.Pad(padding, fill=0, padding_mode='constant') +``` + +### [paddle.vision.transforms.Pad](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/Pad_cn.html#paddle/vision/transforms/Pad_cn#cn-api-paddle-vision-transforms-Pad) + +```python +paddle.vision.transforms.Pad(padding, fill=0, padding_mode='constant', keys=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +pad = torchvision.transforms.Pad(padding=2, fill=0, padding_mode="constant") + +# Paddle 写法 +pad = paddle.vision.transforms.Pad(padding=2, fill=0, padding_mode="constant") +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.RandomAffine.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.RandomAffine.md new file mode 100644 index 00000000000..b19b6652864 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.RandomAffine.md @@ -0,0 +1,42 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.RandomAffine + +### [torchvision.transforms.RandomAffine](https://pytorch.org/vision/stable/generated/torchvision.transforms.RandomAffine.html#torchvision.transforms.RandomAffine) + +```python +torchvision.transforms.RandomAffine(degrees, translate=None, scale=None, shear=None, interpolation=torchvision.transforms.InterpolationMode.InterpolationMode.NEAREST, fill=0, center=None) +``` + +### [paddle.vision.transforms.RandomAffine](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomAffine_cn.html#paddle/vision/transforms/RandomAffine_cn#cn-api-paddle-vision-transforms-RandomAffine) + +```python +paddle.vision.transforms.RandomAffine(degrees, translate=None, scale=None, shear=None, interpolation='nearest', fill=0, center=None, keys=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +transform = torchvision.transforms.RandomAffine( + 45, + (0.1, 0.1), + (0.5, 1.5), + 20, + torchvision.transforms.InterpolationMode.BILINEAR, + 255, + (2, 2), +) + +# Paddle 写法 +transform = paddle.vision.transforms.RandomAffine( + 45, + (0.1, 0.1), + (0.5, 1.5), + 20, + "bilinear", + 255, + (2, 2) +) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.RandomCrop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.RandomCrop.md new file mode 100644 index 00000000000..d5b43068a85 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.RandomCrop.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.RandomCrop + +### [torchvision.transforms.RandomCrop](https://pytorch.org/vision/stable/generated/torchvision.transforms.RandomCrop.html#torchvision.transforms.RandomCrop) + +```python +torchvision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant') +``` + +### [paddle.vision.transforms.RandomCrop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomCrop_cn.html#paddle/vision/transforms/RandomCrop_cn#cn-api-paddle-vision-transforms-RandomCrop) + +```python +paddle.vision.transforms.RandomCrop(size, padding=None, pad_if_needed=False, fill=0, padding_mode='constant', keys=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +crop = torchvision.transforms.RandomCrop(size=size) + +# Paddle 写法 +crop = paddle.vision.transforms.RandomCrop(size=size) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.RandomRotation.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.RandomRotation.md new file mode 100644 index 00000000000..129421d6a51 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.RandomRotation.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.RandomRotation + +### [torchvision.transforms.RandomRotation](https://pytorch.org/vision/stable/generated/torchvision.transforms.RandomRotation.html#torchvision.transforms.RandomRotation) + +```python +torchvision.transforms.RandomRotation(degrees, interpolation=torchvision.transforms.InterpolationMode.NEAREST, expand=False, center=None, fill=0) +``` + +### [paddle.vision.transforms.RandomRotation](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomRotation_cn.html#paddle/vision/transforms/RandomRotation_cn#cn-api-paddle-vision-transforms-RandomRotation) + +```python +paddle.vision.transforms.RandomRotation(degrees, interpolation='nearest', expand=False, center=None, fill=0, keys=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +rotation = torchvision.transforms.RandomRotation(degrees=degrees) + +# Paddle 写法 +rotation = paddle.vision.transforms.RandomRotation(degrees=degrees) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.ToTensor.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.ToTensor.md new file mode 100644 index 00000000000..9542515129e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.ToTensor.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.ToTensor + +### [torchvision.transforms.ToTensor](https://pytorch.org/vision/stable/generated/torchvision.transforms.ToTensor.html#torchvision.transforms.ToTensor) + +```python +torchvision.transforms.ToTensor() +``` + +### [paddle.vision.transforms.ToTensor](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/ToTensor_cn.html#paddle/vision/transforms/ToTensor_cn#cn-api-paddle-vision-transforms-ToTensor) + +```python +paddle.vision.transforms.ToTensor(data_format='CHW', keys=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +transform = torchvision.transforms.ToTensor() + +# Paddle 写法 +transform = paddle.vision.transforms.ToTensor() +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.adjust_brightness.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.adjust_brightness.md new file mode 100644 index 00000000000..43be4dddcaa --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.adjust_brightness.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.adjust_brightness + +### [torchvision.transforms.functional.adjust_brightness](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.adjust_brightness.html#torchvision.transforms.functional.adjust_brightness) + +```python +torchvision.transforms.functional.adjust_brightness(img, brightness_factor) +``` + +### [paddle.vision.transforms.adjust_brightness](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/adjust_brightness_cn.html#paddle/vision/transforms/adjust_brightness_cn#cn-api-paddle-vision-transforms-adjust_brightness) + +```python +paddle.vision.transforms.adjust_brightness(img, brightness_factor) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.adjust_brightness(img, factor) + +# Paddle 写法 +result = paddle.vision.transforms.adjust_brightness(img, factor) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.adjust_contrast.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.adjust_contrast.md new file mode 100644 index 00000000000..71b634033a2 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.adjust_contrast.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.adjust_contrast + +### [torchvision.transforms.functional.adjust_contrast](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.adjust_contrast.html#torchvision.transforms.functional.adjust_contrast) + +```python +torchvision.transforms.functional.adjust_contrast(img, contrast_factor) +``` + +### [paddle.vision.transforms.adjust_contrast](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/adjust_contrast_cn.html#paddle/vision/transforms/adjust_contrast_cn#cn-api-paddle-vision-transforms-adjust_contrast) + +```python +paddle.vision.transforms.adjust_contrast(img, contrast_factor) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.adjust_contrast(img, contrast_factor) + +# Paddle 写法 +result = paddle.vision.transforms.adjust_contrast(img, contrast_factor) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.adjust_hue.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.adjust_hue.md new file mode 100644 index 00000000000..83034082d2e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.adjust_hue.md @@ -0,0 +1,30 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.adjust_hue + +### [torchvision.transforms.functional.adjust_hue](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.adjust_hue.html#torchvision.transforms.functional.adjust_hue) + +```python +torchvision.transforms.functional.adjust_hue(img, hue_factor) +``` + +### [paddle.vision.transforms.adjust_hue](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/adjust_hue_cn.html#paddle/vision/transforms/adjust_hue_cn#cn-api-paddle-vision-transforms-adjust_hue) + +```python +paddle.vision.transforms.adjust_hue(img, hue_factor) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.adjust_hue( + Image.new("RGB", (2, 2), color=(100, 100, 100)), 0.25 +) + +# Paddle 写法 +result = paddle.vision.transforms.adjust_hue( + Image.new("RGB", (2, 2), color=(100, 100, 100)), 0.25 +) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.affine.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.affine.md new file mode 100644 index 00000000000..2c8bdb2df53 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.affine.md @@ -0,0 +1,30 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.affine + +### [torchvision.transforms.functional.affine](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.affine.html#torchvision.transforms.functional.affine) + +```python +torchvision.transforms.functional.affine(img, angle, translate, scale, shear, interpolation=torchvision.transforms.functional.NEREAST, fill=None, center=None) +``` + +### [paddle.vision.transforms.affine](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/affine_cn.html#paddle/vision/transforms/affine_cn#cn-api-paddle-vision-transforms-affine) + +```python +paddle.vision.transforms.affine(img, angle, translate, scale, shear, interpolation='nearst', fill=0, center=None) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.affine( + img, 30, (1, 1), 1.0, 0, torchvision.transforms.InterpolationMode.NEAREST +) + +# Paddle 写法 +result = paddle.vision.transforms.affine( + img, 30, (1, 1), 1.0, 0, torchvision.transforms.InterpolationMode.NEAREST +) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.center_crop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.center_crop.md new file mode 100644 index 00000000000..defca44d197 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.center_crop.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.center_crop + +### [torchvision.transforms.functional.center_crop](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.center_crop.html#torchvision.transforms.functional.center_crop) + +```python +torchvision.transforms.functional.center_crop(img, output_size) +``` + +### [paddle.vision.transforms.center_crop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/center_crop_cn.html#paddle/vision/transforms/center_crop_cn#cn-api-paddle-vision-transforms-center_crop) + +```python +paddle.vision.transforms.center_crop(img, output_size) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.center_crop(img, output_size) + +# Paddle 写法 +result = paddle.vision.transforms.center_crop(img, output_size) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.crop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.crop.md new file mode 100644 index 00000000000..082d5942475 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.crop.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.crop + +### [torchvision.transforms.functional.crop](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.crop.html#torchvision.transforms.functional.crop) + +```python +torchvision.transforms.functional.crop(img, top, left, height, width) +``` + +### [paddle.vision.transforms.crop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/crop_cn.html#paddle/vision/transforms/crop_cn#cn-api-paddle-vision-transforms-crop) + +```python +paddle.vision.transforms.crop(img, top, left, height, width) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.crop(img, top, left, height, width) + +# Paddle 写法 +result = paddle.vision.transforms.crop(img, top, left, height, width) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.erase.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.erase.md new file mode 100644 index 00000000000..6969553c16e --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.erase.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.erase + +### [torchvision.transforms.functional.erase](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.erase.html#torchvision.transforms.functional.erase) + +```python +torchvision.transforms.functional.erase(img, i, j, h, w, v, inplace) +``` + +### [paddle.vision.transforms.erase](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/erase_cn.html#paddle/vision/transforms/erase_cn#cn-api-paddle-vision-transforms-erase) + +```python +paddle.vision.transforms.erase(img, i, j, h, w, v, inplace) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.erase(img, i, j, h, w, v, inplace) + +# Paddle 写法 +result = paddle.vision.transforms.erase(img, i, j, h, w, v, inplace) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.hflip.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.hflip.md new file mode 100644 index 00000000000..ab715c5b6aa --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.hflip.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.hflip + +### [torchvision.transforms.functional.hflip](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.hflip.html#torchvision.transforms.functional.hflip) + +```python +torchvision.transforms.functional.hflip(img) +``` + +### [paddle.vision.transforms.hflip](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/hflip_cn.html#paddle/vision/transforms/hflip_cn#cn-api-paddle-vision-transforms-hflip) + +```python +paddle.vision.transforms.hflip(img) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.hflip(img) + +# Paddle 写法 +result = paddle.vision.transforms.hflip(img) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.pad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.pad.md new file mode 100644 index 00000000000..c376e431389 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.pad.md @@ -0,0 +1,30 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.pad + +### [torchvision.transforms.functional.pad](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.pad.html#torchvision.transforms.functional.pad) + +```python +torchvision.transforms.functional.pad(img, padding, fill=0, padding_mode='constant') +``` + +### [paddle.vision.transforms.pad](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/pad_cn.html#paddle/vision/transforms/pad_cn#cn-api-paddle-vision-transforms-pad) + +```python +paddle.vision.transforms.pad(img, padding, fill=0, padding_mode='constant') +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.pad( + img=img, padding=padding, fill=fill, padding_mode=padding_mode +) + +# Paddle 写法 +result = paddle.vision.transforms.pad( + img=img, padding=padding, fill=fill, padding_mode=padding_mode +) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.perspective.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.perspective.md new file mode 100644 index 00000000000..7dfc6a9dcac --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.perspective.md @@ -0,0 +1,29 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.perspective + +### [torchvision.transforms.functional.perspective](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.perspective.html#torchvision.transforms.functional.perspective) + +```python +torchvision.transforms.functional.perspective(img, startpoints, endpoints, interpolation=torchvision.transforms.functional.InterpolationMode.BILINEAR, fill=None) +``` + +### [paddle.vision.transforms.perspective](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/perspective_cn.html#paddle/vision/transforms/perspective_cn#cn-api-paddle-vision-transforms-perspective) + +```python +paddle.vision.transforms.perspective(img, startpoints, endpoints, interpolation='nearest', fill=0) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.perspective( + img, startpoints, endpoints, torchvision.transforms.InterpolationMode.BILINEAR, fill +) + +# Paddle 写法 +result = paddle.vision.transforms.perspective( + img, startpoints, endpoints, torchvision.transforms.InterpolationMode.BILINEAR, fill +) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.rotate.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.rotate.md new file mode 100644 index 00000000000..b6f2bf7d43a --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.rotate.md @@ -0,0 +1,40 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.rotate + +### [torchvision.transforms.functional.rotate](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.rotate.html#torchvision.transforms.functional.rotate) + +```python +torchvision.transforms.functional.rotate(img, angle, interpolation=torchvision.transforms.functional.InterpolationMode.NEAREST, expand=False, center=None, fill=None) +``` + +### [paddle.vision.transforms.rotate](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/rotate_cn.html#paddle/vision/transforms/rotate_cn#cn-api-paddle-vision-transforms-rotate) + +```python +paddle.vision.transforms.rotate(img, angle, interpolation='nearest', expand=False, center=None, fill=0) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.rotate( + img=img, + angle=30, + interpolation=torchvision.transforms.InterpolationMode.BILINEAR, + expand=True, + center=(1, 1), + fill=[128, 128, 128], +) + + +# Paddle 写法 +result = paddle.vision.transforms.rotate( + img=img, + angle=30, + interpolation=torchvision.transforms.InterpolationMode.BILINEAR, + expand=True, + center=(1, 1), + fill=[128, 128, 128], +) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.to_grayscale.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.to_grayscale.md new file mode 100644 index 00000000000..24ec801aa20 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.to_grayscale.md @@ -0,0 +1,25 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.to_grayscale + +### [torchvision.transforms.functional.to_grayscale](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.to_grayscale.html#torchvision.transforms.functional.to_grayscale) + +```python +torchvision.transforms.functional.to_grayscale(img, num_output_channels=1) +``` + +### [paddle.vision.transforms.to_grayscale](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/to_grayscale_cn.html#paddle/vision/transforms/to_grayscale_cn#cn-api-paddle-vision-transforms-to_grayscale) + +```python +paddle.vision.transforms.to_grayscale(img, num_output_channels=1) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.to_grayscale(img, num_output_channels=1) + +# Paddle 写法 +result = paddle.vision.transforms.to_grayscale(img, num_output_channels=1) +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.to_tensor.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.to_tensor.md new file mode 100644 index 00000000000..b0204fc2822 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.to_tensor.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.to_tensor + +### [torchvision.transforms.functional.to_tensor](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.to_tensor.html#torchvision.transforms.functional.to_tensor) + +```python +torchvision.transforms.functional.to_tensor(pic) +``` + +### [paddle.vision.transforms.to_tensor](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/to_tensor_cn.html#paddle/vision/transforms/to_tensor_cn#cn-api-paddle-vision-transforms-to_tensor) + +```python +paddle.vision.transforms.to_tensor(pic, data_format='CHW') +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.to_tensor(img) + +# Paddle 写法 +result = paddle.vision.transforms.to_tensor(img) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.vflip.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.vflip.md new file mode 100644 index 00000000000..e1a237fb794 --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torchvision.transforms.functional.vflip.md @@ -0,0 +1,26 @@ +## [ 仅 API 调用方式不一致 ]torchvision.transforms.functional.vflip + +### [torchvision.transforms.functional.vflip](https://pytorch.org/vision/stable/generated/torchvision.transforms.functional.vflip.html#torchvision.transforms.functional.vflip) + +```python +torchvision.transforms.functional.vflip(img) +``` + +### [paddle.vision.transforms.vflip](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/vflip_cn.html#paddle/vision/transforms/vflip_cn#cn-api-paddle-vision-transforms-vflip) + +```python +paddle.vision.transforms.vflip(img) +``` + +两者功能一致,但调用方式不一致,具体如下: + +### 转写示例 + +```python +# PyTorch 写法 +result = torchvision.transforms.functional.vflip(img) + +# Paddle 写法 +result = paddle.vision.transforms.vflip(img) + +``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.get_rng_state_all.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.get_rng_state_all.md deleted file mode 100644 index c92088d86b5..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.get_rng_state_all.md +++ /dev/null @@ -1,29 +0,0 @@ -## [ 返回参数类型不一致 ]torch.cuda.get_rng_state_all -### [torch.cuda.get_rng_state_all](https://pytorch.org/docs/stable/generated/torch.cuda.get_rng_state_all.html#torch.cuda.get_rng_state_all) -```python -torch.cuda.get_rng_state_all() -``` - -### [paddle.get_rng_state]() -```python -paddle.get_rng_state(device='gpu') -``` - -paddle 参数更多,并且 torch 与 paddle 的返回参数类型不一致,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------- | ------------ | -------------------------------------------------------------------------------------------------- | -| - | device | 返回随机数生成器状态的设备,PyTorch 无此参数,Paddle 需设置为'gpu' 。 | -| 返回值 | 返回值 | 返回参数类型不一致, PyTorch 返回 torch.ByteTensor,Paddle 返回 GeneratorState 对象。 | - -### 转写示例 -#### 返回参数类型不同 -```python -# PyTorch 写法,返回 torch.ByteTensor -x = torch.cuda.get_rng_state_all() - -# Paddle 写法,返回 GeneratorState 对象 -x = paddle.get_rng_state(device='gpu') -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.manual_seed.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.manual_seed.md deleted file mode 100644 index 896d5c484a2..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.cuda.manual_seed.md +++ /dev/null @@ -1,29 +0,0 @@ -## [ 返回参数类型不一致 ]torch.cuda.manual_seed -### [torch.cuda.manual_seed](https://pytorch.org/docs/stable/generated/torch.cuda.manual_seed.html#torch.cuda.manual_seed) -```python -torch.cuda.manual_seed(seed) -``` - -### [paddle.seed](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/seed_cn.html) -```python -paddle.seed(seed) -``` - -功能一致,返回类型不一致,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -|---------|--------------|----------------------------------------------------| -| seed | seed | 表示设置的的随机种子(int)。 | -| - | 返回值 | PyTorch 无返回值,Paddle 返回 Generator(全局默认 generator 对象)。 | - -### 转写示例 -#### 返回值 -```python -# torch 写法 -torch.cuda.manual_seed(100) - -# paddle 写法 -gen = paddle.seed(100) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.max.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.max.md deleted file mode 100644 index ec41a35a49b..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.max.md +++ /dev/null @@ -1,94 +0,0 @@ -## [ 返回参数类型不一致 ]torch.max -输入一个 Tensor 对应 paddle.max,输入两个 Tensor 对应 paddle.maximum,因此有两组差异分析,分别如下: - -------------------------------------------------------------------------------------------------- - -### [torch.max](https://pytorch.org/docs/stable/generated/torch.max.html?highlight=max#torch.max) -```python -torch.max(input, - dim=None, - keepdim=False, - *, - out=None) -``` - -### [paddle.max](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/max_cn.html#max) -```python -paddle.max(x, - axis=None, - keepdim=False, - name=None) -``` - -其中 PyTorch 与 Paddle 指定 `dim` 后返回值不一致,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 求最大值运算的维度, 仅参数名不一致。 | -| keepdim | keepdim | 是否在输出 Tensor 中保留减小的维度。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | -| 返回值 | 返回值 | 表示返回结果,当指定 dim 后,PyTorch 会返回比较结果和元素索引, Paddle 不会返回元素索引,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# 对指定维度上的 Tensor 元素求最大值运算 - -# PyTorch 写法 -torch.max(a, out=y) -# torch 在输入 dim 时,返回 (values, indices),返回参数类型不一致 - -# Paddle 写法 -paddle.assign(paddle.max(a), y) -``` -#### 指定 dim 后的返回值 -```python -# PyTorch 写法 -result = torch.max(a, dim=1) - -# Paddle 写法 -result = paddle.max(a, axis=1), paddle.argmax(a, axis=1) -``` - --------------------------------------------------------------------------------------------------- - -### [torch.max](https://pytorch.org/docs/stable/generated/torch.max.html?highlight=max#torch.max) -```python -torch.max(input, - other, - *, - out=None) -``` - -### [paddle.maximum](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/minimum_cn.html#minimum) -```python -paddle.maximum(x, - y, - name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor ,仅参数名不一致。 | -| other | y | 输入的 Tensor , 仅参数名不一致。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# 逐元素对比输入的两个 Tensor - -# PyTorch 写法 -torch.max(a, b, out=y) -# 在输入 other 时,比较 input 和 other 返回较大值 - -# Paddle 写法 -paddle.assign(paddle.maximum(a, b), y) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.min.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.min.md deleted file mode 100644 index ee100fb0838..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.min.md +++ /dev/null @@ -1,92 +0,0 @@ -## [ 返回参数类型不一致 ]torch.min -输入一个 Tensor 对应 paddle.min,输入两个 Tensor 对应 paddle.minimum,因此有两组差异分析,分别如下: - --------------------------------------------------------------------------------------------------- -### [torch.min](https://pytorch.org/docs/stable/generated/torch.min.html?highlight=min#torch.min) -```python -torch.min(input, - dim=None, - keepdim=False, - *, - out=None) -``` - -### [paddle.min](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/min_cn.html#min) -```python -paddle.min(x, - axis=None, - keepdim=False, - name=None) -``` - -其中 PyTorch 与 Paddle 指定 `dim` 后返回值不一致,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 求最小值运算的维度, 仅参数名不一致。 | -| keepdim | keepdim | 是否在输出 Tensor 中保留减小的维度。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | -| 返回值 | 返回值 | 表示返回结果,当指定 dim 后,PyTorch 会返回比较结果和元素索引, Paddle 不会返回元素索引,需要转写。 | - -### 转写示例 -#### out:指定输出 -```python -# 对指定维度上的 Tensor 元素求最大值运算 - -# PyTorch 写法 -torch.min(a, out=y) -# torch 在输入 dim 时,返回 (values, indices),返回参数类型不一致 - -# Paddle 写法 -paddle.assign(paddle.min(a), y) -``` -#### 指定 dim 后的返回值 -```python -# PyTorch 写法 -result = torch.min(a, dim=1) - -# Paddle 写法 -result = torch.min(a, dim=1), torch.argmin(a, dim=1) -``` - --------------------------------------------------------------------------------------------------- - -### [torch.min](https://pytorch.org/docs/stable/generated/torch.min.html?highlight=min#torch.min) -```python -torch.min(input, - other, - *, - out=None) -``` - -### [paddle.minimum](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/minimum_cn.html#minimum) -```python -paddle.minimum(x, - y, - name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor。 | -| other | y | 输入的 Tensor。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# 逐元素对比输入的两个 Tensor - -# PyTorch 写法 -torch.min(a, b, out=y) -# 在输入 other 时,比较 input 和 other 返回较大值 - -# Paddle 写法 -paddle.assign(paddle.minimum(a, b), y) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.sort.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.sort.md deleted file mode 100644 index 31e14ce6669..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.sort.md +++ /dev/null @@ -1,45 +0,0 @@ -## [ 返回参数类型不一致 ]torch.sort -### [torch.sort](https://pytorch.org/docs/stable/generated/torch.sort.html?highlight=sort#torch.sort) -```python -torch.sort(input, - dim=-1, - descending=False, - stable=False, - *, - out=None) -``` - -### [paddle.sort](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/sort_cn.html#paddle.sort) -```python -paddle.sort(x, - axis=-1, - descending=False, - stable=False, - name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,同时两个 api 的返回参数类型不同,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 指定对输入 Tensor 进行运算的轴。默认值为-1, 仅参数名不一致。 | -| descending |descending | 指定算法排序的方向。如果设置为 True,算法按照降序排序。如果设置为 False 或者不设置,按照升序排序。默认值为 False,参数名相同。 | -| stable | stable | 使排序程序更稳定,保证等价元素的顺序得以保留。 | -| out | - | 表示以(Tensor, LongTensor)输出的元组,含义是排序后的返回值和对应元素索引。Paddle 无此参数,若返回排序后的元素,需要转写;若需要返回元素和元素索引,需要结合 argsort 进行转写。 | - -注:PyTorch 返回 (Tensor, LongTensor),Paddle 返回 Tensor 。 - -### 转写示例 -#### out:指定输出 -```python -# 若要返回排序后的元素和元素索引,需要结合 argsort 进行转写 -# PyTorch 写法 -torch.sort(input, -1, True, out = (y, indices)) - -# Paddle 写法 -paddle.assign(paddle.sort(input, -1, True), y) -paddle.assign(paddle.argsort(input, -1, True), indices) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.utils.data.default_collate.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.utils.data.default_collate.md deleted file mode 100644 index 37964d72f29..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/output_args_type_diff/torch.utils.data.default_collate.md +++ /dev/null @@ -1,40 +0,0 @@ -## [ 返回参数类型不一致 ]torch.utils.data.default_collate -### [torch.utils.data.default_collate](https://pytorch.org/docs/stable/data.html?highlight=default_collate#torch.utils.data.default_collate) -```python -torch.utils.data.default_collate(batch) -``` - -### [paddle.io.dataloader.collate.default_collate_fn]() -```python -paddle.io.dataloader.collate.default_collate_fn(batch) -``` - -返回参数类型不一致,需要转写。具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| batch | batch | 输入的用于组 batch 的数据。 | -| 返回值 | 返回值 | 返回参数类型不一致,当 batch 的元素为 numpy.ndarray 或 number 时, PyTorch 默认返回 torch.tensor, Paddle 默认返回 numpy.ndarray。 | - - -### 转写示例 -#### 当 batch 的元素为 numpy.ndarray 或 number 时 -```python -# PyTorch 写法 -y = torch.utils.data.default_collate(batch) - -# Paddle 写法 -y = paddle.to_tensor(paddle.io.dataloader.collate.default_collate_fn(batch)) -``` - -#### 当 batch 的元素为字典且字典的 value 为 numpy.ndarray 或 number 时 -```python -# PyTorch 写法 -y = torch.utils.data.default_collate(batch) - -# Paddle 写法 -y = paddle.io.dataloader.collate.default_collate_fn(batch) -for k, v in y.items(): - y[k] = paddle.to_tensor(v) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.argwhere.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.argwhere.md deleted file mode 100644 index 19c478d1a0e..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.argwhere.md +++ /dev/null @@ -1,18 +0,0 @@ -## [ paddle 参数更多 ]torch.Tensor.argwhere -### [torch.Tensor.argwhere](https://pytorch.org/docs/stable/generated/torch.Tensor.argwhere.html#torch.Tensor.argwhere) -```python -torch.Tensor.argwhere() -``` - -### [paddle.Tensor.nonzero](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html#nonzero-as-tuple-false) -```python -paddle.Tensor.nonzero(as_tuple=False) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| - | as_tuple | 返回格式。是否以 1-D Tensor 构成的元组格式返回。 PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.pinverse.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.pinverse.md deleted file mode 100644 index 5bd373210cf..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.Tensor.pinverse.md +++ /dev/null @@ -1,22 +0,0 @@ -## [ paddle 参数更多 ]torch.Tensor.pinverse - -### [torch.Tensor.pinverse](https://pytorch.org/docs/stable/generated/torch.Tensor.pinverse.html#torch.Tensor.pinverse) -```python -torch.Tensor.pinverse() -``` - -### [paddle.Tensor.pinv]() -```python -paddle.Tensor.pinv(rcond=1e-15, - hermitian=False, - name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| - | rcond | 奇异值(特征值)被截断的阈值,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | hermitian | 是否为 hermitian 矩阵或者实对称矩阵,PyTorch 无此参数,Paddle 保持默认即可。| diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool2d.md deleted file mode 100644 index 40cd9cca297..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool2d.md +++ /dev/null @@ -1,18 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.AdaptiveAvgPool2d -### [torch.nn.AdaptiveAvgPool2d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool2d.html) -```python -torch.nn.AdaptiveAvgPool2d(output_size) -``` - -### [paddle.nn.AdaptiveAvgPool2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/AdaptiveAvgPool2D_cn.html#adaptiveavgpool2d) -```python -paddle.nn.AdaptiveAvgPool2D(output_size, data_format='NCHW', name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| output_size | output_size | 表示输出 Tensor 的 size 。 | -| - | data_format | 表示输入 Tensor 的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool3d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool3d.md deleted file mode 100644 index 6a9f4e31acf..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.AdaptiveAvgPool3d.md +++ /dev/null @@ -1,18 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.AdaptiveAvgPool3d -### [torch.nn.AdaptiveAvgPool3d](https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool3d.html) -```python -torch.nn.AdaptiveAvgPool3d(output_size) -``` - -### [paddle.nn.AdaptiveAvgPool3D](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/AdaptiveAvgPool3D_cn.html#adaptiveavgpool3d) -```python -paddle.nn.AdaptiveAvgPool3D(output_size, data_format='NCDHW', name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| output_size | output_size | 表示输出 Tensor 的 size 。 | -| - | data_format | 表示输入 Tensor 的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool1d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool1d.md deleted file mode 100644 index af8892885d9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool1d.md +++ /dev/null @@ -1,28 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.MaxUnpool1d -### [torch.nn.MaxUnpool1d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool1d.html?highlight=maxunpool1d#torch.nn.MaxUnpool1d) -```python -torch.nn.MaxUnpool1d(kernel_size, - stride=None, - padding=0) -``` - -### [paddle.nn.MaxUnPool1D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool1D_cn.html) -```python -paddle.nn.MaxUnPool1D(kernel_size, - stride=None, - padding=0, - data_format='NCL', - output_size=None, - name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| kernel_size | kernel_size | 表示反池化核大小。 | -| stride | stride | 表示反池化核步长。 | -| padding | padding | 表示填充大小。 | -| - | data_format | 输入和输出的数据格式,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | output_size | 目标输出尺寸,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool2d.md deleted file mode 100644 index b01d53b1cca..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool2d.md +++ /dev/null @@ -1,28 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.MaxUnpool2d -### [torch.nn.MaxUnpool2d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool2d.html?highlight=maxunpool2d#torch.nn.MaxUnpool2d) -```python -torch.nn.MaxUnpool2d(kernel_size, - stride=None, - padding=0) -``` - -### [paddle.nn.MaxUnPool2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool2D_cn.html) -```python -paddle.nn.MaxUnPool2D(kernel_size, - stride=None, - padding=0, - data_format='NCHW', - output_size=None, - name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| kernel_size | kernel_size | 表示反池化核大小。 | -| stride | stride | 表示反池化核步长。 | -| padding | padding | 表示填充大小。 | -| - | data_format | 输入和输出的数据格式,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | output_size | 目标输出尺寸,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool3d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool3d.md deleted file mode 100644 index 1ec4ca953e5..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.MaxUnpool3d.md +++ /dev/null @@ -1,28 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.MaxUnpool3d -### [torch.nn.MaxUnpool3d](https://pytorch.org/docs/stable/generated/torch.nn.MaxUnpool3d.html?highlight=maxunpool3d#torch.nn.MaxUnpool3d) -```python -torch.nn.MaxUnpool3d(kernel_size, - stride=None, - padding=0) -``` - -### [paddle.nn.MaxUnPool3D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/MaxUnPool3D_cn.html) -```python -paddle.nn.MaxUnPool3D(kernel_size, - stride=None, - padding=0, - data_format='NCDHW', - output_size=None, - name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| kernel_size | kernel_size | 表示反池化核大小。 | -| stride | stride | 表示反池化核步长。 | -| padding | padding | 表示填充大小。 | -| - | data_format | 输入和输出的数据格式,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | output_size | 目标输出尺寸,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.md deleted file mode 100644 index a24fc14503e..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.md +++ /dev/null @@ -1,20 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.Module - -### [torch.nn.Module](https://pytorch.org/docs/stable/generated/torch.nn.Module.html?highlight=torch+nn+module#torch.nn.Module) -```python -torch.nn.Module(*args, **kwargs) -``` - -### [paddle.nn.Layer](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer_cn.html) -```python -paddle.nn.Layer(name_scope=None, dtype='float32') -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ----- | ---------- | ------------------------------------ | -| - | name_scope | PyTorch 无此参数,Paddle 保持默认即可。 | -| - | dtype | PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.modules.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.modules.md deleted file mode 100644 index 8054091e7ca..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.Module.modules.md +++ /dev/null @@ -1,18 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.Module.modules -### [torch.nn.Module.modules](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.modules) -```python -torch.nn.Module.modules() -``` - -### [paddle.nn.Layer.sublayers](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/Layer_cn.html#sublayers-include-self-false) -```python -paddle.nn.Layer.sublayers(include_self=False) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------- | ------------ | -- | -| - | include_self | 是否包含本层。PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingBilinear2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingBilinear2d.md deleted file mode 100644 index fcdf6ba071b..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingBilinear2d.md +++ /dev/null @@ -1,19 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.UpsamplingBilinear2d -### [torch.nn.UpsamplingBilinear2d](https://pytorch.org/docs/stable/generated/torch.nn.UpsamplingBilinear2d.html?highlight=upsamplingbilinear2d#torch.nn.UpsamplingBilinear2d) -```python -torch.nn.UpsamplingBilinear2d(size=None, scale_factor=None) -``` - -### [paddle.nn.UpsamplingBilinear2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/UpsamplingBilinear2D_cn.html) -```python -paddle.nn.UpsamplingBilinear2D(size=None,scale_factor=None, data_format='NCHW',name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| size | size | 表示输出 Tensor 的 size 。 | -| scale_factor | scale_factor | 表示输入 Tensor 的高度或宽度的乘数因子。 | -| - | data_format | 表示输入 Tensor 的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingNearest2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingNearest2d.md deleted file mode 100644 index f262c3f9c77..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.UpsamplingNearest2d.md +++ /dev/null @@ -1,19 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.UpsamplingNearest2d -### [torch.nn.UpsamplingNearest2d](https://pytorch.org/docs/stable/generated/torch.nn.UpsamplingNearest2d.html?highlight=upsampl#torch.nn.UpsamplingNearest2d) -```python -torch.nn.UpsamplingNearest2d(size=None, scale_factor=None) -``` - -### [paddle.nn.UpsamplingNearest2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/UpsamplingNearest2D_cn.html) -```python -paddle.nn.UpsamplingNearest2D(size=None, scale_factor=None, data_format='NCHW',name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| size | size | 表示输出 Tensor 的 size 。 | -| scale_factor | scale_factor | 表示输入 Tensor 的高度或宽度的乘数因子。 | -| - | data_format | 表示输入 Tensor 的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.ZeroPad2d.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.ZeroPad2d.md deleted file mode 100644 index 8367e4f43b0..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.ZeroPad2d.md +++ /dev/null @@ -1,21 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.ZeroPad2d - -### [torch.nn.ZeroPad2d](https://pytorch.org/docs/stable/generated/torch.nn.ZeroPad2d.html?highlight=zeropad#torch.nn.ZeroPad2d) -```python -torch.nn.ZeroPad2d(padding) -``` - -### [paddle.nn.ZeroPad2D](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/ZeroPad2D_cn.html) -```python -paddle.nn.ZeroPad2D(padding, - data_format='NCHW', - name=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| padding | padding | 表示填充大小。 | -| - | data_format | 指定输入的 format, PyTorch 无此参数, Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.functional.pad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.functional.pad.md deleted file mode 100644 index 79c7ff869e9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torch.nn.functional.pad.md +++ /dev/null @@ -1,34 +0,0 @@ -## [ paddle 参数更多 ]torch.nn.functional.pad -### [torch.nn.functional.pad](https://pytorch.org/docs/stable/generated/torch.nn.functional.pad.html) -```python -torch.nn.functional.pad(input, - pad, - mode='constant', - value=None) -``` - -### [paddle.nn.functional.pad](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/pad_cn.html#pad) -```python -paddle.nn.functional.pad(x, - pad, - mode='constant', - value=0.0, - data_format=None, - pad_from_left_axis=True, - name=None) -``` - -两者功能一致,其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 表示输入的 Tensor,仅参数名不一致。 | -| pad | pad | 表示一个 one-hot 向量的长度 。 | -| mode | mode | 表示填充的模式。 | -| value | value | 表示填充的值,mode 为'constant'时有效 。 | -| - | data_format | 指定输入的数据格式, PyTorch 无此参数, Paddle 保持默认即可。 | -| - | pad_from_left_axis | 只有当 mode 为 'constant' ,且 pad 是长度为 2N 的列表时有效,设置 pad 与 x 的轴左对齐或右对齐, PyTorch 无此参数, Paddle 需设置为 False 结果才与 PyTorch 一致。 | - -在实际使用过程中,`data_format` 参数需要根据输入参数进行指定 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.CenterCrop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.CenterCrop.md deleted file mode 100644 index 9a2d06182e3..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.CenterCrop.md +++ /dev/null @@ -1,24 +0,0 @@ -## [ paddle 参数更多 ]torchvision.transforms.CenterCrop -### [torchvision.transforms.CenterCrop](https://pytorch.org/vision/main/generated/torchvision.transforms.CenterCrop.html) -```python -torchvision.transforms.CenterCrop( - size: Union[int, List[int], Tuple[int, ...]] -) -``` - -### [paddle.vision.transforms.CenterCrop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/CenterCrop_cn.html) -```python -paddle.vision.transforms.CenterCrop( - size: Union[int, List[int], Tuple[int, ...]], - keys: Optional[Union[List[str], Tuple[str, ...]]] = None -) -``` - -两者功能一致,但 Paddle 相比 torchvision 支持更多参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------ | ------------ | ---------------------- | -| size | size | 输出图像的形状大小。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ColorJitter.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ColorJitter.md deleted file mode 100644 index e8b48417e18..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ColorJitter.md +++ /dev/null @@ -1,22 +0,0 @@ -## [ paddle 参数更多 ]torchvision.transforms.ColorJitter -### [torchvision.transforms.ColorJitter](https://pytorch.org/vision/main/generated/torchvision.transforms.ColorJitter.html) -```python -torchvision.transforms.ColorJitter(brightness: Union[float, Tuple[float, float]] = 0, contrast: Union[float, Tuple[float, float]] = 0, saturation: Union[float, Tuple[float, float]] = 0, hue: Union[float, Tuple[float, float]] = 0) -``` - -### [paddle.vision.transforms.ColorJitter](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/ColorJitter_cn.html) -```python -paddle.vision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0, keys=None) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| --------------------------- | ------------------------------ | --------------------- | -| brightness | brightness | 亮度调整范围大小。 | -| contrast | contrast | 对比度调整范围大小。 | -| saturation | saturation | 饱和度调整范围大小。 | -| hue | hue | 色调调整范围大小。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Grayscale.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Grayscale.md deleted file mode 100644 index 75cda0d305a..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Grayscale.md +++ /dev/null @@ -1,23 +0,0 @@ -## [ paddle 参数更多 ]torchvision.transforms.Grayscale - -### [torchvision.transforms.Grayscale](https://pytorch.org/vision/main/generated/torchvision.transforms.Grayscale.html) -```python -torchvision.transforms.Grayscale(num_output_channels: int = 1) -``` - -### [paddle.vision.transforms.Grayscale](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/Grayscale_cn.html) -```python -paddle.vision.transforms.Grayscale( - num_output_channels: int = 1, - keys: Optional[Union[List[str], Tuple[str, ...]]] = None -) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| --------------------------- | ------------------------------ | --------------------- | -| num_output_channels | num_output_channels | 输出图像的通道数。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Pad.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Pad.md deleted file mode 100644 index b3a484fa6a7..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.Pad.md +++ /dev/null @@ -1,32 +0,0 @@ -## [ paddle 参数更多 ]torchvision.transforms.Pad - -### [torchvision.transforms.Pad](https://pytorch.org/vision/main/generated/torchvision.transforms.Pad.html) - -```python -torchvision.transforms.Pad( - padding: Union[int, List[int], Tuple[int, ...]], - fill: Union[int, List[int], Tuple[int, ...]] = 0, - padding_mode: str = 'constant' -) -``` - -### [paddle.vision.transforms.Pad](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/Pad__upper_cn.html#pad) -```python -paddle.vision.transforms.Pad( - padding: Union[int, List[int], Tuple[int, ...]], - fill: Union[int, List[int], Tuple[int, ...]] = 0, - padding_mode: str = 'constant', - keys: Optional[Union[List[str], Tuple[str, ...]]] = None -) -``` - -两者功能一致,但 Paddle 相比 torchvision 支持更多参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------- | ------------- | ----------------------------- | -| padding | padding | 在图像边界上进行填充的范围。 | -| fill | fill | 多通道图像填充。 | -| padding_mode | padding_mode | 填充模式。| -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.RandomCrop.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.RandomCrop.md deleted file mode 100644 index fea93a59d71..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.RandomCrop.md +++ /dev/null @@ -1,36 +0,0 @@ -## [ paddle 参数更多 ]torchvision.transforms.RandomCrop -### [torchvision.transforms.RandomCrop](https://pytorch.org/vision/main/generated/torchvision.transforms.RandomCrop.html) -```python -torchvision.transforms.RandomCrop( - size: Union[int, List[int], Tuple[int, ...]], - padding: Optional[Union[int, List[int], Tuple[int, ...]]] = None, - pad_if_needed: bool = False, - fill: Union[float, Tuple[float, ...]] = 0, - padding_mode: str = 'constant' -) -``` - -### [paddle.vision.transforms.RandomCrop](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/RandomCrop_cn.html) -```python -paddle.vision.transforms.RandomCrop( - size: Union[int, List[int], Tuple[int, ...]], - padding: Optional[Union[int, List[int], Tuple[int, ...]]] = None, - pad_if_needed: bool = False, - fill: Union[float, Tuple[float, ...]] = 0, - padding_mode: str = 'constant', - keys: Optional[Union[List[str], Tuple[str, ...]]] = None -) -``` - -两者功能一致,但 Paddle 相比 torchvision 支持更多参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| ------------- | -------------- | -------------------------------------------------------- | -| size | size | 裁剪后的图片大小。 | -| padding | padding | 对图像四周外边进行填充。 | -| pad_if_needed | pad_if_needed | 是否在裁剪前进行填充以满足大小要求。 | -| fill | fill | 用于填充的像素值。 | -| padding_mode | padding_mode | 填充模式。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ToTensor.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ToTensor.md deleted file mode 100644 index e4486c9d788..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.ToTensor.md +++ /dev/null @@ -1,19 +0,0 @@ -## [ paddle 参数更多 ]torchvision.transforms.ToTensor -### [torchvision.transforms.ToTensor](https://pytorch.org/vision/main/generated/torchvision.transforms.ToTensor.html?highlight=totensor#torchvision.transforms.ToTensor) -```python -torchvision.transforms.ToTensor() -``` - -### [paddle.vision.transforms.ToTensor](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/ToTensor_cn.html#totensor) -```python -paddle.vision.transforms.ToTensor(data_format: str = 'CHW', keys: List[str] | Tuple[str] = None) -``` - -两者功能基本一致,但 Paddle 相比 torchvision 支持更多参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -|-------------- |-------------------- |----------------------------------- | -| - | data_format | 返回 Tensor 的格式,PyTorch 无此参数,Paddle 保持默认即可。 | -| - | keys | 输入的类型,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.functional.to_tensor.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.functional.to_tensor.md deleted file mode 100644 index 03c0eeeeae6..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/paddle_more_args/torchvision.transforms.functional.to_tensor.md +++ /dev/null @@ -1,22 +0,0 @@ -## [ paddle 参数更多 ]torchvision.transforms.functional.to_tensor -### [torchvision.transforms.functional.to_tensor](https://pytorch.org/vision/main/generated/torchvision.transforms.functional.to_tensor.html) -```python -torchvision.transforms.functional.to_tensor(pic: Union[PIL.Image.Image, numpy.ndarray]) -``` - -### [paddle.vision.transforms.to_tensor](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/vision/transforms/to_tensor_cn.html) -```python -paddle.vision.transforms.to_tensor( - pic: Union[PIL.Image.Image, np.ndarray], - data_format: str = 'CHW' -) -``` - -其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下: - -### 参数映射 - -| torchvision | PaddlePaddle | 备注 | -| --------- | ------------- | ------------------------------ | -| pic | pic | 输入图像。 | -| - | data_format | 返回的 Tensor 的格式,PyTorch 无此参数,Paddle 保持默认即可。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.Tensor.bernoulli.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.Tensor.bernoulli.md deleted file mode 100644 index 75547c5ed61..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.Tensor.bernoulli.md +++ /dev/null @@ -1,32 +0,0 @@ -## [ torch 参数更多 ]torch.Tensor.bernoulli -### [torch.Tensor.bernoulli](https://pytorch.org/docs/stable/generated/torch.Tensor.bernoulli.html#torch.Tensor.bernoulli) -```python -torch.Tensor.bernoulli(p=None, *, generator=None) -``` - -### [paddle.bernoulli](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/bernoulli_cn.html#bernoulli) -```python -paddle.bernoulli(x, p=None, name=None) -``` - -Pytorch 为 Tensor 类方法,Paddle 为普通函数,另外 PyTorch 相比 Paddle 支持更多其他参数。具体如下: - - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ----------------------------------------------------------------------------- | -| self | x | 伯努利参数 Tensor,将调用 torch.Tensor 类方法的 self Tensor 传入。 | -| p | p | 可选,伯努利参数 p。 | -| generator | - | 用于采样的伪随机数生成器, Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | - - -### 转写示例 -#### self:调用类方法的 Tensor -```python -# PyTorch 写法 -x.bernoulli() - -# Paddle 写法 -paddle.bernoulli(x) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.cuda.is_bf16_supported.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.cuda.is_bf16_supported.md new file mode 100644 index 00000000000..3f3dd733c4b --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.cuda.is_bf16_supported.md @@ -0,0 +1,22 @@ +## [ torch 参数更多 ]torch.cuda.is_bf16_supported + +### [torch.cuda.is_bf16_supported](https://pytorch.org/docs/stable/generated/torch.cuda.is_bf16_supported.html#torch.cuda.is_bf16_supported) + +```python +torch.cuda.is_bf16_supported(including_emulation=True) +``` + +### [paddle.amp.is_bfloat16_supported](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/amp/is_bfloat16_supported_cn.html#paddle/amp/is_bfloat16_supported_cn#cn-api-paddle-amp-is_bfloat16_supported) + +```python +paddle.amp.is_bfloat16_supported(device=None) +``` + +PyTorch 相比 Paddle 支持更多其他参数,具体如下: + +### 参数映射 + +| PyTorch | PaddlePaddle | 备注 | +| ---------- | ------------ | -- | +| including_emulation | - | 是否包含软件模拟支持,暂无转写方式。 | +| - | device | 查询的设备类型, PyTorch 无此参数,Paddle 保持默认即可。| diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.distributed.ReduceOp.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.distributed.ReduceOp.md deleted file mode 100644 index 2d7a675e375..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.distributed.ReduceOp.md +++ /dev/null @@ -1,27 +0,0 @@ -## [ torch 参数更多 ]torch.distributed.ReduceOp -### [torch.distributed.ReduceOp](https://pytorch.org/docs/stable/distributed.html?highlight=torch+distributed+reduceop#torch.distributed.ReduceOp) -```python -torch.distributed.ReduceOp -``` - -### [paddle.distributed.ReduceOp](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/distributed/ReduceOp_cn.html) -```python -paddle.distributed.ReduceOp -``` - -两者功能一致。 - -其中,规约操作对应如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ---- | ---- | --- | -| SUM | SUM | | -| PRODUCT | PROD | | -| MIN | MIN | | -| MAX | MAX | | -| BAND | - | | -| BOR | - | | -| BXOR | - | | -| PREMUL_SUM | - | | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.median.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.median.md deleted file mode 100644 index 35e6f3ed736..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.median.md +++ /dev/null @@ -1,37 +0,0 @@ -## [ torch 参数更多 ]torch.median -### [torch.median](https://pytorch.org/docs/stable/generated/torch.median.html?highlight=median#torch.median) -```python -torch.median(input, - dim=-1, - keepdim=False, - *, - out=None) -``` - -### [paddle.median](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/median_cn.html#median) -```python -paddle.median(x, axis=None, keepdim=False, mode='avg', name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 表示输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 表示进行运算的轴,仅参数名不一致。 | -| keepdim | keepdim | 是否在输出 Tensor 中保留减小的维度。 | -| - | mode | 当 x 在所需要计算的轴上有偶数个非 NaN 元素时,选择使用平均值或最小值确定非 NaN 中位数的值, PyTorch 无此参数,Paddle 需设置为 'min'。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# PyTorch 写法 -torch.median([3, 5], out=y) - -# Paddle 写法 -paddle.assign(paddle.median([3, 5], mode='min'), y) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nanmedian.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nanmedian.md deleted file mode 100644 index 28203bf6177..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nanmedian.md +++ /dev/null @@ -1,37 +0,0 @@ -## [ torch 参数更多 ]torch.nanmedian -### [torch.nanmedian](https://pytorch.org/docs/stable/generated/torch.nanmedian.html?highlight=nanmedian#torch.nanmedian) -```python -torch.nanmedian(input, - dim=-1, - keepdim=False, - *, - out=None) -``` - -### [paddle.nanmedian](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nanmedian_cn.html#nanmedian) -```python -paddle.nanmedian(x, axis=None, keepdim=False, mode='avg', name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------ | -| input | x | 表示输入的 Tensor ,仅参数名不一致。 | -| dim | axis | 表示进行运算的轴,仅参数名不一致。 | -| keepdim | keepdim | 表示是否在输出 Tensor 中保留减小的维度。 | -| - | mode | 当 x 在所需要计算的轴上有偶数个非 NaN 元素时,选择使用平均值或最小值确定非 NaN 中位数的值, PyTorch 无此参数,Paddle 需设置为 'min'。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | - - -### 转写示例 -#### out:指定输出 -```python -# PyTorch 写法 -torch.nanmedian(a, -1, out=y) - -# Paddle 写法 -paddle.assign(paddle.nanmedian(a, -1, mode='min'), y) -``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.CTCLoss.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.CTCLoss.md deleted file mode 100644 index 6f10e2691b9..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.CTCLoss.md +++ /dev/null @@ -1,23 +0,0 @@ -## [ torch 参数更多 ]torch.nn.CTCLoss -### [torch.nn.CTCLoss](https://pytorch.org/docs/stable/generated/torch.nn.CTCLoss.html#torch.nn.CTCLoss) -```python -torch.nn.CTCLoss(blank=0, - reduction='mean', - zero_infinity=False) -``` - -### [paddle.nn.CTCLoss](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/CTCLoss_cn.html#ctcloss) -```python -paddle.nn.CTCLoss(blank=0, - reduction='mean') -``` - -其中,torch 的 log_softmax+ctc_loss 相当于 paddle 的 ctc_loss,是一个二对一的情况,暂时无法转写,且 PyTorch 相比 Paddle 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| ------------- | ------------ | ------------------------------------------------------------ | -| blank | blank | 空格标记的 ID 值。 | -| reduction | reduction | 表示应用于输出结果的计算方式。 | -| zero_infinity | - | 是否将无穷大损失及其梯度置 0,Paddle 无此参数,暂无转写方式。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.Module.train.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.Module.train.md new file mode 100644 index 00000000000..b18f4ffb8af --- /dev/null +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.Module.train.md @@ -0,0 +1,21 @@ +## [ torch 参数更多 ]torch.nn.Module.train + +### [torch.nn.Module.train](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.train) + +```python +torch.nn.Module.train(mode=True) +``` + +### [paddle.nn.Layer.train](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/Layer/train_cn.html#paddle/nn/Layer/train_cn#cn-api-paddle-nn-Layer-train) + +```python +paddle.nn.Layer.train() +``` + +PyTorch 相比 Paddle 支持更多其他参数,具体如下: + +### 参数映射 + +| PyTorch | PaddlePaddle | 备注 | +| ---------- | ------------ | -- | +| `mode` | 无 | 设置训练模式,Paddle 无此参数,暂无转写方式。| diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.functional.ctc_loss.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.functional.ctc_loss.md deleted file mode 100644 index f8d1b705da2..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.functional.ctc_loss.md +++ /dev/null @@ -1,24 +0,0 @@ -## [ torch 参数更多 ]torch.nn.functional.ctc_loss -### [torch.nn.functional.ctc_loss](https://pytorch.org/docs/stable/generated/torch.nn.functional.ctc_loss.html#torch.nn.functional.ctc_loss) -```python -torch.nn.functional.ctc_loss(log_probs, targets, input_lengths, target_lengths, blank=0, reduction='mean', zero_infinity=False) -``` - -### [paddle.nn.functional.ctc_loss](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/ctc_loss_cn.html) -```python -paddle.nn.functional.ctc_loss(log_probs, labels, input_lengths, label_lengths, blank=0, reduction='mean') -``` - -其中 torch 的 log_softmax+ctc_loss 相当于 paddle 的 ctc_loss,是一个二对一的情况,暂时无法转写。PyTorch 相比 Paddle 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| -------------- | ------------- | ------------------------------------------------------------------ | -| log_probs | log_probs | 经过 padding 的概率序列。 | -| targets | labels | 经过 padding 的标签序列,仅参数名不一致。 | -| input_lengths | input_lengths | 表示输入 log_probs 数据中每个序列的长度。 | -| target_lengths | label_lengths | 表示 label 中每个序列的长度,仅参数名不一致。 | -| blank | blank | 空格标记的 ID 值。 | -| reduction | reduction | 指定应用于输出结果的计算方式。 | -| zero_infinity | - | 是否设置 infinity 及关联梯度 为 0,Paddle 无此参数,暂无转写方式。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.functional.softmax.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.functional.softmax.md deleted file mode 100644 index 0287897cb35..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.nn.functional.softmax.md +++ /dev/null @@ -1,21 +0,0 @@ -## [ torch 参数更多 ]torch.nn.functional.softmax -### [torch.nn.functional.softmax](https://pytorch.org/docs/stable/generated/torch.nn.functional.softmax.html#torch.nn.functional.softmax) -```python -torch.nn.functional.softmax(input, dim=None, _stacklevel=3, dtype=None) -``` - -### [paddle.nn.functional.softmax](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/functional/softmax_cn.html#softmax) -```python -paddle.nn.functional.softmax(x, axis=-1, dtype=None, name=None) -``` - -PyTorch 相比 Paddle 支持更多其他参数,具体如下: - -### 参数映射 - -| PyTorch | PaddlePaddle | 备注 | -| --------- | -------------- | ----------------------------------------------------- | -| input | x | 表示输入张量,仅参数名不一致。 | -| dim | axis | 表示对输入 Tensor 进行运算的轴,仅参数名不一致。 | -| dtype | dtype | 表示返回张量所需的数据类型。 | -| _stacklevel | - | Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.optim.Optimizer.step.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.optim.Optimizer.step.md index d56ee5207fa..ecf89d2b680 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.optim.Optimizer.step.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.optim.Optimizer.step.md @@ -1,10 +1,13 @@ ## [ torch 参数更多 ]torch.optim.Optimizer.step -### [torch.optim.Optimizer.step](https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.step.html#torch-optim-optimizer-step) + +### [torch.optim.Optimizer.step](https://pytorch.org/docs/stable/generated/torch.optim.Optimizer.html#torch.optim.Optimizer.step) + ```python -torch.optim.Optimizer.step(closure) +torch.optim.Optimizer.step(closure=None) ``` -### [paddle.optimizer.Optimizer.step](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/optimizer/Optimizer_cn.html#step) +### [paddle.optimizer.Optimizer.step](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/optimizer/Optimizer/step_cn.html#paddle/optimizer/Optimizer/step_cn#cn-api-paddle-optimizer-Optimizer-step) + ```python paddle.optimizer.Optimizer.step() ``` @@ -13,6 +16,6 @@ PyTorch 相比 Paddle 支持更多其他参数,具体如下: ### 参数映射 -| PyTorch | PaddlePaddle | 备注 | -| -------- | ---------- | ---------------- | -| closure | - | 重新评估模型并返回损失的闭包, Paddle 无此参数,暂无转写方式。 | +| PyTorch | PaddlePaddle | 备注 | +| ---------- | ------------ | -- | +| closure | - | 传入一个闭包函数,在优化器更新参数前执行。Paddle 无此参数,暂无转写方式。| diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/transformers.GenerationConfig.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/transformers.GenerationConfig.md index 42aeecd5e97..9e25ac758ff 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/transformers.GenerationConfig.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/transformers.GenerationConfig.md @@ -16,9 +16,9 @@ paddlenlp.generation.GenerationConfig(*kwargs) | transformers | PaddlePaddle | 备注 | | -------------------------------------| ------------------- | -------- | | max_length | max_length | 最大生成长度。 | -| max_new_tokens | - | 最大生成长度(忽略 promot),Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。| +| max_new_tokens | - | 最大生成长度(忽略 prompt),Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。| | min_length | min_length | 最小生成长度。 | -| min_new_tokens | - | 最小生成长度(忽略 promot),Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | +| min_new_tokens | - | 最小生成长度(忽略 prompt),Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | | early_stopping | early_stopping | 早停是否开启。 | | max_time | - | 最大允许计算运行时间,Paddle 无此参数,一般对网络训练结果影响不大,可直接删除。 | | do_sample | do_sample | 是否进行采样。 | diff --git a/docs/guides/model_convert/convert_from_pytorch/convert_net_structure_cn.md b/docs/guides/model_convert/convert_from_pytorch/convert_net_structure_cn.md index 217bfd4216f..b892a06720b 100644 --- a/docs/guides/model_convert/convert_from_pytorch/convert_net_structure_cn.md +++ b/docs/guides/model_convert/convert_from_pytorch/convert_net_structure_cn.md @@ -360,7 +360,7 @@ https://www.paddlepaddle.org.cn/modelbase。 仍然以 LeNet 模型为例,手工转化的具体操作如下。 -1. 通过阅读 PyTorch 源码可知,构建 LeNet 使用到的 PyTorch API 有:`nn.Module`, `nn.Squential`, `nn.Conv2d`, `nn.ReLU`, `nn.MaxPool2d`, `nn.Linear`以及`torch.flatten`。 +1. 通过阅读 PyTorch 源码可知,构建 LeNet 使用到的 PyTorch API 有:`nn.Module`, `nn.Sequential`, `nn.Conv2d`, `nn.ReLU`, `nn.MaxPool2d`, `nn.Linear`以及`torch.flatten`。 2. 通过查找 [PyTorch-飞桨 API 映射表](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/model_convert/pytorch_api_mapping_cn.html),找到对应的飞桨 API: | **PyTorch** | **飞桨** | 差异对比 | diff --git a/docs/guides/model_convert/convert_from_pytorch/nlp_fast_explore_cn.md b/docs/guides/model_convert/convert_from_pytorch/nlp_fast_explore_cn.md index cf83cf41c2e..f890d2bcd22 100644 --- a/docs/guides/model_convert/convert_from_pytorch/nlp_fast_explore_cn.md +++ b/docs/guides/model_convert/convert_from_pytorch/nlp_fast_explore_cn.md @@ -387,7 +387,7 @@ def _init_weights(self, module): | [torch.nn.Dropout](https://pytorch.org/docs/stable/generated/torch.nn.Dropout.html?highlight=dropout#torch.nn.Dropout) | [paddle.nn.Dropout](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/Dropout_cn.html#dropout) | PyTorch 有 inplace 参数,表示在不更改变量的内存地址的情况下,直接修改变量的值,飞桨无此参数。 | | [torch.nn.Linear](https://pytorch.org/docs/stable/generated/torch.nn.Linear.html?highlight=linear#torch.nn.Linear) | [paddle.nn.Linear](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/Linear_cn.html#linear) | PyTorch `bias`默认为 True,表示使用可更新的偏置参数。飞桨 `weight_attr`/`bias_attr`默认使用默认的权重/偏置参数属性,否则为指定的权重/偏置参数属性,具体用法参见[ParamAttr](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/ParamAttr_cn.html#paramattr);当`bias_attr`设置为 bool 类型与 PyTorch 的作用一致。 | | [torch.nn.LayerNorm](https://pytorch.org/docs/stable/generated/torch.nn.LayerNorm.html?highlight=layernorm#torch.nn.LayerNorm) | [paddle.nn.LayerNorm](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/nn/LayerNorm_cn.html#layernorm) | 注意参数 epsilon 不同模型参数值,可能不同,对模型精度影响大。 | -| [torch.nn.Embedding](https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html?highlight=embedding#torch.nn.Embedding) | [paddle.nn.Embedding](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/Embedding_cn.html#embedding) | PyTorch:当 max_norm 不为`None`时,如果 Embeddding 向量的范数(范数的计算方式由 norm_type 决定)超过了 max_norm 这个界限,就要再进行归一化。PaddlePaddle:PaddlePaddle 无此要求,因此不需要归一化。PyTorch:若 scale_grad_by_freq 设置为`True`,会根据单词在 mini-batch 中出现的频率,对梯度进行放缩。 PaddlePaddle:PaddlePaddle 无此功能。 | +| [torch.nn.Embedding](https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html?highlight=embedding#torch.nn.Embedding) | [paddle.nn.Embedding](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/nn/Embedding_cn.html#embedding) | PyTorch:当 max_norm 不为`None`时,如果 Embedding 向量的范数(范数的计算方式由 norm_type 决定)超过了 max_norm 这个界限,就要再进行归一化。PaddlePaddle:PaddlePaddle 无此要求,因此不需要归一化。PyTorch:若 scale_grad_by_freq 设置为`True`,会根据单词在 mini-batch 中出现的频率,对梯度进行放缩。 PaddlePaddle:PaddlePaddle 无此功能。 | ### 3.2 权重转换 diff --git a/docs/guides/model_convert/convert_from_pytorch/nlp_migration_experiences_cn.md b/docs/guides/model_convert/convert_from_pytorch/nlp_migration_experiences_cn.md index a9de43df157..1642f47c404 100644 --- a/docs/guides/model_convert/convert_from_pytorch/nlp_migration_experiences_cn.md +++ b/docs/guides/model_convert/convert_from_pytorch/nlp_migration_experiences_cn.md @@ -354,7 +354,7 @@ A:有的,例如: 下面以 BERT 模型为例介绍转换的过程: - 如果 PyTorch repo 中已经提供权重,那么可以直接下载并进行后续的转换。huggingface 的 transformers 中提供了大部分模型参数,使用模型权重名称`model_name_or_path`即可加载(如`bert-base-uncased`)。或者从 huggingface 官网直接下载:https://huggingface.co/bert-base-uncased/tree/main -- 如果没有提供,则可以基于 PyTorch 代码,随机生成一个初始化权重(定义完 model 以后,使用`torch.save()` API 保存模型权重),然后将生成的 PyTorch 权重 (`bert_sequence_classfy.pth`) 转换为飞桨模型权重。 +- 如果没有提供,则可以基于 PyTorch 代码,随机生成一个初始化权重(定义完 model 以后,使用`torch.save()` API 保存模型权重),然后将生成的 PyTorch 权重 (`bert_sequence_classify.pth`) 转换为飞桨模型权重。 ```python from transformers import BertModel @@ -366,7 +366,7 @@ PATH = './torch_weight.bin' torch.save(hf_model.state_dict(), PATH) ``` -然后将生成的 PyTorch 权重 (`bert_sequence_classfy.pth`) 转换为飞桨模型权重,转换代码如下(代码解释详见代码后的 FAQ) +然后将生成的 PyTorch 权重 (`bert_sequence_classify.pth`) 转换为飞桨模型权重,转换代码如下(代码解释详见代码后的 FAQ) ```python def convert_pytorch_checkpoint_to_paddle( diff --git a/docs/guides/model_convert/convert_from_pytorch/pytorch_api_mapping_cn.md b/docs/guides/model_convert/convert_from_pytorch/pytorch_api_mapping_cn.md index 508d5dcad7d..7498ba01435 100644 --- a/docs/guides/model_convert/convert_from_pytorch/pytorch_api_mapping_cn.md +++ b/docs/guides/model_convert/convert_from_pytorch/pytorch_api_mapping_cn.md @@ -31,10 +31,10 @@ **简介:此类 API 没有转写成本,两者用法完全一致,** 只需将代码中所有前缀 ``torch.`` 替换为 ``paddle.`` 即可。(也可只在文件最上方插入一行 ``import paddle as torch``)。示例如下。 ```python -# PyTorch 写法 -> Paddle 写法 -torch.eye(5) -> paddle.eye(5) -torch.einsum('ii->i', x) -> paddle.einsum('ii->i', x) -torch.nn.Softplus(beta=0.5, threshold=15) -> paddle.nn.Softplus(beta=0.5, threshold=15) +# PyTorch 写法 -> Paddle 写法 +torch.eye(5) -> paddle.eye(5) +torch.einsum('ii->i', x) -> paddle.einsum('ii->i', x) +torch.nn.Softplus(beta=0.5, threshold=15) -> paddle.nn.Softplus(beta=0.5, threshold=15) ``` @@ -46,11 +46,11 @@ torch.nn.Softplus(beta=0.5, threshold=15) -> paddle.nn.Softplus(beta=0.5, thresh **简介:** 此类 API 的转写成本较低,只需对 API 调用方式进行改写,无需转写 API 参数部分。示例如下。 ```python -# PyTorch 写法 -> Paddle 写法 -torch.numel(x) -> x.size # Tensor 方法转属性 -out = x.matrix_exp() -> paddle.linalg.matrix_exp(x) # 函数转方法 -out = x.to_sparse(1) -> x.to_sparse_coo(1) # 函数名不同 -out = x.clamp_(-0.5, 0.5) -> x.clip_(-0.5, 0.5) # 函数名不同 +# PyTorch 写法 -> Paddle 写法 +torch.numel(x) -> x.size # Tensor 方法转属性 +out = x.matrix_exp() -> paddle.linalg.matrix_exp(x) # 函数转方法 +out = x.to_sparse(1) -> x.to_sparse_coo(1) # 函数名不同 +out = x.clamp_(-0.5, 0.5) -> x.clip_(-0.5, 0.5) # 函数名不同 ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/README.md b/docs/guides/model_convert/convert_from_pytorch/tools/README.md index 6b0dccc91c5..6db38878bc1 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/README.md +++ b/docs/guides/model_convert/convert_from_pytorch/tools/README.md @@ -81,8 +81,8 @@ paddle.Tensor.atan2(y, name=None) - `paddle API` 中 `paddle api` 和 `paddle signature` 解析结果是否一致; - `参数映射` 表格是否成功解析(表格每行 3 列) - 状态机结束状态: - - `无参数` 或 `组合替代实现`:允许无参数映射表 - - `组合替代实现` 或更靠后的映射类型:允许无 **paddle API** 部分 + - `仅 API 调用方式不一致` 或 `组合替代实现`:允许无参数映射表 + - `仅 API 调用方式不一致` 或 `组合替代实现`:允许无 **paddle API** 部分 - 其他类型:必须有所有结构 通过设计这一系列约束,可以检查映射文档中粗心疏漏导致的错误,从而降低检查成本;此外,通过将文档解析得到结构化的元数据(`docs_mapping.json`),能为后续流程提供数据支持。 diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/generate_api_difference.py b/docs/guides/model_convert/convert_from_pytorch/tools/generate_api_difference.py deleted file mode 100644 index bc2897d96c2..00000000000 --- a/docs/guides/model_convert/convert_from_pytorch/tools/generate_api_difference.py +++ /dev/null @@ -1,608 +0,0 @@ -from __future__ import annotations - -import argparse -import ast -import contextlib -import inspect -import io -import os -import re -import subprocess -import sys -import textwrap - -from utils import ( - extract_no_need_convert_list, - get_paddle_url, - get_pytorch_url, - load_mapping_json, -) - - -class APIConversionError(Exception): - """自定义异常类,用于API转换过程中的错误""" - - def __init__(self, message, api_name=None): - self.message = message - self.api_name = api_name - super().__init__(self.message) - - def __str__(self): - return f"API Conversion Error for {self.api_name}: {self.message}" - - -def get_function_signature(api_name: str, framework: str) -> str: - """ - 获取API的函数签名,支持普通函数、类方法、内置方法等 - - Args: - api_name: API的全限定名 - framework: 框架名称 - - Returns: - 函数签名字符串 - """ - # 导入框架 - if framework == "torch": - import torch - - module = torch - elif framework == "paddle": - import paddle - - module = paddle - elif framework == "fairscale": - import fairscale - - module = fairscale - elif framework == "transformers": - import transformers - - module = transformers - elif framework == "torchvision": - import torchvision - - module = torchvision - elif framework == "flash_attn": - import flash_attn - - module = flash_attn - else: - raise ValueError("Invalid framework.") - - # 解析API路径 - parts = api_name.split(".")[1:] - api_obj = module - - try: - for part in parts: - api_obj = getattr(api_obj, part) - except Exception as e: - raise ValueError(f"Failed to parse API path: {e}") from e - - # 优先尝试inspect.signature(适用于普通函数和方法) - try: - # 处理类的情况(获取__init__方法) - if inspect.isclass(api_obj): - sig = inspect.signature(api_obj.__init__) - # 移除self参数 - params = [] - first_param = True - for name, param in sig.parameters.items(): - if first_param and name == "self": - first_param = False - continue - first_param = False - params.append(format_param(param)) - - return f"{api_name}({', '.join(params)})" - - # 处理普通函数和方法 - sig = inspect.signature(api_obj) - params = [format_param(param) for param in sig.parameters.values()] - return f"{api_name}({', '.join(params)})" - - except (ValueError, TypeError): - # 如果inspect失败,使用help信息解析 - return parse_signature_from_help(api_obj, api_name) - - -def format_param(param: inspect.Parameter) -> str: - """格式化参数,保留*和**符号""" - if param.kind == param.VAR_POSITIONAL: - return f"*{param.name}" - elif param.kind == param.VAR_KEYWORD: - return f"**{param.name}" - else: - return param.name - - -def parse_signature_from_help(api_obj, api_name: str) -> str: - """从help信息中解析函数签名""" - - # 捕获help输出 - help_output = get_help_output(api_obj, api_name) - if not help_output: - return f"{api_name}(...)" - - # 解析函数签名行 - signature_line = extract_signature_line(help_output, api_name) - if signature_line: - return normalize_signature(signature_line, api_name) - - return f"{api_name}(...)" - - -def get_help_output(api_obj, api_name: str) -> str | None: - """获取API对象的help输出""" - try: - with io.StringIO() as buffer: - with contextlib.redirect_stdout(buffer): - help(api_obj) - return buffer.getvalue() - except: - raise APIConversionError(f"Failed to get help output for {api_name}") - - -def extract_signature_line(help_text: str, api_name: str) -> str | None: - """从help文本中提取签名行""" - lines = help_text.split("\n") - base_name = api_name.split(".")[-1] - - # 匹配模式:函数名后跟括号 - patterns = [ - # 匹配: numel(...) 或 forward(*args: Any, **kwargs: Any) -> Any - rf"^{re.escape(base_name)}\s*\([^)]*\)", - # 匹配: | ZeroPad2d(padding: Union[int, tuple[int, int, int, int]]) -> None - rf"^\s*[\| ]*\w+\s+{re.escape(base_name)}\s*\([^)]*\)", - # 匹配类定义中的签名 - rf"^class\s+\w+\(.*\):\s*\n\s*[\| ]*{re.escape(base_name)}\s*\([^)]*\)", - ] - - for i, line in enumerate(lines): - for pattern in patterns: - if re.search(pattern, line.strip()): - # 对于多行签名,合并后续行直到遇到空行或缩进减少 - signature = line.strip() - j = i + 1 - while ( - j < len(lines) - and lines[j].strip() - and not lines[j].strip().startswith(("def ", "class ")) - ): - signature += " " + lines[j].strip() - j += 1 - return signature - - raise APIConversionError(f"Failed to extract signature line for {api_name}") - - -def normalize_signature(signature_line: str, api_name: str) -> str: - """规范化签名格式""" - # 提取括号内的内容 - match = re.search(r"\(([^)]*)\)", signature_line) - if not match: - return f"{api_name}()" - - params_str = match.group(1) - - # 处理不同的参数格式 - if params_str == "...": # 如: numel(...) - return f"{api_name}()" - - # 解析参数,移除类型注解和默认值 - params = [] - current_param = [] - depth = 0 # 处理嵌套括号 - - for char in params_str + ",": # 添加逗号确保处理最后一个参数 - if char == "," and depth == 0: - param = "".join(current_param).strip() - if param: - # 提取参数名(移除类型注解) - param_name = extract_param_name(param) - if param_name: - params.append(param_name) - current_param = [] - else: - if char == "(": - depth += 1 - elif char == ")": - depth -= 1 - current_param.append(char) - - # 处理特殊参数格式 - final_params = [] - for param in params: - if param.startswith("*") and param.endswith(": Any"): - # 处理 *args: Any, **kwargs: Any - param = param.replace(": Any", "") - elif "=" in param and not param.startswith("*"): - # 移除默认值,保留参数名 - param = param.split("=")[0].strip() - - final_params.append(param) - - return f"{api_name}({', '.join(final_params)})" - - -def extract_param_name(param_str: str) -> str | None: - """从参数字符串中提取参数名""" - param_str = param_str.strip() - - if not param_str: - return None - - # 处理可变参数 *args, **kwargs - if param_str.startswith("*") and param_str.endswith(": Any"): - return param_str.replace(": Any", "") - - # 移除类型注解 - if ":" in param_str: - # 找到第一个冒号(类型注解开始) - colon_pos = param_str.find(":") - param_name = param_str[:colon_pos].strip() - - # 检查是否是可变参数 - if param_name.startswith("*"): - return param_name - else: - return param_name - else: - # 没有类型注解,直接返回 - return ( - param_str.split("=")[0].strip() if "=" in param_str else param_str - ) - - -def find_test_file(torch_api: str, paconvert_dir: str) -> str: - """ - 在paconvert的tests目录中递归查找测试文件 - - Args: - torch_api: Torch API名称 - paconvert_dir: paconvert目录路径 - - Returns: - 测试文件路径 - """ - # 生成测试文件名(如:test_nn_functional_elu.py) - head = torch_api.split(".")[0] - if head == "flash_attn": - parts = torch_api.split(".") - else: - parts = torch_api.split(".")[1:] - file_name = "test_" + "_".join(parts) + ".py" - - # 在tests目录中递归查找 - test_dir = os.path.join(paconvert_dir, "tests") - for root, _, files in os.walk(test_dir): - if file_name in files: - return os.path.join(root, file_name) - - raise APIConversionError(f"Test file not found for {torch_api}", torch_api) - - -def extract_test_case_code(test_file: str) -> str: - """ - 从测试文件中提取第一个测试用例的pytorch代码 - - Args: - test_file: 测试文件路径 - - Returns: - 提取的pytorch代码字符串 - """ - with open(test_file, "r", encoding="utf-8") as f: - content = f.read() - - # 解析AST找到第一个测试函数 - module = ast.parse(content) - - for node in module.body: - if isinstance(node, ast.FunctionDef) and node.name.startswith("test_"): - # 在测试函数中查找pytorch_code的赋值语句 - for item in node.body: - if isinstance(item, ast.Assign): - for target in item.targets: - if ( - isinstance(target, ast.Name) - and target.id == "pytorch_code" - ): - # 检查赋值语句的值是否是函数调用 - if isinstance(item.value, ast.Call): - call_func = item.value.func - # 检查是否是textwrap.dedent调用 - if ( - isinstance(call_func, ast.Attribute) - and isinstance(call_func.value, ast.Name) - and call_func.value.id == "textwrap" - and call_func.attr == "dedent" - ): - # 获取dedent的第一个参数(应该是字符串) - if item.value.args and isinstance( - item.value.args[0], ast.Str - ): - # 返回字符串内容,去除首尾的三引号 - code_str = item.value.args[0].s - return textwrap.dedent(code_str) - - # 处理Python 3.8+的ast.Constant节点 - elif ( - item.value.args - and isinstance( - item.value.args[0], ast.Constant - ) - and isinstance( - item.value.args[0].value, str - ) - ): - code_str = item.value.args[0].value - return textwrap.dedent(code_str) - - raise APIConversionError(f"Test case not found in {test_file}", test_file) - - -def get_torch_example(torch_api: str, paconvert_dir: str) -> str: - """ - 获取Torch API的示例代码 - - Args: - torch_api: Torch API名称 - paconvert_dir: paconvert目录路径 - - Returns: - Torch API调用代码 - """ - # 1. 查找测试文件 - test_file = find_test_file(torch_api, paconvert_dir) - - # 2. 提取测试用例代码 - test_code = extract_test_case_code(test_file) - - # 3. 写入临时文件 - torch_temp_file = f"temp_generate_api_difference_{torch_api.replace('.', '_')}_torch_code.py" - with open(torch_temp_file, "w") as f: - f.write(test_code) - - # 4. 使用paconvert补全代码 - complete_file = f"temp_generate_api_difference_{torch_api.replace('.', '_')}_torch_code_complete.py" - try: - subprocess.run( - [ - "python3.10", - os.path.join(paconvert_dir, "paconvert", "main.py"), - "-i", - torch_temp_file, - "-o", - complete_file, - "--only_complete", - ], - check=True, - capture_output=True, - ) - - # 5. 替换import paddle为import torch - with open(complete_file, "r") as f: - lines = f.readlines() - - if lines and "import paddle" in lines[0]: - lines[0] = "import torch\n" - - with open(complete_file, "w") as f: - f.writelines(lines) - - # 6. 查找包含API调用的行 - with open(complete_file, "r") as f: - for line in f: - if torch_api.split(".")[-1] in line: - return line.strip() - - except subprocess.CalledProcessError as e: - raise APIConversionError( - f"paconvert failed: {e.stderr.decode().strip()}", torch_api - ) from e - - # 如果执行到这里,说明没有找到API调用 - raise APIConversionError( - f"torch API call not found in converted code for {torch_api}", torch_api - ) - - -def get_conversion_example( - torch_code: str, torch_api: str, paddle_api: str, paconvert_dir: str -) -> str: - """ - 使用paconvert转换Torch代码为Paddle代码 - - Args: - torch_code: Torch代码 - torch_api: Torch API名称(用于临时文件命名) - paddle_api: Paddle API名称 - paconvert_dir: paconvert目录路径 - - Returns: - Paddle API调用代码 - """ - # 1. 创建临时文件 - temp_file = f"temp_generate_api_difference_{torch_api.replace('.', '_')}_torch_code_complete.py" - # with open(temp_file, "w") as f: - # f.write(torch_code) - - # 2. 运行paconvert转换 - paddle_file = f"temp_generate_api_difference_{torch_api.replace('.', '_')}_paddle_code.py" - try: - subprocess.run( - [ - "python3.10", - os.path.join(paconvert_dir, "paconvert", "main.py"), - "-i", - temp_file, - "-o", - paddle_file, - ], - check=True, - capture_output=True, - ) - - # 3. 查找包含API调用的行 - with open(paddle_file, "r") as f: - for line in f: - if paddle_api.split(".")[-1] in line: - return line.strip() - - except subprocess.CalledProcessError as e: - raise APIConversionError( - f"paconvert conversion failed: {e.stderr.decode().strip()}", - torch_api, - ) from e - - # 如果执行到这里,说明没有找到API调用 - raise APIConversionError( - f"paddle API call not found in converted code for {torch_api}", - torch_api, - ) - - -def generate_invok_diff_only_docs( - output_dir: str, paconvert_dir: str, overwrite: bool = False -): - """ - 生成"仅 API 调用方式不一致"类别的API差异文档 - - Args: - output_dir: 输出目录 - paconvert_dir: PaConvert目录路径 - overwrite: 是否覆盖已有文件 - """ - script_dir = os.path.dirname(os.path.abspath(__file__)) - - api_mapping_path = os.path.join(script_dir, "api_mapping.json") - attribute_mapping_path = os.path.join(script_dir, "attribute_mapping.json") - global_var_path = os.path.join(script_dir, "global_var.py") - no_need_list = extract_no_need_convert_list(global_var_path) - - output_dir = os.path.join(script_dir, output_dir) - - whitelist_api = [ - "fairscale.nn.model_parallel.initialize.get_model_parallel_rank", - "fairscale.nn.model_parallel.initialize.get_model_parallel_world_size", - "flash_attn.__version__.split", - ] - - # 读取API映射 - api_mapping = load_mapping_json(api_mapping_path) - attribute_mapping = load_mapping_json(attribute_mapping_path) - api_mapping = api_mapping | attribute_mapping - - # 定义属于invok_diff_only类别的Matcher - invok_diff_matchers = [ - "ChangeAPIMatcher", - "TensorFunc2PaddleFunc", - "Func2Attribute", - "Attribute2Func", - "NumelMatcher", - "Is_InferenceMatcher", - ] - - # 创建输出目录 - test_output_dir = os.path.join(output_dir, "invok_diff_only") - actually_output_dir = os.path.join( - output_dir, "../../api_difference/invok_diff_only" - ) - os.makedirs(test_output_dir, exist_ok=True) - - # 生成文档 - for torch_api, mapping in api_mapping.items(): - if ( - mapping.get("Matcher") in invok_diff_matchers - and torch_api not in whitelist_api - and torch_api not in no_need_list - ): - paddle_api = mapping["paddle_api"] - print(f"Processing: {torch_api} -> {paddle_api}") - # 生成文件名 - file_name = f"{torch_api}.md" - file_path = os.path.join(test_output_dir, file_name) - if overwrite: - file_path = os.path.join(actually_output_dir, file_name) - - try: - # 获取URL - torch_url = get_pytorch_url(https://github.com/torch_api) - paddle_url = get_paddle_url(https://github.com/paddle_api) - - # 获取函数签名 - module = torch_api.split(".")[0] - torch_signature = get_function_signature(torch_api, module) - paddle_signature = get_function_signature(paddle_api, "paddle") - - # 生成转写示例 - torch_example = get_torch_example(torch_api, paconvert_dir) - paddle_example = get_conversion_example( - torch_example, torch_api, paddle_api, paconvert_dir - ) - - # 生成文档内容 - content = f"## [ 仅 API 调用方式不一致 ]{torch_api}\n\n" - content += f"### [{torch_api}]({torch_url})\n\n" - content += "```python\n" - content += f"{torch_signature}\n" - content += "```\n\n" - content += f"### [{paddle_api}]({paddle_url})\n\n" - content += "```python\n" - content += f"{paddle_signature}\n" - content += "```\n\n" - content += "两者功能一致,但调用方式不一致,具体如下:\n\n" - content += "### 转写示例\n\n" - content += "```python\n" - content += f"# PyTorch 写法\n{torch_example}\n\n" - content += f"# Paddle 写法\n{paddle_example}\n" - content += "```\n" - - # 保存文件 - with open(file_path, "w", encoding="utf-8") as f: - f.write(content) - - print(f"Generated: {file_path}") - - except APIConversionError as e: - print(f"ERROR: {e}", file=sys.stderr) - continue - except Exception as e: - print(f"UNEXPECTED ERROR: {e} for {torch_api}", file=sys.stderr) - continue - - -def main(): - parser = argparse.ArgumentParser( - description="Generate API difference documents for invok_diff_only category" - ) - parser.add_argument( - "--output_dir", - type=str, - default="test", - help="Output directory for generated docs", - ) - parser.add_argument( - "--paconvert_dir", - type=str, - default="/workspace/PaConvert", - help="Path to PaConvert directory", - ) - parser.add_argument( - "--overwrite", action="https://github.com/store_true", help="Overwrite existing files" - ) - - args = parser.parse_args() - - # 生成文档 - generate_invok_diff_only_docs( - output_dir=args.output_dir, - paconvert_dir=args.paconvert_dir, - overwrite=args.overwrite, - ) - - -if __name__ == "__main__": - main() diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/generate_pytorch_api_mapping.py b/docs/guides/model_convert/convert_from_pytorch/tools/generate_pytorch_api_mapping.py index 8d0a2088ba2..ff4b039c8f2 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/generate_pytorch_api_mapping.py +++ b/docs/guides/model_convert/convert_from_pytorch/tools/generate_pytorch_api_mapping.py @@ -122,6 +122,7 @@ def generate_category1_table( rows.append((torch_api, col2, col3, mapping_category, "-")) # 生成Markdown表格字符串 + rows = sorted(rows, key=lambda x: x[1].replace(r"\_", "_")) table_lines = TABLE_HEADER_LINES.copy() for idx, (_, col2, col3, mapping_category, remark) in enumerate( @@ -242,6 +243,7 @@ def generate_category2_table( existing_apis.add(src_api) # 生成Markdown表格字符串 + rows = sorted(rows, key=lambda x: x[1].replace(r"\_", "_")) table_lines = TABLE_HEADER_LINES.copy() for idx, (_, col2, col3, mapping_category, remark) in enumerate( @@ -269,7 +271,7 @@ def generate_api_alias_table( # 遍历api_alias_data,为每个别名映射生成表格行 for torch_api, torch_api_alias in api_alias_data.items(): # 检查API是否已经在前面的类别中处理过 - if torch_api in existing_apis or torch_api_alias in existing_apis: + if torch_api in existing_apis: continue # 在docs_mapping中查找torch_api_alias对应的Paddle API @@ -309,9 +311,9 @@ def generate_api_alias_table( used_apis.add(torch_api) used_apis.add(torch_api_alias) existing_apis.add(torch_api) - existing_apis.add(torch_api_alias) # 生成Markdown表格字符串 + rows = sorted(rows, key=lambda x: x[1].replace(r"\_", "_")) table_lines = TABLE_HEADER_LINES.copy() for idx, (_, col2, col3, mapping_category, remark) in enumerate( @@ -370,6 +372,7 @@ def generate_no_implement_table( ) # 检查API是否已经在前面的类别中处理过 + torch_api = torch_api.replace(r"\_", "_") if torch_api in existing_apis: continue @@ -409,9 +412,10 @@ def generate_no_implement_table( existing_apis.add(torch_api) # 生成Markdown表格字符串 + rows = sorted(rows, key=lambda x: x[1].replace(r"\_", "_")) table_lines = TABLE_HEADER_LINES.copy() - for idx, (_, col2, col3, mapping_category, remark) in enumerate( + for idx, (torch_api, col2, col3, mapping_category, remark) in enumerate( rows, start=1 ): table_lines.append( @@ -449,6 +453,7 @@ def update_mapping_table( if api_name in existing_apis: continue + existing_apis.add(api_name) mapping_info = api_mapping_dict.get(api_name, {}) dst_api = mapping_info.get("dst_api", "-") diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/get_api_difference_info.py b/docs/guides/model_convert/convert_from_pytorch/tools/get_api_difference_info.py index d9f05fe029c..13f0f919a4e 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/get_api_difference_info.py +++ b/docs/guides/model_convert/convert_from_pytorch/tools/get_api_difference_info.py @@ -15,47 +15,17 @@ validate_whitelist = [] mapping_type_levels = [ - # type 0 - ["UNDEFINED_MAPPING_TYPE_0"], - # type 1 [ - "无参数", - "参数完全一致", "仅 API 调用方式不一致", "仅参数名不一致", "paddle 参数更多", "参数默认值不一致", - ], - # type 2 - [ - "torch 参数更多", - ], - # type 3 - [ "返回参数类型不一致", "输入参数类型不一致", "输入参数用法不一致", - ], - # type 4 - [ + "torch 参数更多", "组合替代实现", ], - # type 5 - [ - "涉及上下文修改", - ], - # type 6 - [ - "对应 API 不在主框架", - ], - # type 7 - [ - "功能缺失", - ], - # delete - [ - "可删除", - ], ] mapping_type_set = {t for ts in mapping_type_levels for t in ts} @@ -477,7 +447,7 @@ def get_meta_from_diff_file( ) # 允许没有参数映射列表 - if mapping_type in ["无参数", "组合替代实现", "仅 API 调用方式不一致"]: + if mapping_type in ["组合替代实现", "仅 API 调用方式不一致"]: if state == ParserState.wait_for_args: state = ParserState.end # 必须有参数映射列表,但是可以随时停止 @@ -491,8 +461,8 @@ def get_meta_from_diff_file( ) # 允许的终止状态,解析完了 dst_api 或者只有 src_api - # 映射类型前三个级别必须要有对应的 dst_api - if mapping_type_to_level[mapping_type] <= 3: + # 映射类型除了 "组合替代实现" 和 "仅 API 调用方式不一致" 之外,其他的都必须有 dst_api + if mapping_type not in ["组合替代实现", "仅 API 调用方式不一致"]: if state != ParserState.end: print(state) raise Exception( diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/utils.py b/docs/guides/model_convert/convert_from_pytorch/tools/utils.py index a54de7bcc04..ae6c83f5ee1 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/utils.py +++ b/docs/guides/model_convert/convert_from_pytorch/tools/utils.py @@ -252,6 +252,11 @@ def parse_md_files(directories): except Exception as e: print(f"错误: 读取文件 {md_path} 时出错: {e!s}") + for category, apis in category_api_map.items(): + category_api_map[category] = sorted( + apis, key=lambda x: x["api_name"].replace(r"\_", "_") + ) + return category_api_map diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/validate_api_difference_format.py b/docs/guides/model_convert/convert_from_pytorch/tools/validate_api_difference_format.py index 32abcf09feb..4b6221a30de 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/validate_api_difference_format.py +++ b/docs/guides/model_convert/convert_from_pytorch/tools/validate_api_difference_format.py @@ -10,7 +10,7 @@ def main(): # 定义类别映射:英文目录名 -> 中文类别名称 category_map = { - "invok_diff_only": "仅 API 调用方式不一致", + "invok_only_diff": "仅 API 调用方式不一致", "args_name_diff": "仅参数名不一致", "paddle_more_args": "paddle 参数更多", "args_default_value_diff": "参数默认值不一致", @@ -23,7 +23,7 @@ def main(): # 定义每个类别的总结语句 summary_map = { - "invok_diff_only": "两者功能一致,但调用方式不一致,具体如下:", + "invok_only_diff": "两者功能一致,但调用方式不一致,具体如下:", "args_name_diff": "两者功能一致且参数用法一致,仅参数名不一致,具体如下:", "paddle_more_args": "其中 Paddle 相比 PyTorch 支持更多其他参数,具体如下:", "args_default_value_diff": "两者功能一致且参数用法一致,参数默认值不一致,具体如下:", @@ -153,7 +153,7 @@ def main(): current_index += 1 # 8. 检查参数映射表格 (非2和10类) - if category_dir not in ["invok_diff_only", "composite_implement"]: + if category_dir not in ["invok_only_diff", "composite_implement"]: # 8.1 参数映射标题 if ( current_index >= len(lines) @@ -171,7 +171,7 @@ def main(): current_index += 1 # 9. 检查转写示例 - if category_dir in ["invok_diff_only", "composite_implement"]: + if category_dir in ["invok_only_diff", "composite_implement"]: # 9.1 转写示例标题 if ( current_index >= len(lines) diff --git a/docs/guides/model_convert/convert_from_pytorch/tools/validate_pytorch_api_mapping.py b/docs/guides/model_convert/convert_from_pytorch/tools/validate_pytorch_api_mapping.py index 551ff78582e..9e06a5c90d6 100644 --- a/docs/guides/model_convert/convert_from_pytorch/tools/validate_pytorch_api_mapping.py +++ b/docs/guides/model_convert/convert_from_pytorch/tools/validate_pytorch_api_mapping.py @@ -17,7 +17,7 @@ # 类别映射关系 CATEGORY_MAP = { - "invok_diff_only": "仅 API 调用方式不一致", + "invok_only_diff": "仅 API 调用方式不一致", "args_name_diff": "仅参数名不一致", "paddle_more_args": "paddle 参数更多", "args_default_value_diff": "参数默认值不一致", diff --git a/docs/guides/model_convert/convert_train_code/convert_net_structure_cn.md b/docs/guides/model_convert/convert_train_code/convert_net_structure_cn.md index d2f57d9a71f..cdf8904f690 100644 --- a/docs/guides/model_convert/convert_train_code/convert_net_structure_cn.md +++ b/docs/guides/model_convert/convert_train_code/convert_net_structure_cn.md @@ -360,7 +360,7 @@ https://www.paddlepaddle.org.cn/modelbase。 仍然以 LeNet 模型为例,手工转化的具体操作如下。 -1. 通过阅读 PyTorch 源码可知,构建 LeNet 使用到的 PyTorch API 有:`nn.Module`, `nn.Squential`, `nn.Conv2d`, `nn.ReLU`, `nn.MaxPool2d`, `nn.Linear`以及`torch.flatten`。 +1. 通过阅读 PyTorch 源码可知,构建 LeNet 使用到的 PyTorch API 有:`nn.Module`, `nn.Sequential`, `nn.Conv2d`, `nn.ReLU`, `nn.MaxPool2d`, `nn.Linear`以及`torch.flatten`。 2. 通过查找 [PyTorch-飞桨 API 映射表](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/model_convert/pytorch_api_mapping_cn.html),找到对应的飞桨 API: | **PyTorch** | **飞桨** | 差异对比 | diff --git a/docs/guides/model_convert/update_en.md b/docs/guides/model_convert/update_en.md index 9526d05b7a7..8ddb743634c 100644 --- a/docs/guides/model_convert/update_en.md +++ b/docs/guides/model_convert/update_en.md @@ -67,7 +67,7 @@ In order to make the API organization more concise and clear, the original direc ### API alias rule -- APIs are created with aliases in different paths for better convinience: +- APIs are created with aliases in different paths for better convenience: - All APIs under device, framework, and tensor directories are aliased in the paddle root directory; all APIs are not aliased in the paddle root directory except a few special APIs. - All APIs in the paddle.nn directory except for the functional directory have aliases in the paddle.nn directory; all APIs in the functional directory have no aliases in the paddle.nn directory. - ** **It is recommended to give preference to aliases with shorter paths**, for example `paddle.add -> paddle.tensor.add`; `paddle.add` is recommended. diff --git a/docs/guides/paddle_v3_features/paddle_ir_cn.md b/docs/guides/paddle_v3_features/paddle_ir_cn.md index 4f4651f6dd3..afc1fbb043a 100644 --- a/docs/guides/paddle_v3_features/paddle_ir_cn.md +++ b/docs/guides/paddle_v3_features/paddle_ir_cn.md @@ -9,7 +9,7 @@ 在深度学习框架 IR 概念中,「顺序性」和「图语义」是两个非常高频常用的概念。旧的中间表示体系由「顺序性」ProgramDesc 和「图语义」Graph 两个核心类共同承载。用户在静态图 API 或者动转静模块下,产生的中间表示是 Op-by-Op 的 Program,如果要应用更高层面的优化策略(比如算子融合、inplace 策略、剪枝等),框架会将由 Program 构造出 Graph,其由数据节点、算子节点和彼此关联的边构成。 -在新的 Paddle IR 中,飞桨在底层抽象了一套高度可扩展的基础组件,包括 Type、Attrbute、Op、Trait 和 Interface,并引入了 Dialect 的概念,支持开发者灵活扩展、自由定制,提供了完备鲁邦的语义表达能力;在模型表示层,通过多 Dialect 模块化管理,统一多端表示,实现了训推一体的全架构统一表示,无缝衔接组合算子和编译器,支持自动优化和多硬件适配;在图变换层,通过统一底层模块,简化基础概念,向用户提供了低成本开发、易用高性能、丰富可插拔的 Pass 优化机制。 +在新的 Paddle IR 中,飞桨在底层抽象了一套高度可扩展的基础组件,包括 Type、Attribute、Op、Trait 和 Interface,并引入了 Dialect 的概念,支持开发者灵活扩展、自由定制,提供了完备鲁邦的语义表达能力;在模型表示层,通过多 Dialect 模块化管理,统一多端表示,实现了训推一体的全架构统一表示,无缝衔接组合算子和编译器,支持自动优化和多硬件适配;在图变换层,通过统一底层模块,简化基础概念,向用户提供了低成本开发、易用高性能、丰富可插拔的 Pass 优化机制。 飞桨的新一代的 IR 表示坚持 SSA(静态单赋值)原则,模型等价于一个有向无环图。并以 Value、Operation 对计算图进行抽象, Operation 为节点,Value 为边。 * Operation 表示计算图中的节点:一个 Operation 表示一个算子,它里面包含了零个或多个 Region;Region 表示一个闭包,它里面包含了零个或多个 Block;Block 表示一个符合 SSA 的基本块,里面包含了零个或多个 Operation;三者循环嵌套,可以实现任意复杂的语法结构 @@ -96,13 +96,13 @@ print(out) 如上左图所示,新一代 IR 的整体设计自底向上分为三层: ### 1.灵活的基础组件 -飞桨提供了 Trait 和 Interface 两种重要机制实现了对算子 Op 的特征和接口的抽象标记。 比如 InplaceTrait 表示一个 Op 具有 Inplace 特征, InferShapeInterface 表示一个算子定义了 InferShape 函数接口等,这二者都是可以任意扩展的,只要派生自相应的基类、遵循相应的实现规则即可;并对算子体系下核心概念抽出 Type、Attrbute、Op,这三者是基于 Trait 和 Interface 进行定义的。它们会对关联自己所拥有的相应 Trait 和 Interface ;Dialect 用来对 Type、Attribtue、Op 做模块化管理, 比如 BuiltinDialect、PaddleDialect、CinnDialect 等等。一个 Dialect 里面包含了一系列的 Type、Attribtue、Op 的定义。相应的,每个 Type、Attribtue、Op 都是定义在某个唯一的 Dialect 里面。对整个 IR 框架而言, Dialect 是可以随意插拔的,也是可以任意扩展的。 +飞桨提供了 Trait 和 Interface 两种重要机制实现了对算子 Op 的特征和接口的抽象标记。 比如 InplaceTrait 表示一个 Op 具有 Inplace 特征, InferShapeInterface 表示一个算子定义了 InferShape 函数接口等,这二者都是可以任意扩展的,只要派生自相应的基类、遵循相应的实现规则即可;并对算子体系下核心概念抽出 Type、Attribute、Op,这三者是基于 Trait 和 Interface 进行定义的。它们会对关联自己所拥有的相应 Trait 和 Interface ;Dialect 用来对 Type、Attribute、Op 做模块化管理, 比如 BuiltinDialect、PaddleDialect、CinnDialect 等等。一个 Dialect 里面包含了一系列的 Type、Attribute、Op 的定义。相应的,每个 Type、Attribute、Op 都是定义在某个唯一的 Dialect 里面。对整个 IR 框架而言, Dialect 是可以随意插拔的,也是可以任意扩展的。 这一层是 IR 适应多种场景的基础。这一层的每一个要素都是可定制化扩展的,一般情况下,针对一个具体的场景,比如分布式、编译器。都需要定义自己需要用到的 Trait、Interface,然后定义自己的 Dialect,在自己的 Dialect 里面,定义自己需要用到的 Type、Attribute、Op。 ### 2.多层级的 Dialect -飞桨通过不同层级的 Dialect 来管理框架内不同领域的算子体系,比如 Built-in 下的 Shape Dialect 和 Control Flow Dialect,分别用户形状符号推导和控制流表示、与 PHI 算子库执行体系相关的 Operator Dialect 和 Kernel Dialect、与神经网络编译器领域相关的 CINN Dialect 等。在飞桨神经网络编译器中,主要以计算图 Operator Dialect 为输入,经过组合算子和 Pass Pipline 后,会转换为 CINN Dialect,并附加 Shape Dialect 中的符号信息,最后会 Lowering 成编译器的 AST IR。 +飞桨通过不同层级的 Dialect 来管理框架内不同领域的算子体系,比如 Built-in 下的 Shape Dialect 和 Control Flow Dialect,分别用户形状符号推导和控制流表示、与 PHI 算子库执行体系相关的 Operator Dialect 和 Kernel Dialect、与神经网络编译器领域相关的 CINN Dialect 等。在飞桨神经网络编译器中,主要以计算图 Operator Dialect 为输入,经过组合算子和 Pass Pipeline 后,会转换为 CINN Dialect,并附加 Shape Dialect 中的符号信息,最后会 Lowering 成编译器的 AST IR。 上述这些多层级的 Dialect 内的算子 Op 会组成 Program ,并用来表示一个具体的模型。它包含两部分:计算图 和 权重 。 * Value、Operation 用来对计算图进行抽象。Value 表示计算图中的有向边,他用来将两个 Operaton 关联起来,描述了程序中的 UD 链 ,Operation 表示计算图中的节点。一个 Operation 表示一个算子,它里面包含了零个或多个 Region 。Region 表示一个闭包,它里面包含了零个或多个 Block。Block 表示一个符合 SSA 的基本块,里面包含了零个或多个 Operation 。三者循环嵌套,可以实现任意复杂的语法结构。 * Weight 用来对模型的权重参数进行单独存储,这也是深度学习框架和传统编译器不一样的地方。传统编译器会将数据段内嵌到程序里面。这是因为传统编译器里面,数据和代码是强绑定的,不可分割。但是对神经网络而言,一个计算图的每个 epoch 都会存在一份权重参数,多个计算图也有可能共同一份权重参数,二者不是强绑定的 diff --git a/docs/install/Tables.md b/docs/install/Tables.md index ab34e354990..3eeab40e678 100644 --- a/docs/install/Tables.md +++ b/docs/install/Tables.md @@ -290,11 +290,11 @@ PaddePaddle 通过编译时指定路径来实现引用各种 BLAS/CUDA/cuDNN 库 - paddlepaddle==[版本号] 例如 paddlepaddle==3.2.0 + paddlepaddle==[版本号] 例如 paddlepaddle==3.2.1 只支持 CPU 对应版本的 PaddlePaddle,具体版本请参见Pypi - paddlepaddle-gpu==[版本号] 例如 paddlepaddle-gpu==3.2.0 + paddlepaddle-gpu==[版本号] 例如 paddlepaddle-gpu==3.2.1 默认安装支持 CUDA 11.8 和 cuDNN 8 的对应[版本号]的 PaddlePaddle 安装包 @@ -303,7 +303,7 @@ PaddePaddle 通过编译时指定路径来实现引用各种 BLAS/CUDA/cuDNN 库 您可以在 [Release History](https://pypi.org/project/paddlepaddle-gpu/#history) 中找到 PaddlePaddle-gpu 的各个发行版本。 -需要注意的是,命令中 paddlepaddle-gpu==3.2.0 在 windows 环境下,会默认安装支持 CUDA 11.8 和 cuDNN 8 的对应[版本号]的 PaddlePaddle 安装包 +需要注意的是,命令中 paddlepaddle-gpu==3.2.1 在 windows 环境下,会默认安装支持 CUDA 11.8 和 cuDNN 8 的对应[版本号]的 PaddlePaddle 安装包

@@ -325,94 +325,107 @@ PaddePaddle 通过编译时指定路径来实现引用各种 BLAS/CUDA/cuDNN 库 cpu-mkl-avx - paddlepaddle-3.2.0-cp39-cp39-linux_x86_64.whl - paddlepaddle-3.2.0-cp310-cp310-linux_x86_64.whl - paddlepaddle-3.2.0-cp311-cp311-linux_x86_64.whl - paddlepaddle-3.2.0-cp312-cp312-linux_x86_64.whl - paddlepaddle-3.2.0-cp313-cp313-linux_x86_64.whl + paddlepaddle-3.2.1-cp39-cp39-linux_x86_64.whl + paddlepaddle-3.2.1-cp310-cp310-linux_x86_64.whl + paddlepaddle-3.2.1-cp311-cp311-linux_x86_64.whl + paddlepaddle-3.2.1-cp312-cp312-linux_x86_64.whl + paddlepaddle-3.2.1-cp313-cp313-linux_x86_64.whl cuda11.8-cudnn8.6-mkl-gcc8.2-avx - - paddlepaddle_gpu-3.2.0-cp39-cp39-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp310-cp310-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp311-cp311-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp312-cp312-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp313-cp313-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp39-cp39-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp310-cp310-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp311-cp311-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp312-cp312-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp313-cp313-linux_x86_64.whl cuda12.6-cudnn9.0-mkl-gcc12.2-avx - - paddlepaddle_gpu-3.2.0-cp39-cp39-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp310-cp310-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp311-cp311-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp312-cp312-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp313-cp313-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp39-cp39-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp310-cp310-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp311-cp311-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp312-cp312-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp313-cp313-linux_x86_64.whl cuda12.9-cudnn9.9-mkl-gcc12.2-avx - - paddlepaddle_gpu-3.2.0-cp39-cp39-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp310-cp310-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp311-cp311-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp312-cp312-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp313-cp313-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp39-cp39-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp310-cp310-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp311-cp311-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp312-cp312-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp313-cp313-linux_x86_64.whl + + + cuda13.0-cudnn9.13-mkl-gcc13.1-avx + + paddlepaddle_gpu-3.2.1-cp39-cp39-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp310-cp310-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp311-cp311-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp312-cp312-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp313-cp313-linux_x86_64.whl macos-cpu-arm - - paddlepaddle-3.2.0-cp39-cp39-macosx_11_0_arm64.whl - - paddlepaddle-3.2.0-cp310-cp310-macosx_11_0_arm64.whl - - paddlepaddle-3.2.0-cp311-cp311-macosx_11_0_arm64.whl - - paddlepaddle-3.2.0-cp312-cp312-macosx_11_0_arm64.whl - - paddlepaddle-3.2.0-cp313-cp313-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp39-cp39-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp310-cp310-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp311-cp311-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp312-cp312-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp313-cp313-macosx_11_0_arm64.whl win-cpu-mkl-avx - paddlepaddle-3.2.0-cp39-cp39-win_amd64.whl - paddlepaddle-3.2.0-cp310-cp310-win_amd64.whl - paddlepaddle-3.2.0-cp311-cp311-win_amd64.whl - paddlepaddle-3.2.0-cp312-cp312-win_amd64.whl - paddlepaddle-3.2.0-cp313-cp313-win_amd64.whl + paddlepaddle-3.2.1-cp39-cp39-win_amd64.whl + paddlepaddle-3.2.1-cp310-cp310-win_amd64.whl + paddlepaddle-3.2.1-cp311-cp311-win_amd64.whl + paddlepaddle-3.2.1-cp312-cp312-win_amd64.whl + paddlepaddle-3.2.1-cp313-cp313-win_amd64.whl win-cuda11.8-cudnn8.6-mkl-vs2019-avx - paddlepaddle_gpu-3.2.0-cp39-cp39-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp310-cp310-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp311-cp311-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp312-cp312-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp313-cp313-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp39-cp39-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp310-cp310-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp311-cp311-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp312-cp312-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp313-cp313-win_amd64.whl win-cuda12.6-cudnn9.0-mkl-vs2019-avx - paddlepaddle_gpu-3.2.0-cp39-cp39-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp310-cp310-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp311-cp311-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp312-cp312-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp313-cp313-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp39-cp39-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp310-cp310-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp311-cp311-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp312-cp312-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp313-cp313-win_amd64.whl win-cuda12.9-cudnn9.9-mkl-vs2019-avx - paddlepaddle_gpu-3.2.0-cp39-cp39-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp310-cp310-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp311-cp311-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp312-cp312-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp313-cp313-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp39-cp39-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp310-cp310-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp311-cp311-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp312-cp312-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp313-cp313-win_amd64.whl diff --git a/docs/install/Tables_en.md b/docs/install/Tables_en.md index 7722f57a812..5be9cec85ad 100644 --- a/docs/install/Tables_en.md +++ b/docs/install/Tables_en.md @@ -282,11 +282,11 @@ PaddePaddle implements references to various BLAS/CUDA/cuDNN libraries by specif - paddlepaddle==[version code] such as paddlepaddle==3.2.0 + paddlepaddle==[version code] such as paddlepaddle==3.2.1 Only support the corresponding version of the CPU PaddlePaddle, please refer to Pypi for the specific version. - paddlepaddle-gpu==[version code], such as paddlepaddle-gpu==3.2.0 + paddlepaddle-gpu==[version code], such as paddlepaddle-gpu==3.2.1 The default installation supports the PaddlePaddle installation package corresponding to [version number] of CUDA 11.2 and cuDNN 8 @@ -295,7 +295,7 @@ PaddePaddle implements references to various BLAS/CUDA/cuDNN libraries by specif You can find various distributions of PaddlePaddle-gpu in [the Release History](https://pypi.org/project/paddlepaddle-gpu/#history). -Please note that: in the commands, paddlepaddle-gpu==3.2.0 will install the installation package of PaddlePaddle that supports CUDA 11.2 and cuDNN 8 by default under Windows environment. +Please note that: in the commands, paddlepaddle-gpu==3.2.1 will install the installation package of PaddlePaddle that supports CUDA 11.2 and cuDNN 8 by default under Windows environment. @@ -319,95 +319,108 @@ Please note that: in the commands, paddlepaddle-gpu==3.2.0 will i cpu-mkl-avx - paddlepaddle-3.2.0-cp39-cp39-linux_x86_64.whl - paddlepaddle-3.2.0-cp310-cp310-linux_x86_64.whl - paddlepaddle-3.2.0-cp311-cp311-linux_x86_64.whl - paddlepaddle-3.2.0-cp312-cp312-linux_x86_64.whl - paddlepaddle-3.2.0-cp313-cp313-linux_x86_64.whl + paddlepaddle-3.2.1-cp39-cp39-linux_x86_64.whl + paddlepaddle-3.2.1-cp310-cp310-linux_x86_64.whl + paddlepaddle-3.2.1-cp311-cp311-linux_x86_64.whl + paddlepaddle-3.2.1-cp312-cp312-linux_x86_64.whl + paddlepaddle-3.2.1-cp313-cp313-linux_x86_64.whl cuda11.8-cudnn8.6-mkl-gcc8.2-avx - - paddlepaddle_gpu-3.2.0-cp39-cp39-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp310-cp310-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp311-cp311-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp312-cp312-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp313-cp313-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp39-cp39-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp310-cp310-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp311-cp311-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp312-cp312-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp313-cp313-linux_x86_64.whl cuda12.6-cudnn9.0-mkl-gcc12.2-avx - - paddlepaddle_gpu-3.2.0-cp39-cp39-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp310-cp310-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp311-cp311-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp312-cp312-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp313-cp313-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp39-cp39-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp310-cp310-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp311-cp311-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp312-cp312-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp313-cp313-linux_x86_64.whl cuda12.9-cudnn9.9-mkl-gcc12.2-avx - - paddlepaddle_gpu-3.2.0-cp39-cp39-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp310-cp310-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp311-cp311-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp312-cp312-linux_x86_64.whl - - paddlepaddle_gpu-3.2.0-cp313-cp313-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp39-cp39-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp310-cp310-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp311-cp311-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp312-cp312-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp313-cp313-linux_x86_64.whl + + + cuda13.0-cudnn9.13-mkl-gcc13.1-avx + + paddlepaddle_gpu-3.2.1-cp39-cp39-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp310-cp310-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp311-cp311-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp312-cp312-linux_x86_64.whl + + paddlepaddle_gpu-3.2.1-cp313-cp313-linux_x86_64.whl macos-cpu-arm - - paddlepaddle-3.2.0-cp39-cp39-macosx_11_0_arm64.whl - - paddlepaddle-3.2.0-cp310-cp310-macosx_11_0_arm64.whl - - paddlepaddle-3.2.0-cp311-cp311-macosx_11_0_arm64.whl - - paddlepaddle-3.2.0-cp312-cp312-macosx_11_0_arm64.whl - - paddlepaddle-3.2.0-cp313-cp313-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp39-cp39-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp310-cp310-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp311-cp311-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp312-cp312-macosx_11_0_arm64.whl + + paddlepaddle-3.2.1-cp313-cp313-macosx_11_0_arm64.whl win-cpu-mkl-avx - paddlepaddle-3.2.0-cp39-cp39-win_amd64.whl - paddlepaddle-3.2.0-cp310-cp310-win_amd64.whl - paddlepaddle-3.2.0-cp311-cp311-win_amd64.whl - paddlepaddle-3.2.0-cp312-cp312-win_amd64.whl - paddlepaddle-3.2.0-cp313-cp313-win_amd64.whl + paddlepaddle-3.2.1-cp39-cp39-win_amd64.whl + paddlepaddle-3.2.1-cp310-cp310-win_amd64.whl + paddlepaddle-3.2.1-cp311-cp311-win_amd64.whl + paddlepaddle-3.2.1-cp312-cp312-win_amd64.whl + paddlepaddle-3.2.1-cp313-cp313-win_amd64.whl win-cuda11.8-cudnn8.6-mkl-vs2019-avx - paddlepaddle_gpu-3.2.0-cp39-cp39-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp310-cp310-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp311-cp311-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp312-cp312-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp313-cp313-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp39-cp39-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp310-cp310-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp311-cp311-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp312-cp312-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp313-cp313-win_amd64.whl win-cuda12.6-cudnn9.0-mkl-vs2019-avx - paddlepaddle_gpu-3.2.0-cp39-cp39-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp310-cp310-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp311-cp311-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp312-cp312-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp313-cp313-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp39-cp39-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp310-cp310-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp311-cp311-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp312-cp312-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp313-cp313-win_amd64.whl win-cuda12.9-cudnn9.9-mkl-vs2019-avx - paddlepaddle_gpu-3.2.0-cp39-cp39-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp310-cp310-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp311-cp311-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp312-cp312-win_amd64.whl - paddlepaddle_gpu-3.2.0-cp313-cp313-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp39-cp39-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp310-cp310-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp311-cp311-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp312-cp312-win_amd64.whl + paddlepaddle_gpu-3.2.1-cp313-cp313-win_amd64.whl diff --git a/docs/install/compile/arm-compile.md b/docs/install/compile/arm-compile.md index 37c800edd71..d65cd4702c3 100644 --- a/docs/install/compile/arm-compile.md +++ b/docs/install/compile/arm-compile.md @@ -52,7 +52,7 @@ sudo make install ``` -3. 根据[requirments.txt](https://github.com/PaddlePaddle/Paddle/blob/develop/python/requirements.txt)安装 Python 依赖库,在飞腾加国产化操作系统环境中,pip 安装可能失败或不能正常工作,主要依赖通过源或源码安装的方式安装依赖库,建议使用系统提供源的方式安装依赖库。 +3. 根据[requirements.txt](https://github.com/PaddlePaddle/Paddle/blob/develop/python/requirements.txt)安装 Python 依赖库,在飞腾加国产化操作系统环境中,pip 安装可能失败或不能正常工作,主要依赖通过源或源码安装的方式安装依赖库,建议使用系统提供源的方式安装依赖库。 4. 将 Paddle 的源代码克隆到当下目录下的 Paddle 文件夹中,并进入 Paddle 目录 diff --git a/docs/install/compile/linux-compile-by-make.md b/docs/install/compile/linux-compile-by-make.md index 32beea661a9..be490001039 100644 --- a/docs/install/compile/linux-compile-by-make.md +++ b/docs/install/compile/linux-compile-by-make.md @@ -3,9 +3,9 @@ ## 环境准备 * **Linux 版本 (64 bit)** - * **Ubuntu 20.04 (GPU 版本支持 CUDA 11.8 - 12.9)** - * **Ubuntu 22.04 (GPU 版本支持 CUDA 11.8 - 12.9)** - * **Ubuntu 24.04 (GPU 版本支持 CUDA 11.8 - 12.9)** + * **Ubuntu 20.04 (GPU 版本支持 CUDA 11.8 - 13.0)** + * **Ubuntu 22.04 (GPU 版本支持 CUDA 11.8 - 13.0)** + * **Ubuntu 24.04 (GPU 版本支持 CUDA 11.8 - 13.0)** * **Python 版本 3.9/3.10/3.11/3.12/3.13 (64 bit)** ## 选择 CPU/GPU @@ -448,7 +448,7 @@ pip3.10 install -r /paddle/python/requirements.txt > 请注意 PY_VERSION 参数更换为您需要的 python 版本 -* 对于需要编译**GPU 版本 PaddlePaddle**的用户:(** CUDA11.8 - CUDA12.9 **) +* 对于需要编译**GPU 版本 PaddlePaddle**的用户:(** CUDA11.8 - CUDA13.0 **) 1. 请确保您已经正确安装 nccl2,或者按照以下指令安装 nccl2(这里提供的是 CUDA11.8,cuDNN8 下 nccl2 的安装指令,更多版本的安装信息请参考 NVIDIA[官方网站](https://developer.nvidia.com/nccl)): diff --git a/docs/install/compile/linux-compile-by-make_en.md b/docs/install/compile/linux-compile-by-make_en.md index 4062e7b9348..b5eeff73a41 100644 --- a/docs/install/compile/linux-compile-by-make_en.md +++ b/docs/install/compile/linux-compile-by-make_en.md @@ -3,9 +3,9 @@ ## Environment preparation * **Linux version (64 bit)** - * **Ubuntu 20.04 (GPU 版本支持 CUDA 11.8 - 12.9)** - * **Ubuntu 22.04 (GPU 版本支持 CUDA 11.8 - 12.9)** - * **Ubuntu 24.04 (GPU 版本支持 CUDA 11.8 - 12.9)** + * **Ubuntu 20.04 (GPU 版本支持 CUDA 11.8 - 13.0)** + * **Ubuntu 22.04 (GPU 版本支持 CUDA 11.8 - 13.0)** + * **Ubuntu 24.04 (GPU 版本支持 CUDA 11.8 - 13.0)** * **Python 版本 3.9/3.10/3.11/3.12/3.13 (64 bit)** ## Choose CPU/GPU diff --git a/docs/install/compile/linux-compile-by-ninja.md b/docs/install/compile/linux-compile-by-ninja.md index 2720e294a45..0cd95084e11 100644 --- a/docs/install/compile/linux-compile-by-ninja.md +++ b/docs/install/compile/linux-compile-by-ninja.md @@ -3,9 +3,9 @@ ## 环境准备 * **Linux 版本 (64 bit)** - * **Ubuntu 20.04 (GPU 版本支持 CUDA 11.8 - 12.9)** - * **Ubuntu 22.04 (GPU 版本支持 CUDA 11.8 - 12.9)** - * **Ubuntu 24.04 (GPU 版本支持 CUDA 11.8 - 12.9)** + * **Ubuntu 20.04 (GPU 版本支持 CUDA 11.8 - 13.0)** + * **Ubuntu 22.04 (GPU 版本支持 CUDA 11.8 - 13.0)** + * **Ubuntu 24.04 (GPU 版本支持 CUDA 11.8 - 13.0)** * **Python 版本 3.9/3.10/3.11/3.12/3.13 (64 bit)** ## 选择 CPU/GPU @@ -359,7 +359,7 @@ pip3.10 install -r /paddle/python/requirements.txt ``` > 如果遇到`Could NOT find PROTOBUF (missing: PROTOBUF_LIBRARY PROTOBUF_INCLUDE_DIR)`可以重新执行一次 cmake 指令。 > 请注意 PY_VERSION 参数更换为您需要的 python 版本 -* 对于需要编译**GPU 版本 PaddlePaddle**的用户:(**仅支持 CentOS7(** CUDA11.8 - CUDA12.9 **)**) +* 对于需要编译**GPU 版本 PaddlePaddle**的用户:(**仅支持 CentOS7(** CUDA11.8 - CUDA13.0 **)**) 1. 请确保您已经正确安装 nccl2,或者按照以下指令安装 nccl2(这里提供的是 CUDA11.8,cuDNN8 下 nccl2 的安装指令,更多版本的安装信息请参考 NVIDIA[官方网站](https://developer.nvidia.com/nccl)): ``` wget -q https://nccl2-deb.cdn.bcebos.com/nccl_2.16.2-1+cuda11.8_x86_64.txz --no-check-certificate --no-proxy diff --git a/docs/install/compile/mips-compile.md b/docs/install/compile/mips-compile.md index 97b04492c98..47736d5a23d 100644 --- a/docs/install/compile/mips-compile.md +++ b/docs/install/compile/mips-compile.md @@ -76,7 +76,7 @@ cd Paddle ``` -6. 根据[requirments.txt](https://github.com/PaddlePaddle/Paddle/blob/develop/python/requirements.txt)安装 Python 依赖库。 +6. 根据[requirements.txt](https://github.com/PaddlePaddle/Paddle/blob/develop/python/requirements.txt)安装 Python 依赖库。 7. 切换到`develop`分支下进行编译: diff --git a/docs/install/compile/sw-compile.md b/docs/install/compile/sw-compile.md index 20e2cf161a5..04efcc8f4ec 100644 --- a/docs/install/compile/sw-compile.md +++ b/docs/install/compile/sw-compile.md @@ -48,7 +48,7 @@ -- Found lapack in OpenBLAS (include: /usr/include) ``` -5. 根据[requirments.txt](https://github.com/PaddlePaddle/Paddle/blob/develop/python/requirements.txt)安装 Python 依赖库,注意在申威系统中一般无法直接使用 pip 或源码编译安装 python 依赖包,建议使用源的方式安装,如果遇到部分依赖包无法安装的情况,请联系操作系统服务商提供支持。此外也可以通过 pip 安装的时候加--no-deps 的方式来避免依赖包的安装,但该种方式可能导致包由于缺少依赖不可用。 +5. 根据[requirements.txt](https://github.com/PaddlePaddle/Paddle/blob/develop/python/requirements.txt)安装 Python 依赖库,注意在申威系统中一般无法直接使用 pip 或源码编译安装 python 依赖包,建议使用源的方式安装,如果遇到部分依赖包无法安装的情况,请联系操作系统服务商提供支持。此外也可以通过 pip 安装的时候加--no-deps 的方式来避免依赖包的安装,但该种方式可能导致包由于缺少依赖不可用。 6. 请创建并进入一个叫 build 的目录下: diff --git a/docs/install/docker/docker_list.md b/docs/install/docker/docker_list.md index 496e9c222c8..0e302b48332 100644 --- a/docs/install/docker/docker_list.md +++ b/docs/install/docker/docker_list.md @@ -44,6 +44,13 @@ 2.26.5 11.4 + + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:cuda130-dev + 13.0 + 9.13 + 2.28.3 + 13.1 +

diff --git a/docs/install/docker/linux-docker.md b/docs/install/docker/linux-docker.md index c664e451b6a..9febde1e7bd 100644 --- a/docs/install/docker/linux-docker.md +++ b/docs/install/docker/linux-docker.md @@ -21,46 +21,52 @@ * CPU 版的 PaddlePaddle: ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 ``` * CPU 版的 PaddlePaddle,且镜像中预装好了 jupyter: ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter ``` * GPU 版的 PaddlePaddle(**建议拉取最新版本镜像,并确保已经成功安装 NVIDIA Container Toolkit**): ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda11.8-cudnn8.9 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda11.8-cudnn8.9 ``` ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5 ``` ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.9-cudnn9.9 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.9-cudnn9.9 + ``` + ``` + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda13.0-cudnn9.13 ``` 如果您的机器不在中国大陆地区,可以直接从 DockerHub 拉取镜像: * CPU 版的 PaddlePaddle: ``` - docker pull paddlepaddle/paddle:3.2.0 + docker pull paddlepaddle/paddle:3.2.1 ``` * CPU 版的 PaddlePaddle,且镜像中预装好了 jupyter: ``` - docker pull paddlepaddle/paddle:3.2.0-jupyter + docker pull paddlepaddle/paddle:3.2.1-jupyter ``` * GPU 版的 PaddlePaddle(**建议拉取最新版本镜像,并确保已经成功安装 NVIDIA Container Toolkit**): ``` - docker pull paddlepaddle/paddle:3.2.0-gpu-cuda11.8-cudnn8.9 + docker pull paddlepaddle/paddle:3.2.1-gpu-cuda11.8-cudnn8.9 + ``` ``` + docker pull paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5 ``` - docker pull paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5 ``` + docker pull paddlepaddle/paddle:3.2.1-gpu-cuda12.9-cudnn9.9 ``` - docker pull paddlepaddle/paddle:3.2.0-gpu-cuda12.9-cudnn9.9 + ``` + docker pull paddlepaddle/paddle:3.2.1-gpu-cuda13.0-cudnn9.13 ``` 您还可以访问[DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/)获取更多镜像。 @@ -72,7 +78,7 @@ ``` - docker run --name paddle_docker -it -v $PWD:/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 /bin/bash + docker run --name paddle_docker -it -v $PWD:/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 /bin/bash ``` - `--name paddle_docker`:设定 Docker 的名称,`paddle_docker` 是自己设置的名称; @@ -83,7 +89,7 @@ - `-v $PWD:/paddle`:指定将当前路径(PWD 变量会展开为当前路径的绝对路径)挂载到容器内部的 /paddle 目录; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0`:指定需要使用的 image 名称,您可以通过`docker images`命令查看;/bin/bash 是在 Docker 中要执行的命令 + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1`:指定需要使用的 image 名称,您可以通过`docker images`命令查看;/bin/bash 是在 Docker 中要执行的命令 * 使用 CPU 版本的 PaddlePaddle,且镜像中预装好了 jupyter: @@ -98,7 +104,7 @@ cd ./jupyter_docker ``` ``` - docker run -p 80:80 --rm --env USER_PASSWD="password you set" -v $PWD:/home/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter + docker run -p 80:80 --rm --env USER_PASSWD="password you set" -v $PWD:/home/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter ``` - `--rm`:关闭容器后删除容器; @@ -109,13 +115,13 @@ - `-v $PWD:/home/paddle`:指定将当前路径(PWD 变量会展开为当前路径的绝对路径)挂载到容器内部的 /home/paddle 目录; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter`:指定需要使用的 image 名称,您可以通过`docker images`命令查看 + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter`:指定需要使用的 image 名称,您可以通过`docker images`命令查看 * 使用 GPU 版本的 PaddlePaddle: ``` - docker run --gpus all --name paddle_docker -v $PWD:/paddle --network=host -it ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5 /bin/bash + docker run --gpus all --name paddle_docker -v $PWD:/paddle --network=host -it ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5 /bin/bash ``` - `--gpus all`: 在 Docker 容器中允许使用 gpu; @@ -127,7 +133,7 @@ - `-it`: 与宿主机保持交互状态; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5`:使用名为`ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle`, tag 为`3.2.0-gpu-cuda12.6-cudnn9.5`的镜像创建 Docker 容器,/bin/bash 进入容器后启动/bin/bash 命令。 + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5`:使用名为`ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle`, tag 为`3.2.1-gpu-cuda12.6-cudnn9.5`的镜像创建 Docker 容器,/bin/bash 进入容器后启动/bin/bash 命令。 @@ -146,24 +152,28 @@ - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 - 安装了 3.2.0 版本 paddle 的 CPU 镜像 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 + 安装了 3.2.1 版本 paddle 的 CPU 镜像 + + + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter + 安装了 3.2.1 版本 paddle 的 CPU 镜像,且镜像中预装好了 jupyter,启动 docker 即运行 jupyter 服务 - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter - 安装了 3.2.0 版本 paddle 的 CPU 镜像,且镜像中预装好了 jupyter,启动 docker 即运行 jupyter 服务 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda11.8-cudnn8.9 + 安装了 3.2.1 版本 paddle 的 GPU 镜像,cuda 版本为 11.8,cudnn 版本为 8.9 - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda11.8-cudnn8.9 - 安装了 3.2.0 版本 paddle 的 GPU 镜像,cuda 版本为 11.8,cudnn 版本为 8.9 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5 + 安装了 3.2.1 版本 paddle 的 GPU 镜像,cuda 版本为 12.6,cudnn 版本为 9.5 - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5 - 安装了 3.2.0 版本 paddle 的 GPU 镜像,cuda 版本为 12.6,cudnn 版本为 9.5 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.9-cudnn9.9 + 安装了 3.2.1 版本 paddle 的 GPU 镜像,cuda 版本为 12.9,cudnn 版本为 9.9 - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.9-cudnn9.9 - 安装了 3.2.0 版本 paddle 的 GPU 镜像,cuda 版本为 12.9,cudnn 版本为 9.9 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda13.0-cudnn9.13 + 安装了 3.2.1 版本 paddle 的 GPU 镜像,cuda 版本为 13.0,cudnn 版本为 9.13 diff --git a/docs/install/docker/linux-docker_en.md b/docs/install/docker/linux-docker_en.md index 9bd6abc0591..23344964cf4 100644 --- a/docs/install/docker/linux-docker_en.md +++ b/docs/install/docker/linux-docker_en.md @@ -21,46 +21,52 @@ For domestic users, when downloading docker is slow due to network problems, you * CPU version of PaddlePaddle: ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 ``` * CPU version of PaddlePaddle, and the image is pre-installed with jupyter: ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter ``` * GPU version of PaddlePaddle(**Latest version of gpu image is recommended, and make sure NVIDIA Container Toolkit is installed successfully**): ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda11.8-cudnn8.9 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda11.8-cudnn8.9 ``` ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5 ``` ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.9-cudnn9.9 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.9-cudnn9.9 + ``` + ``` + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda13.0-cudnn9.13 ``` If your machine is not in mainland China, you can pull the image directly from DockerHub: * CPU version of PaddlePaddle: ``` - docker pull paddlepaddle/paddle:3.2.0 + docker pull paddlepaddle/paddle:3.2.1 ``` * CPU version of PaddlePaddle, and the image is pre-installed with jupyter: ``` - docker pull paddlepaddle/paddle:3.2.0-jupyter + docker pull paddlepaddle/paddle:3.2.1-jupyter ``` * GPU version of PaddlePaddle(**Latest version of gpu image is recommended, and make sure NVIDIA Container Toolkit is installed successfully**): ``` - docker pull paddlepaddle/paddle:3.2.0-gpu-cuda11.8-cudnn8.9 + docker pull paddlepaddle/paddle:3.2.1-gpu-cuda11.8-cudnn8.9 + ``` ``` + docker pull paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5 ``` - docker pull paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5 ``` + docker pull paddlepaddle/paddle:3.2.1-gpu-cuda12.9-cudnn9.9 ``` - docker pull paddlepaddle/paddle:3.2.0-gpu-cuda12.9-cudnn9.9 + ``` + docker pull paddlepaddle/paddle:3.2.1-gpu-cuda13.0-cudnn9.13 ``` You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to get more images. @@ -72,7 +78,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g ``` - docker run --name paddle_docker -it -v $PWD:/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 /bin/bash + docker run --name paddle_docker -it -v $PWD:/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 /bin/bash ``` - `--name paddle_docker`: set name of Docker, `paddle_docker` is name of docker you set; @@ -83,7 +89,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g - `-v $PWD:/paddle`: Specifies to mount the current path of the host (PWD variable in Linux will expand to the absolute path of the current path) to the /paddle directory inside the container; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0`: Specify the name of the image to be used. You can view it through the 'docker images' command. /bin/Bash is the command to be executed in Docker + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1`: Specify the name of the image to be used. You can view it through the 'docker images' command. /bin/Bash is the command to be executed in Docker * Use GPU version of PaddlePaddle: @@ -91,7 +97,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g ``` - docker run --gpus all --name paddle_docker -v $PWD:/paddle --network=host -it ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5 /bin/bash + docker run --gpus all --name paddle_docker -v $PWD:/paddle --network=host -it ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5 /bin/bash ``` - `--gpus all`: gpu resources can be used in Docker container; @@ -104,7 +110,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g - `-v $PWD:/paddle`: Specifies to mount the current path of the host (PWD variable in Linux will expand to the absolute path of the current path) to the /paddle directory inside the container; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5`: Specify the name of the image to be used. You can view it through the 'docker images' command. /bin/Bash is the command to be executed in Docker + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5`: Specify the name of the image to be used. You can view it through the 'docker images' command. /bin/Bash is the command to be executed in Docker * Use CPU version of PaddlePaddle with jupyter: @@ -120,7 +126,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g cd ./jupyter_docker ``` ``` - docker run -p 80:80 --rm --env USER_PASSWD="password you set" -v $PWD:/home/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter + docker run -p 80:80 --rm --env USER_PASSWD="password you set" -v $PWD:/home/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter ``` - `--rm`: Delete the container after closing it; @@ -131,7 +137,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g - `-v $PWD:/home/paddle`: Specifies to mount the current path (the PWD variable will be expanded to the absolute path of the current path) to the /home/paddle directory inside the container; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter`: Specify the name of the image to be used, you can view it through the `docker images` command + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter`: Specify the name of the image to be used, you can view it through the `docker images` command Now you have successfully used Docker to install PaddlePaddle. For more information about using Docker, see[Docker official documents](https://docs.docker.com) @@ -149,24 +155,28 @@ Now you have successfully used Docker to install PaddlePaddle. For more informat - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 - CPU image with 3.2.0 version of paddle installed + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 + CPU image with 3.2.1 version of paddle installed + + + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter + CPU image of paddle version 3.2.1 is installed, and jupyter is pre-installed in the image. Start the docker to run the jupyter service - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter - CPU image of paddle version 3.2.0 is installed, and jupyter is pre-installed in the image. Start the docker to run the jupyter service + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda11.8-cudnn8.9 + GPU image of paddle version 3.2.1 is installed, cuda version is 11.8, cudnn version is 8.9 - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda11.8-cudnn8.9 - GPU image of paddle version 3.2.0 is installed, cuda version is 11.8, cudnn version is 8.9 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.6-cudnn9.5 + GPU image of paddle version 3.2.1 is installed, cuda version is 12.6, cudnn version is 9.5 - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.6-cudnn9.5 - GPU image of paddle version 3.2.0 is installed, cuda version is 12.6, cudnn version is 9.5 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda12.9-cudnn9.9 + GPU image of paddle version 3.2.1 is installed, cuda version is 12.9, cudnn version is 9.9 - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-gpu-cuda12.9-cudnn9.9 - GPU image of paddle version 3.2.0 is installed, cuda version is 12.9, cudnn version is 9.9 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-gpu-cuda13.0-cudnn9.13 + GPU image of paddle version 3.2.1 is installed, cuda version is 13.0, cudnn version is 9.13 diff --git a/docs/install/docker/macos-docker.md b/docs/install/docker/macos-docker.md index d080b92b463..198539e608a 100644 --- a/docs/install/docker/macos-docker.md +++ b/docs/install/docker/macos-docker.md @@ -19,24 +19,24 @@ * CPU 版的 PaddlePaddle: ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 ``` * CPU 版的 PaddlePaddle,且镜像中预装好了 jupyter: ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter ``` 如果您的机器不在中国大陆地区,可以直接从 DockerHub 拉取镜像: * CPU 版的 PaddlePaddle: ``` - docker pull paddlepaddle/paddle:3.2.0 + docker pull paddlepaddle/paddle:3.2.1 ``` * CPU 版的 PaddlePaddle,且镜像中预装好了 jupyter: ``` - docker pull paddlepaddle/paddle:3.2.0-jupyter + docker pull paddlepaddle/paddle:3.2.1-jupyter ``` 您还可以访问[DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/)获取更多镜像。 @@ -48,7 +48,7 @@ ``` - docker run --name paddle_docker -it -v $PWD:/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 /bin/bash + docker run --name paddle_docker -it -v $PWD:/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 /bin/bash ``` - `--name paddle_docker`:设定 Docker 的名称,`paddle_docker` 是自己设置的名称; @@ -59,7 +59,7 @@ - `-v $PWD:/paddle`:指定将当前路径(PWD 变量会展开为当前路径的绝对路径)挂载到容器内部的 /paddle 目录; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0`:指定需要使用的 image 名称,您可以通过`docker images`命令查看;/bin/bash 是在 Docker 中要执行的命令 + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1`:指定需要使用的 image 名称,您可以通过`docker images`命令查看;/bin/bash 是在 Docker 中要执行的命令 * 使用 CPU 版本的 PaddlePaddle,且镜像中预装好了 jupyter: @@ -73,7 +73,7 @@ cd ./jupyter_docker ``` ``` - docker run -p 80:80 --rm --env USER_PASSWD="password you set" -v $PWD:/home/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter + docker run -p 80:80 --rm --env USER_PASSWD="password you set" -v $PWD:/home/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter ``` - `--rm`:关闭容器后删除容器; @@ -84,7 +84,7 @@ - `-v $PWD:/home/paddle`:指定将当前路径(PWD 变量会展开为当前路径的绝对路径)挂载到容器内部的 /home/paddle 目录; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter`:指定需要使用的 image 名称,您可以通过`docker images`命令查看 + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter`:指定需要使用的 image 名称,您可以通过`docker images`命令查看 @@ -104,12 +104,12 @@ - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 - 安装了 3.2.0 版本 paddle 的 CPU 镜像 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 + 安装了 3.2.1 版本 paddle 的 CPU 镜像 - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter - 安装了 3.2.0 版本 paddle 的 CPU 镜像,且镜像中预装好了 jupyter,启动 docker 即运行 jupyter 服务 + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter + 安装了 3.2.1 版本 paddle 的 CPU 镜像,且镜像中预装好了 jupyter,启动 docker 即运行 jupyter 服务 diff --git a/docs/install/docker/macos-docker_en.md b/docs/install/docker/macos-docker_en.md index 4ddc2600415..7ad2ee08075 100644 --- a/docs/install/docker/macos-docker_en.md +++ b/docs/install/docker/macos-docker_en.md @@ -19,24 +19,24 @@ For domestic users, when downloading docker is slow due to network problems, you * CPU version of PaddlePaddle: ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 ``` * CPU version of PaddlePaddle, and the image is pre-installed with jupyter: ``` - docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter + docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter ``` If your machine is not in mainland China, you can pull the image directly from DockerHub: * CPU version of PaddlePaddle: ``` - docker pull paddlepaddle/paddle:3.2.0 + docker pull paddlepaddle/paddle:3.2.1 ``` * CPU version of PaddlePaddle, and the image is pre-installed with jupyter: ``` - docker pull paddlepaddle/paddle:3.2.0-jupyter + docker pull paddlepaddle/paddle:3.2.1-jupyter ``` You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to get more images. @@ -48,7 +48,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g ``` - docker run --name paddle_docker -it -v $PWD:/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 /bin/bash + docker run --name paddle_docker -it -v $PWD:/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 /bin/bash ``` - `--name paddle_docker`: set name of Docker, `paddle_docker` is name of docker you set; @@ -59,7 +59,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g - `-v $PWD:/paddle`: Specifies to mount the current path of the host (PWD variable in Linux will expand to the absolute path of the current path) to the /paddle directory inside the container; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0`: Specify the name of the image to be used. You can view it through the 'docker images' command. /bin/Bash is the command to be executed in Docker + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1`: Specify the name of the image to be used. You can view it through the 'docker images' command. /bin/Bash is the command to be executed in Docker * Use CPU version of PaddlePaddle with jupyter: @@ -75,7 +75,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g cd ./jupyter_docker ``` ``` - docker run -p 80:80 --rm --env USER_PASSWD="password you set" -v $PWD:/home/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter + docker run -p 80:80 --rm --env USER_PASSWD="password you set" -v $PWD:/home/paddle ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter ``` - `--rm`: Delete the container after closing it; @@ -86,7 +86,7 @@ You can see [DockerHub](https://hub.docker.com/r/paddlepaddle/paddle/tags/) to g - `-v $PWD:/home/paddle`: Specifies to mount the current path (the PWD variable will be expanded to the absolute path of the current path) to the /home/paddle directory inside the container; - - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter`: Specify the name of the image to be used, you can view it through the `docker images` command + - `ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter`: Specify the name of the image to be used, you can view it through the `docker images` command @@ -105,12 +105,12 @@ Now you have successfully used Docker to install PaddlePaddle. For more informat - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0 - CPU image with 3.2.0 version of paddle installed + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1 + CPU image with 3.2.1 version of paddle installed - ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.0-jupyter - CPU image of paddle version 3.2.0 is installed, and jupyter is pre-installed in the image. Start the docker to run the jupyter service + ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddle:3.2.1-jupyter + CPU image of paddle version 3.2.1 is installed, and jupyter is pre-installed in the image. Start the docker to run the jupyter service diff --git a/docs/install/pip/linux-pip.md b/docs/install/pip/linux-pip.md index 3d085f45c8d..561c59fbf5c 100644 --- a/docs/install/pip/linux-pip.md +++ b/docs/install/pip/linux-pip.md @@ -69,7 +69,7 @@ ``` - python3 -m pip install paddlepaddle==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ + python3 -m pip install paddlepaddle==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ ``` @@ -80,7 +80,7 @@ ``` - python3 -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ + python3 -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ ``` @@ -88,14 +88,21 @@ ``` - python3 -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ + python3 -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ ``` 2.2.3 CUDA12.9 的 PaddlePaddle(如果需要使用 TensorRT 可自行安装 TensorRT10.5.0.18) ``` - python3 -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu129/ + python3 -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu129/ + ``` + +2.2.4 CUDA13.0 的 PaddlePaddle(如果需要使用 TensorRT 可自行安装 TensorRT10.5.0.18) + + + ``` + python3 -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu130/ ``` diff --git a/docs/install/pip/linux-pip_en.md b/docs/install/pip/linux-pip_en.md index 5c38fd2b4d9..b95fee4ac6e 100644 --- a/docs/install/pip/linux-pip_en.md +++ b/docs/install/pip/linux-pip_en.md @@ -80,7 +80,7 @@ You can choose the following version of PaddlePaddle to start installation: ``` - python3 -m pip install paddlepaddle==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ + python3 -m pip install paddlepaddle==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ ``` @@ -91,20 +91,26 @@ You can choose the following version of PaddlePaddle to start installation: ``` - python3 -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ + python3 -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ ``` 2.2.2 If you are using CUDA 12.6(If you need to use TensorRT, you can install TensorRT 10.5.0.18 yourself) ``` - python3 -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ + python3 -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ ``` 2.2.3 If you are using CUDA 12.9(If you need to use TensorRT, you can install TensorRT 10.5.0.18 yourself) ``` - python3 -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu129/ + python3 -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu129/ + ``` + +2.2.3 If you are using CUDA 13.0(If you need to use TensorRT, you can install TensorRT 10.5.0.18 yourself) + + ``` + python3 -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu130/ ``` diff --git a/docs/install/pip/macos-pip.md b/docs/install/pip/macos-pip.md index 4690e775ba5..32df31512db 100644 --- a/docs/install/pip/macos-pip.md +++ b/docs/install/pip/macos-pip.md @@ -61,7 +61,7 @@ ``` - python3 -m pip install paddlepaddle==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ + python3 -m pip install paddlepaddle==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ ``` diff --git a/docs/install/pip/macos-pip_en.md b/docs/install/pip/macos-pip_en.md index f62eb53b921..0b4003b4d03 100644 --- a/docs/install/pip/macos-pip_en.md +++ b/docs/install/pip/macos-pip_en.md @@ -61,7 +61,7 @@ You can choose the following version of PaddlePaddle to start installation: ``` -python3 -m pip install paddlepaddle==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ +python3 -m pip install paddlepaddle==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ ``` Note: diff --git a/docs/install/pip/windows-pip.md b/docs/install/pip/windows-pip.md index 5df6aeded27..e4a78d23f02 100644 --- a/docs/install/pip/windows-pip.md +++ b/docs/install/pip/windows-pip.md @@ -57,7 +57,7 @@ ``` - python -m pip install paddlepaddle==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ + python -m pip install paddlepaddle==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ ``` @@ -67,18 +67,18 @@ 2.2.1 CUDA11.8 的 PaddlePaddle(如果需要使用 TensorRT 可自行安装 TensorRT8.5.1.7) ``` - python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ + python -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ ``` 2.2.2 CUDA12.6 的 PaddlePaddle(如果需要使用 TensorRT 可自行安装 TensorRT10.5.0.18) ``` - python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ + python -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ ``` 2.2.3 CUDA12.9 的 PaddlePaddle(如果需要使用 TensorRT 可自行安装 TensorRT10.5.0.18) ``` - python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu129/ + python -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu129/ ``` 注: diff --git a/docs/install/pip/windows-pip_en.md b/docs/install/pip/windows-pip_en.md index 863c3db0adc..1fb734b7bd5 100644 --- a/docs/install/pip/windows-pip_en.md +++ b/docs/install/pip/windows-pip_en.md @@ -53,7 +53,7 @@ You can choose the following version of PaddlePaddle to start installation: ``` - python -m pip install paddlepaddle==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ + python -m pip install paddlepaddle==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/ ``` @@ -63,19 +63,19 @@ You can choose the following version of PaddlePaddle to start installation: 2.2.1 If you are using CUDA 11.8(If you need to use TensorRT, you can install TensorRT 8.5.1.7 yourself) ``` - python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ + python -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/ ``` 2.2.2 If you are using CUDA 12.6(If you need to use TensorRT, you can install TensorRT 10.5.0.18 yourself) ``` - python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ + python -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu126/ ``` 2.2.3 If you are using CUDA 12.9(If you need to use TensorRT, you can install TensorRT 10.5.0.18 yourself) ``` - python -m pip install paddlepaddle-gpu==3.2.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu129/ + python -m pip install paddlepaddle-gpu==3.2.1 -i https://www.paddlepaddle.org.cn/packages/stable/cu129/ ``` Note: diff --git a/docs/practices/nlp/seq2seq_with_attention.ipynb b/docs/practices/nlp/seq2seq_with_attention.ipynb index 4fd1e09df07..7b19bb38f09 100755 --- a/docs/practices/nlp/seq2seq_with_attention.ipynb +++ b/docs/practices/nlp/seq2seq_with_attention.ipynb @@ -670,20 +670,20 @@ "encoder.eval()\n", "atten_decoder.eval()\n", "\n", - "num_of_exampels_to_evaluate = 10\n", + "num_of_examples_to_evaluate = 10\n", "\n", "indices = np.random.choice(\n", - " len(train_en_sents), num_of_exampels_to_evaluate, replace=False\n", + " len(train_en_sents), num_of_examples_to_evaluate, replace=False\n", ")\n", "x_data = train_en_sents[indices]\n", "sent = paddle.to_tensor(x_data)\n", "en_repr = encoder(sent)\n", "\n", - "word = np.array([[cn_vocab[\"\"]]] * num_of_exampels_to_evaluate)\n", + "word = np.array([[cn_vocab[\"\"]]] * num_of_examples_to_evaluate)\n", "word = paddle.to_tensor(word)\n", "\n", - "hidden = paddle.zeros([num_of_exampels_to_evaluate, 1, hidden_size])\n", - "cell = paddle.zeros([num_of_exampels_to_evaluate, 1, hidden_size])\n", + "hidden = paddle.zeros([num_of_examples_to_evaluate, 1, hidden_size])\n", + "cell = paddle.zeros([num_of_examples_to_evaluate, 1, hidden_size])\n", "\n", "decoded_sent = []\n", "for i in range(MAX_LEN + 2):\n", @@ -693,7 +693,7 @@ " word = paddle.unsqueeze(word, axis=-1)\n", "\n", "results = np.stack(decoded_sent, axis=1)\n", - "for i in range(num_of_exampels_to_evaluate):\n", + "for i in range(num_of_examples_to_evaluate):\n", " en_input = \" \".join(filtered_pairs[indices[i]][0])\n", " ground_truth_translate = \"\".join(filtered_pairs[indices[i]][1])\n", " model_translate = \"\"\n", diff --git a/docs/practices/nlp/transformer_in_English-to-Spanish.ipynb b/docs/practices/nlp/transformer_in_English-to-Spanish.ipynb index 6a44992e642..2a8718a8c4e 100644 --- a/docs/practices/nlp/transformer_in_English-to-Spanish.ipynb +++ b/docs/practices/nlp/transformer_in_English-to-Spanish.ipynb @@ -1424,8 +1424,8 @@ " encoder_outputs = self.encoder(encoder_emb)\n", "\n", " # 解码器\n", - " deocder_emb = self.ps2(decoder_inputs)\n", - " decoder_outputs = self.decoder(deocder_emb, encoder_outputs)\n", + " decoder_emb = self.ps2(decoder_inputs)\n", + " decoder_outputs = self.decoder(decoder_emb, encoder_outputs)\n", "\n", " # dropout\n", " out = self.drop(decoder_outputs)\n", diff --git a/docs/practices/quick_start/high_level_api.ipynb b/docs/practices/quick_start/high_level_api.ipynb index 2a384912b3e..a79e551dbdb 100755 --- a/docs/practices/quick_start/high_level_api.ipynb +++ b/docs/practices/quick_start/high_level_api.ipynb @@ -941,8 +941,8 @@ " def on_epoch_end(self, epoch, logs=None) 每轮训练结束后,`Model.fit`接口中调用 \n", " def on_train_batch_begin(self, step, logs=None) 单个Batch训练开始前,`Model.fit`和`Model.train_batch`接口中调用\n", " def on_train_batch_end(self, step, logs=None) 单个Batch训练结束后,`Model.fit`和`Model.train_batch`接口中调用\n", - " def on_eval_batch_begin(self, step, logs=None) 单个Batch评估开始前,`Model.evalute`和`Model.eval_batch`接口中调用\n", - " def on_eval_batch_end(self, step, logs=None) 单个Batch评估结束后,`Model.evalute`和`Model.eval_batch`接口中调用\n", + " def on_eval_batch_begin(self, step, logs=None) 单个Batch评估开始前,`Model.evaluate`和`Model.eval_batch`接口中调用\n", + " def on_eval_batch_end(self, step, logs=None) 单个Batch评估结束后,`Model.evaluate`和`Model.eval_batch`接口中调用\n", " def on_test_batch_begin(self, step, logs=None) 单个Batch预测测试开始前,`Model.predict`和`Model.test_batch`接口中调用\n", " def on_test_batch_end(self, step, logs=None) 单个Batch预测测试结束后,`Model.predict`和`Model.test_batch`接口中调用\n", " \"\"\"\n", diff --git a/docs/practices/quick_start/linear_regression.ipynb b/docs/practices/quick_start/linear_regression.ipynb index 7b07bcba595..541334a79f6 100755 --- a/docs/practices/quick_start/linear_regression.ipynb +++ b/docs/practices/quick_start/linear_regression.ipynb @@ -150,7 +150,7 @@ "outputs": [ { "data": { - "image/png": "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1rJKMoF3Zdh+C/CKnH/HcfcFrcZUp4w8ADyW+n3OD6/dDrg2FceY/URBZfiSUBZuJ+msvqw6vvA417pXK7aw/WLgtKrXFpp3LdSzucCFqff/dSgHDwAnFhRbLuWuhbwopC3Mqb4cSE5tRcnp2hNYHH7D75NMaPfc71cj3dH1j3NOb9R97wLSH33fvux/DfLoNMJ+F3hf2D/cRnJgff8c4qg3Vk7HUUT/dRrJQrrNUttyz4ssdZWc+hd1Ysi9/xpLu9ygLtTsIxcYV6HzSBljq1VfCs+vjPUn6j4NqX5nr/2jRt+z7Jg6nL5PAveQzH1cQg/MydVqn4F/JFksVP3an8dWn/JIc2hDPkdygO0OYF7ZMeec3t2AX4V90FLg0LJjbiENdcfqJFecexC4Fzi8wJh+AjzFxv7GorB9/1Cubgv/n1RgTP/Kxj7uDcCuqfd2fC6rmfYFWAh8qup9eeZRrf5EU2ORovKoW//VydvS+7JtpklzDdnzrPQy3eB3K23MR4TjPSIY52VpNxq1zznEVXg5jq29oaQ1NuH7mj6ekWMMY8Z9RedD9T8LgYmIiIiIiIiIiIiIiIiIiIiIiIhIE3SrWREREREREREREREREREREREREZEMtPBOREREREREREREREREREREREREJAMtvBMRERERERERERERERERERERERHJQAvvRERERERERERERERERERERERERDLQwjsRERERERERERERERERERERERGRDLTwrsuYmZvZd1KP+81spZn9MDw+ITxemvq3m5ntaGZrzGyJmd1tZreY2QnhPTua2XIz66v6rqVm9rpCEyg9z8xW1di2i5n9PJS5u83sa2b2llQZXmVm94a/v5163xfM7PFK2TWzE1PvWWdmd4S/P1VkGkWqmdlQKIu3mdlvzWz/smOSiSNV/u40syvNbPtUW/lkaEcrjydXvf4HZjaz6vM+YGYvmdlm4XHd9trMDqz0UcJr325mt4e2/g4ze3vR+SG9z8y2GKeMvz30qXdNvWeumd1lZpPD453N7CEzm1FeSmQiy9oWh20HmtnzYcx3r5n9wsyOKD56kdFS5fmu0B/+UGoMN9JXMLNtzOyH4TXLzOzaciMXSdTpO7wylNcHzexWM7vBzN4Ynqs5N1deCkQ2qtfHsGR+2M3sn1Kv3dLM1pvZeeVFLDJyTOSzqccfNrOF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B5L+696V17n70cAJwObFRymSWc0+RkUYL94KfAi4qvjwRBr6Asmtv6eltjWcazCzacBnSNrzrc3srQXEKVJxF2PLZzPmA28O/Y9bgS1IyjCQ3I4z3M7zEOAvOxCnSLP+heQW3+MtrEvPRawJF9Oo2Bx4uvIg47FBkY4zswNJ2tJ6t6NvttyLFKFR3+LBMNbbGZhjZkfW+xB3vwX4M2DLcIV/aZMW3nWvi4BPtnq/ezPbkWTh3r+lNl9NchWxd7LxbF6R3JnZYZVbxZrZtiQDyccbvGU+cLK77+juOwI7AYfoALl0AzPbleTWWs+UHYtII+7+IsmZ5B8Kt6mdDyystL3uvh2wnZm9vMmPPBc4K/RBKn2RfwA+2+HQReo5BrjE3V8eyvAOwMPAG8Lt3z4HvDf0r/8D+FiJsYoA7bXFZrYH8HGS23KJRCFcwe584Dx396rn3lQZ05nZpiQThY+O/RSRwtTrOzwAHFA1ia35COkqNfoYaZ8Fzgi3NBSJRiiTV5Asvqv4DPBpM9sCINzN5wTgK+H5TwBXuPs9wOnA58Ptt0SK8DNgipmdUtkQxmk71HuDmc0A3gD8Ser4x3uB+WY2PSwQqdgT+F0egYvUEtrSZcCf13reEn8LvIyNtzj8b2BBeH6Q5ESWG8LjrMcGRTrKzGYB3wSOc/cXar1mvHIvUrBx+xbu/jRwJnDWOJ91JskxOumA6kG1dAl3Xw58qc7T7zSz16cenw78nuTykkuAqcALwJfc/eLUZz5nZjcC24ZLp4rkYRMzW556/DlgNvBFM3spbPuIuz9Z683hQMxhwGmVbe6+2sz+h6TTo9tgSIwqt3KB5KyY4919qMyARJrh7kvM7HaShR7zSBbop10Ttn+6ic9aamZnAD8IEyrrgY+6+9Jx3irSKfMZW1a/F7YfBlzj7svC9oXAbWZ2sbvfX1yIImNlaItvJllIuoRkAcgK4G/d/adFxitSQ6UvPEByBYNLSMaB1eYA55nZBpITRS90998UF6bIGPX6DvNIbgH3OTP7AsltXF4A/in1ujFzc+7+6zyDFcmqqo/xy9T2u9CVySVenyV1RRp3X2Rm2wO/NjMnaY8XuPsTZvYa4GjgteG1S8zsOpKr1nyy+NBlonF3N7OjgS+EObGXgEeADzR429HAz9x9bWrbf5AsMv0g8FEzuwBYA6wmWWgqUqR/BpZUbTvHzD5OMhdxE3BQ6q4rfwdcEBbkGfBtd/9FeO5Qmjw2KJKT04Ctga+Gm6JUVN8ZsFa5Fylchr7F94GFZvaGBp/1o9wCnYCs6gRjEREREREREREREREREREREREREWlAt5oVERERERERERERERERERERERERyUAL70REREREREREREREREREREREREQy0MI7ERERERERERERERERERERERERkQy08E5EREREREREREREREREREREREQkAy28ExEREREREREREREREREREREREclAC+9EREREREREREREREREREREREREMtDCOxEREREREREREREREREREREREZEM/hcITc0MgyrJggAAAABJRU5ErkJggg==\n", + "image/png": "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1rJKMoF3Zdh+C/CKnH/HcfcFrcZUp4w8ADyW+n3OD6/dDrg2FceY/URBZfiSUBZuJ+msvqw6vvA417pXK7aw/WLgtKrXFpp3LdSzucCFqff/dSgHDwAnFhRbLuWuhbwopC3Mqb4cSE5tRcnp2hNYHH7D75NMaPfc71cj3dH1j3NOb9R97wLSH33fvux/DfLoNMJ+F3hf2D/cRnJgff8c4qg3Vk7HUUT/dRrJQrrNUttyz4ssdZWc+hd1Ysi9/xpLu9ygLtTsIxcYV6HzSBljq1VfCs+vjPUn6j4NqX5nr/2jRt+z7Jg6nL5PAveQzH1cQg/MydVqn4F/JFksVP3an8dWn/JIc2hDPkdygO0OYF7ZMeec3t2AX4V90FLg0LJjbiENdcfqJFecexC4Fzi8wJh+AjzFxv7GorB9/1Cubgv/n1RgTP/Kxj7uDcCuqfd2fC6rmfYFWAh8qup9eeZRrf5EU2ORovKoW//VydvS+7JtpklzDdnzrPQy3eB3K23MR4TjPSIY52VpNxq1zznEVXg5jq29oaQ1NuH7mj6ekWMMY8Z9RedD9T8LgYmIiIiIiIiIiIiIiIiIiIiIiIhIE3SrWREREREREREREREREREREREREZEMtPBOREREREREREREREREREREREREJAMtvBMRERERERERERERERERERERERHJQAvvRERERERERERERERERERERERERDLQwjsRERERERERERERERERERERERGRDLTwrsuYmZvZd1KP+81spZn9MDw+ITxemvq3m5ntaGZrzGyJmd1tZreY2QnhPTua2XIz66v6rqVm9rpCEyg9z8xW1di2i5n9PJS5u83sa2b2llQZXmVm94a/v5163xfM7PFK2TWzE1PvWWdmd4S/P1VkGkWqmdlQKIu3mdlvzWz/smOSiSNV/u40syvNbPtUW/lkaEcrjydXvf4HZjaz6vM+YGYvmdlm4XHd9trMDqz0UcJr325mt4e2/g4ze3vR+SG9z8y2GKeMvz30qXdNvWeumd1lZpPD453N7CEzm1FeSmQiy9oWh20HmtnzYcx3r5n9wsyOKD56kdFS5fmu0B/+UGoMN9JXMLNtzOyH4TXLzOzaciMXSdTpO7wylNcHzexWM7vBzN4Ynqs5N1deCkQ2qtfHsGR+2M3sn1Kv3dLM1pvZeeVFLDJyTOSzqccfNrOF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B5L+696V17n70cAJwObFRymSWc0+RkUYL94KfAi4qvjwRBr6Asmtv6eltjWcazCzacBnSNrzrc3srQXEKVJxF2PLZzPmA28O/Y9bgS1IyjCQ3I4z3M7zEOAvOxCnSLP+heQW3+MtrEvPRawJF9Oo2Bx4uvIg47FBkY4zswNJ2tJ6t6NvttyLFKFR3+LBMNbbGZhjZkfW+xB3vwX4M2DLcIV/aZMW3nWvi4BPtnq/ezPbkWTh3r+lNl9NchWxd7LxbF6R3JnZYZVbxZrZtiQDyccbvGU+cLK77+juOwI7AYfoALl0AzPbleTWWs+UHYtII+7+IsmZ5B8Kt6mdDyystL3uvh2wnZm9vMmPPBc4K/RBKn2RfwA+2+HQReo5BrjE3V8eyvAOwMPAG8Lt3z4HvDf0r/8D+FiJsYoA7bXFZrYH8HGS23KJRCFcwe584Dx396rn3lQZ05nZpiQThY+O/RSRwtTrOzwAHFA1ia35COkqNfoYaZ8Fzgi3NBSJRiiTV5Asvqv4DPBpM9sCINzN5wTgK+H5TwBXuPs9wOnA58Ptt0SK8DNgipmdUtkQxmk71HuDmc0A3gD8Ser4x3uB+WY2PSwQqdgT+F0egYvUEtrSZcCf13reEn8LvIyNtzj8b2BBeH6Q5ESWG8LjrMcGRTrKzGYB3wSOc/cXar1mvHIvUrBx+xbu/jRwJnDWOJ91JskxOumA6kG1dAl3Xw58qc7T7zSz16cenw78nuTykkuAqcALwJfc/eLUZz5nZjcC24ZLp4rkYRMzW556/DlgNvBFM3spbPuIuz9Z683hQMxhwGmVbe6+2sz+h6TTo9tgSIwqt3KB5KyY4919qMyARJrh7kvM7HaShR7zSBbop10Ttn+6ic9aamZnAD8IEyrrgY+6+9Jx3irSKfMZW1a/F7YfBlzj7svC9oXAbWZ2sbvfX1yIImNlaItvJllIuoRkAcgK4G/d/adFxitSQ6UvPEByBYNLSMaB1eYA55nZBpITRS90998UF6bIGPX6DvNIbgH3OTP7AsltXF4A/in1ujFzc+7+6zyDFcmqqo/xy9T2u9CVySVenyV1RRp3X2Rm2wO/NjMnaY8XuPsTZvYa4GjgteG1S8zsOpKr1nyy+NBlonF3N7OjgS+EObGXgEeADzR429HAz9x9bWrbf5AsMv0g8FEzuwBYA6wmWWgqUqR/BpZUbTvHzD5OMhdxE3BQ6q4rfwdcEBbkGfBtd/9FeO5Qmjw2KJKT04Ctga+Gm6JUVN8ZsFa5Fylchr7F94GFZvaGBp/1o9wCnYCs6gRjEREREREREREREREREREREREREWlAt5oVERERERERERERERERERERERERyUAL70REREREREREREREREREREREREQy0MI7ERERERERERERERERERERERERkQy08E5EREREREREREREREREREREREQkAy28ExEREREREREREREREREREREREclAC+9EREREREREREREREREREREREREMtDCOxEREREREREREREREREREREREZEM/hcITc0MgyrJggAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -185,7 +185,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -233,7 +233,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD8CAYAAAB5Pm/hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3XucHFWd9/HPL1cCQQKTkHuMO4C6iwhhFH1UXpBAgMBDYB8vZLMr+oqvrBERlCiEuD66SoK7KKDo7LKwGnyiAXXdBJIlQAZ30RUkMRgC4TKTNZBMbkwgkAu5kN/zR51Oqnv6Uj3dk56ufN+v17ymzqlTp05VV/369OnqKnN3REQkvXrVugEiItK9FOhFRFJOgV5EJOUU6EVEUk6BXkQk5RToRURSToFeRCTlFOhFRFJOgV5EJOX61LoBAIMHD/axY8fWuhkiInVlxYoVr7j7kFLlekSgHzt2LMuXL691M0RE6oqZrUtSTkM3IiIpp0AvIpJyCvQiIimnQC8iknIK9CIiKadALyKScgr0IiIp1yOuoxeR+tTc3ExbW1tWXnt7OwAjRozIym9sbGTGjBmHrW1ySMkevZm908yeiv29bmbXmtkJZvawmb0Y/h8fypuZfc/MWs1slZmN6/7NEJGeYvfu3ezevbvWzZAYK+fh4GbWG9gAnAVcBWxz95vN7AbgeHe/3swmAVcDk0K52939rGL1NjU1uX4ZK5IOM2fOBOCWW26pcUvSz8xWuHtTqXLljtFPANrcfR0wGZgX8ucBl4XpycA9HnkcGGRmw8tcj4iIVEm5gf4K4Gdheqi7bwzTm4ChYXok8HJsmfUhL4uZTTez5Wa2fOvWrWU2Q0REkkoc6M2sH3Ap8PPceR6N/yQfA4qWudPdm9y9aciQkjdfExGRLiqnR38R8Ad33xzSmzNDMuH/lpC/ARgdW25UyBMRkRooJ9BP4dCwDcAi4MowfSWwMJb/yXD1zQeA7bEhHhEROcwSXUdvZscA5wN/G8u+GbjPzKYB64CPh/wlRFfctAK7gE9XrbUiIlK2RIHe3XcCDTl5HURX4eSWdaJLL0VEpAfQLRBERFJOgV5EJOUU6EVEUk43NRORkvLdvKyQTLnMrRCK0Y3ODg8FehEpqa2tjWefa+XYwWNKlt1PPwBefmVv0XJvvPJSVdompSnQi0gixw4ew1mTb6xafU8snFO1uqQ4jdGLiKScAr2ISMop0IuIpJwCvYhIyinQi4iknAK9iEjKKdCLiKScAr2ISMop0IuIpJwCvYhIyinQi4iknAK9iEjKJQr0ZjbIzH5hZs+Z2Roz+6CZnWBmD5vZi+H/8aGsmdn3zKzVzFaZ2bju3QQRESkmaY/+duBBd38X8F5gDXADsMzdTwaWhTTARcDJ4W860FzVFouISFlKBnozOw44G7gbwN33uvtrwGRgXig2D7gsTE8G7vHI48AgMxte9ZaLiEgiSXr07wC2Aj8ys5VmdpeZHQMMdfeNocwmYGiYHgm8HFt+fcgTEZEaSBLo+wDjgGZ3PwPYyaFhGgDc3QEvZ8VmNt3MlpvZ8q1bt5azqIiIlCFJoF8PrHf3J0L6F0SBf3NmSCb83xLmbwBGx5YfFfKyuPud7t7k7k1DhgzpavtFRKSEkoHe3TcBL5vZO0PWBOBZYBFwZci7ElgYphcBnwxX33wA2B4b4hERkcMs6TNjrwbmm1k/YC3waaI3ifvMbBqwDvh4KLsEmAS0ArtCWRERqZFEgd7dnwKa8syakKesA1dV2C4REakS/TJWRCTlFOhFRFJOgV5EJOUU6EVEUk6BXkQk5RToRURSToFeRCTlFOhFRFJOgV5EJOUU6EVEUk6BXkQk5RToRURSToFeRCTlFOhFRFJOgV5EJOUU6EVEUk6BXkQk5RToRURSToFeRCTlEgV6M/uTmT1tZk+Z2fKQd4KZPWxmL4b/x4d8M7PvmVmrma0ys3HduQEiIlJcOT36c939dHfPPCT8BmCZu58MLAtpgIuAk8PfdKC5Wo0VEZHyVTJ0MxmYF6bnAZfF8u/xyOPAIDMbXsF6RESkAkkDvQMPmdkKM5se8oa6+8YwvQkYGqZHAi/Hll0f8kREpAb6JCz3YXffYGYnAg+b2XPxme7uZublrDi8YUwHGDNmTDmLiohIGRL16N19Q/i/BfgV8H5gc2ZIJvzfEopvAEbHFh8V8nLrvNPdm9y9aciQIV3fAhERKapkoDezY8zs2Mw0MBFYDSwCrgzFrgQWhulFwCfD1TcfALbHhnhEROQwSzJ0MxT4lZllyv/U3R80syeB+8xsGrAO+HgovwSYBLQCu4BPV73VIiKSWMlA7+5rgffmye8AJuTJd+CqqrROREQqpl/GioiknAK9iEjKKdCLiKScAr2ISMop0IuIpJwCvYhIyinQi4iknAK9iEjKKdCLiKScAr2ISMop0IuIpJwCvYhIyinQi4iknAK9iEjKKdCLiKScAr2ISMop0IuIpJwCvYhIyinQi4ikXOJAb2a9zWylmT0Q0u8wsyfMrNXM7jWzfiG/f0i3hvlju6fpIiKSRDk9+muANbH0t4Fb3f0k4FVgWsifBrwa8m8N5UREpEYSBXozGwVcDNwV0gaMB34RiswDLgvTk0OaMH9CKC8iIjWQtEd/G/AV4EBINwCvufv+kF4PjAzTI4GXAcL87aG8iIjUQJ9SBczsEmCLu68ws3OqtWIzmw5MBxgzZky1qhURKam5uZm2trasvPb2dnbv3p1o+QEDBjBixIhO+Y2NjcyYMaMqbaymkoEe+BBwqZlNAo4C3gbcDgwysz6h1z4K2BDKbwBGA+vNrA9wHNCRW6m73wncCdDU1OSVboiISFKPPfYY217ZRv/e/Q/m7TuwjwN+oMhSh+zZtYedr+7MzntrD+3t7fUZ6N19FjALIPToZ7r7VDP7OfBRYAFwJbAwLLIopH8X5re4uwK5iPQo/Xv35+3Hvr1q9a17Y13V6qq2JD36Qq4HFpjZt4CVwN0h/27gJ2bWCmwDrqisiSIi1TVixAj27t/LrKZZVatz7vK59BvRr2r1VVNZgd7dfw38OkyvBd6fp8ybwMeq0DYREakC/TJWRCTlKhm6ERGpWy/teIm5y+cWLbN512YAhh49NFF9J3FSVdpWbQr0InLEaWxsTFRub9teAPqNKT32fhInJa73cFOgF5EjTtJLIGfOnAnALbfc0p3N6XYaoxcRSTkFehGRlFOgFxEpYNeuXaxevZq1a9fWuikVUaAXESlg3bp1HDhwgG984xu1bkpFFOhFRPJobW1l3759AGzcuLGue/W66kZEhM53tFyzZk3W/Kuvvpp3v/vdQM+9S2Uh6tGLiOSR6c0XStcT9ehFROh8bf3EiRM7lanX6+nVoxcRSTn16EWkpPb2dt54fSdPLJxTtTrfeGUd7XuPqVp9Uph69CIiKacevYiUNGLECN7qt5ezJt9YtTqfWDiHEYN75oM6AMyM+MPxzKyGramMevQiIimnQC8ikkfuo67r+dHXCvQiIilXMtCb2VFm9nsz+6OZPWNm3wj57zCzJ8ys1czuNbN+Ib9/SLeG+WO7dxNERKqvb9++RdP1JEmPfg8w3t3fC5wOXGhmHwC+Ddzq7icBrwLTQvlpwKsh/9ZQTkSkrgwcODArfeyxx9aoJZUrGeg9siMk+4Y/B8YDvwj584DLwvTkkCbMn2D1/HW1iByRXn311az0tm3batSSyiUaozez3mb2FLAFeBhoA15z9/2hyHpgZJgeCbwMEOZvBxqq2WgREUkuUaB397fc/XRgFPB+4F2VrtjMppvZcjNbvnXr1kqrExGRAsq66sbdXwMeBT4IDDKzzA+uRgEbwvQGYDRAmH8c0JGnrjvdvcndm4YMGdLF5ouIdI/+/ftnpY866qgataRySa66GWJmg8L0AOB8YA1RwP9oKHYlsDBMLwppwvwWr+cLUEXkiLRnz56s9JtvvlmjllQuyS0QhgPzzKw30RvDfe7+gJk9Cywws28BK4G7Q/m7gZ+YWSuwDbiiG9otIiIJlQz07r4KOCNP/lqi8frc/DeBj1WldSLSY7zxykuJ7l65a/tmAI4+bmjJ+hh8UlXa1h2GDRvGpk2bDqaHDx9ew9ZURjc1E5GSGhsbE5dt274XgNGlblg2+KSy6j3crrnmGmbNmnUwfe2119awNZVRoBeRksp5PurMmTOB+n0aU8Zvf/vbrPRvfvMbzjij0+BGXdC9bkRE8mhpaclKL1u2rEYtqZwCvYhIHmeeeWZW+n3ve1+NWlI5BXoRkTzWrl2blW5ra6tRSyqnQC8ikseGDRuy0uvXr69RSyqnQC8ikkfu3Stz0/VEgV5EJI99+/YVTdcTBXoRkTyGDRtWNF1PFOhFRPKI/yo2X7qeKNCLiORxpD1KUETkiLNjx46i6XqiQC8ikoeuuhERSTlddSMiknK66kZEJOW2bNlSNF1PFOhFRPKYMGFCVvq8886rUUsqp0AvIpLHpEmTstIXX3xxjVpSOQV6EZE8lixZgpkBYGYsXry4xi3qupKB3sxGm9mjZvasmT1jZteE/BPM7GEzezH8Pz7km5l9z8xazWyVmY3r7o0QEam2lpYW3B0Ad0/9g0f2A9e5+58DHwCuMrM/B24Alrn7ycCykAa4CDg5/E0HmqveahGRbjZ+/Hj69ImettqnT59OY/b1pGSgd/eN7v6HMP0GsAYYCUwG5oVi84DLwvRk4B6PPA4MMrP6fXy6iByRpk6dSq9eUYjs1asXU6dOrXGLuq6sMXozGwucATwBDHX3jWHWJmBomB4JvBxbbH3Iy61rupktN7PlW7duLbPZIiLdq6GhgYkTJ2JmXHDBBZxwwgm1blKXJQ70ZjYQ+CVwrbu/Hp/n0UCWl7Nid7/T3ZvcvWnIkCHlLCoiclhMnTqVU089ta5785Aw0JtZX6IgP9/d/y1kb84MyYT/mV8TbABGxxYfFfJERKQG+pQqYNH1RXcDa9z9u7FZi4ArgZvD/4Wx/M+b2QLgLGB7bIhHRFKkubm500OzM+mZM2dm5Tc2NjJjxozD1rZqmD9/PqtXr2b+/PlcffXVtW5OlyXp0X8I+BtgvJk9Ff4mEQX4883sReC8kAZYAqwFWoF/AT5X/WaLSE81YMAABgwYUOtmVKyjo4OlS5fi7ixdupRt27bVukldVrJH7+6/AazA7E7XG4Xx+qsqbJeI1IF666GXY/78+ezfvx+I7lxZz716/TJWRCSPZcuWZf1g6pFHHqlxi7pOgV5EJI/cyykbGhpq1JLKKdCLiOSxcWP2NSTt7e01aknlFOhFRPLI/Cq2ULqe1G/LRUS60TnnnJOVPvfcc2vTkCpQoBcRyWPatGlZ97qZNm1ajVvUdQr0IiJ5NDQ0MH78eCB62lQ93+um5HX0IiJHqmnTprF58+a67s2DAr2ISEENDQ185zvfqXUzKqahGxGRAjo6Orjuuuvq+vYHoEAvIlJQ/KZm9UyBXkQkj/hNzR588MG67tUr0IuI5BG/qdn+/fvrulevQC8ikoduaiYiknInnnhi0XQ9UaAXEcljy5YtRdP1RIFeRCSPCROyn6t03nnn1agllVOgFxHJY9KkSVnpiy++uEYtqVzJQG9m/2pmW8xsdSzvBDN72MxeDP+PD/lmZt8zs1YzW2Vm47qz8d0tLT+WEJHyLVmyBLPoKapmxuLFi2vcoq5L0qP/MXBhTt4NwDJ3PxlYFtIAFwEnh7/pQHN1mlkbafmxhIiUr6WlJeuqm2XLltW4RV1XMtC7+38BuV3aycC8MD0PuCyWf49HHgcGmdnwajX2cOro6GDJkiW4O4sXL1avXuQIc+aZZ2al3/e+99WoJZXr6k3Nhrp75jlbm4ChYXok8HKs3PqQl/1Mrgp1dHQwZ84cZs+e3W23Dp0/fz4HDhwA4MCBA3X9BHgprbm5mba2tqy8zKPjRowY0al8Y2MjM2bMOCxtk9p4/vnns9LPPfdcjVpSuYq/jPXos42Xu5yZTTez5Wa2fOvWrWUteziGVB566KGs9NKlS7ttXdIz7d69m927d9e6GVIjuZdTbt68uUYtqVxXe/SbzWy4u28MQzOZPbIBGB0rNyrkdeLudwJ3AjQ1NSV+o+jo6OChhx7C3Vm6dClTp07tll793r17i6alfuXrvZerra2NmTNnZuWply89VVcD/SLgSuDm8H9hLP/zZrYAOAvYHhviqQoNqUil2traWPXcGqxhUNFy7tFx9vTW0oewd7xWlbaJdIeSgd7MfgacAww2s/XA/yUK8PeZ2TRgHfDxUHwJMAloBXYBn652g1taWrJuNLRs2TIFeimbNQyiz6XnVK2+/Yt+XbW6RKqtZKB39ykFZk3IzQjj9VdV2qhixo8fz+LFi3F3zKzTr9dERKrBzA5eXplJ16u6e5TgpEmTeOCBB4Do2tZ6/rWa1EZ7ezv++vaq9sK94zXa95V9TYL0YPEgny9dT+ruFghLlizJStfzr9VEpOcaOXJkVnrUqFE1aknl6q5Hn/vrtEceeURj9FKWESNG0NHXqj5GP2JIXf42UAoYNWoUGzZsyErXq7rr0afpHtEi0nMtX748K/3kk0/WqCWVq7tAf7juEd23b9+iaRGRelF3gf5w3SM6c61+obSIpNuwYcOy0sOH1+/QXN0F+qlTpxZNV8tbb71VNC0i6ZZ7I8OOjo4ataRydRfoRUQOh6ampqx0Pd+9su4C/d133100LSJSDWvXri2arqbufshR3V1e+eijj2alW1pa+PKXv1yj1ki98o7XSv5gyrfvAMCOG5ioPnR5ZarEL60EWL9+fbet66abbmL16tXMmTOHW265per1112g19i5VKqxsTFRubbXoztcNiYJ4EOGJ65X6sPAgQPZsWNHVro7dHR0sHp19KTWVatWsW3btqrfkbfuAr1IpZLeSjhzG+Lu6GFJz7dv376i6Wq56aabstLd0auvuzF6EZHDIffyytx0tWR68xmrVq2q+jrqrkc/fPhwNm7cmJUWEam2eJzJl+6qJA++yXyarNbDbOou0B999NFZ6WqNmx2Ona/nkorUjzR9H1h3gT43UL744os1akl16JmkUqlCHYikx9aAAQM6dTR6eifjc5/7HK2trZxyyinccccd3bKO7gr0ufv1S1/6UtbwzWmnnVb1Mfq6C/TdJXfnP/roo8ydO/dg+qtf/Spnn312VdcB+sKvq1asWMHs2bOZO3cuZ5xxRq2bU5H777+f73//+1x77bVMmjSp7OWjRyO+QO+GQ2PIB3btwcOT2ErZ5Xt4devrB9NvdWwquw3VkvRNa+fOnQC88MILXH755Vnz6u2Na/bs2UyZcuj5TjfeeGPV16FAX8C5556bFejLDfJJH0CdKZP7oOlCevIBezjNmjULgOuvv56HHnqoxq2pTKZHevvtt3cp0AP0bhjG0Zd+pirt2bXorqrU0xWPPfYYr7zySlnLZIJ+PJ1bR3t7e03Om3IfRD9gwADmzJlTtExXYsARF+jL2fH9+vVj7969jB49umQgzt35bW1tPL9mFUMHFX/8WK8D0VNrXtv4dMn2bH6tfp9wU00rVqzISq9cubJue/X333//wScXuTtLlizpcrBPg+OOO65T733Pnj1ZNxXMd4PBXr16ZU3379+/U7210NbWRuuzzzPmbcWv2Dmu3zHs2PcmI/s3sHf99oLlXnq9a5+2uiXQm9mFwO1Ab+Aud7+5q3VV+0vStrY2Xnz2acYcV/q2w8f02s8xR/Xi6F2b2bNrc8FyL23vfH1t5kvWUo4fWN5zKJPWm2vixIkHp+u9B5zpzWfUU68+93jOvZTutttuo6WlBTgyP701NzfnzSu2zwBOPfXUg9PV2m+9evXKelOJv5kk1d7eTpLu2fCBgxPV53QtBlQ90JtZb+AHwPnAeuBJM1vk7s9We11dNea4vlz/oeo9sOTbv81/T/y9+0v3wveH73f69C69nr3JhlzrVnNzc96Andujy+fCCy8E8vfmJk6c2GM+tif5kjSzTHt7e95OzpH2BpC7rfFOS0Z3fMdVrVuV79m/l3UleuL73opO7r69i4fkPfv3ckwX2tAdPfr3A63uvhbAzBYAk4GSgb7c8axcbW1tnYZYanVSfOQjHylrjD7pz+e78jP73BNj4sSJddMDhuhqh1IPZs6chF19gHO+Y6/Y9ydJjquujDfDoTHnfGPN0Hm8ub29nbc6OnjjR98sXnHmy9k+JU77fXtp39dQVpsPp5NOOonW1taD6VNOOaWGrSkuXxzI92Z/YHc0KtCrf/ZrU+iL5XJ1R6AfCbwcS68HzkqyYFdPjGK/JMt3Umzr2MtVS7JvWLTvLedAwhjRy6Bv70NDLnv2OydY9sepfEGg3DeyJMEkXy94165dJQNeJvibWaffJmTmx9fd1fVk5FtP7jpmzJiRaL/le71PO+00oLpv7AMGDKho+STjze6etQ/NDLPo2Mr36SRTb7nrgUNvhr32Z79mndbTt0/NxrST+OEPf5jVeemuyyurIWkcKPR7mrr/wZSZTQemA4wZMwYo/4CF8r+EybeOsCJI+tGsVy96xdYzoH/Xv+ypNJgcCQ7HR/fu+NSXZLwZst+43vOe9xycTnqSJ11PdweTwynTq+/JvflCarGvrasfdQtWaPZB4OvufkFIzwJw97mFlmlqavLcB/EWc/nll7Nz506OPfZYfvnLX1ba5NTLFxjraegm1w9+8AMWLlx4MP2Xf/mXfPazn61hiypT6XX00j2uv/56Vq5ceTA9btw4br65y9eVdAszW+HuTSXLdUOg7wO8AEwANgBPAn/l7s8UWqbcQC/lSVugh3RdRSQ9U0dHR9YPmRYsWFD12wdXKmmgr/rdK919P/B5YCmwBrivWJCX7pcbCNMQGCdPngxEvXmR7tDQ0HDw9xnjxo3rcUG+HFXv0XeFevTdTz1gkfJ1dHQwZ84cZs+e3SMDfc2GbrpCgV5EpHw1G7oREZGeRYFeRCTlFOhFRFJOgV5EJOV6xJexZrYVWFfmYoOB8u+XUL7DsZ40bUva1pOmbUnbetK0LV1dz9vdfUipQj0i0HeFmS1P8m1zPawnTduStvWkaVvStp40bUt3r0dDNyIiKadALyKScvUc6O9M0XrStC1pW0+atiVt60nTtnTreup2jF5ERJKp5x69iIgkkXnCTU/4A4YBC4A2YAWwBDgF2A08RfQ4wnuAvqH8OcADYfpTRM/OPS9W32Uh76Ml1nt5qD/+dwCYEZa/Olb2DuBTBerZEf6PLbYc8GPgf4A/Et3S+R5gVG49sfSngDvC9DuBX4c2vgC05tlfq3OW/zowM5buA2wFbs4pdwmwMrTrWeBvc+Y78J1YeibRswcy6enAc+Hv98CHQ37v0L6zY2UfAj6W4Jh4K2zrauB+YFDOPv5WrOxgYF9mXyU85jLHyLtieScDD8T266OZtofXYmvOsfLnCdeV2ZZnwj6+DuiV51geGtafeR2WdHU/xeZfC7wJHBfLOwfYHl7z54H/Ai4psZ6G2HZvIroVeSbdr8D+bArbnGnjC8AOomO5WF1lbRNwQWz5HWGbniI6vw7u39jrvoroDrtPA5cV2ad/BP4A/K+Er/OOPHnx83YN0TBNwfbGlrst7JfMcfLp2DJ7Q9ufIudc7rT+pCdEd/8BBvwO+Gws773ARwiBiyhgtABT85wcnwov3F2x5e8NO6FooM/TlunAfwJ/BmwmCqb9wrykgb7gckSB/qOx7f5iOPj7xeuJ1fspDgX6pUTP4M3sr78vtL9i+V8nO9BfBPyWKJBlhu/6Au2ENxygP/DOnHreJHqDGhzSBwM90ZvEiti8ccBLwLCQPiu8Pn2BKcCD5Z40wDxgdmwfrwVWxubPCK93OYH+XuAx4BshfVR4LS6NlTk19tp9qpz6i2zLicAjsfWew6Fj+Z+Ba2JlT+vqforlPRG289OxvIPrDOnTgT8BExJuT9ZxlW9/xvJ/COwJ0w8CvwG+VKKusrcpNu/XQFO+bSU6T1qBd4T0O0L6tCLrvwD4z3Jf51jeUmByLP2eYu0Neb2Ifl/0OHBunjr/RDjfSv31pKGbc4F97v5PmQx3/yOx58+6+1tEPcWRBep4DHi/mfU1s4HASUQnfmJmdgrwNeBviHr1W4FlwJXl1JN0OY/cStSjuShBvcOJnsOb2V9fi9WVtb+KmALcThSIPxjyjiXq6XeEuva4+/M5y+0n6ol8MU+d1wNfdvdXwvJ/IDo5rwrpJ4jemL4OzCF6ZkG5fkf2a78LWGNmmWuPPwHcl7SycIx8GJgGXBGypwK/c/dFmXLuvtrdf9yF9hbk7luIOhSft8xDYg/JvMaZsoUfipxf1n4ys0ZgIPBVote+UJueAv6err02hfZnxo1AXzP7CtFx9v+Izs+kurRNBcwE5rj7/wCE/3OBLxdZ5m3Aq2WuJy73NX06wTLnEH0Saqb8bczSkwL9qUQ9woLM7CiinuGDBYo4US/pAqJe76IC5QrV3xf4KXCdu78Um/VtYKaZ9S6nvjKX+wPwrgTlbiX6VHMHcMDMBuUp02hmT2X+gIPP2Qv78Dyij8I/IxxA7r6NaH+tM7OfmdlUM8t3fPwAmGpmuQ/J/Qs6v37LQ37GLKKP2z9199YE23pQ2IcT6PyaLgCuMLPRRB+123OXLWIy0SeLF4AOMzsztPcPJZb7RHz/mlmXHvzr7muJPqWemDPrB8DdZvaomc02sxGdl86vwH66gmg/PQa808yGFqki6XGYT779CYC7v0Y01DAX+AJRpyZJsKvGNuVKcqwCDAiv73PAXcA3y1hHrluBFjP7DzP7YoHzNtcUonP0V8DFIT51SU8K9MU0hoC1GdhYooezgOgguIJoJ5Xjm8Az7n5vPDOckE8Af1VOZWUul9ur61RdqPNHwLuJxlVHA4+bWf+csm3ufnrmD/in2LxLgEfdfTfwS+CyzBuRu3+G6IT6PVGv51/zbNPrRGOeX0iwTbnOJhoTPrWMZQaE134T0dj1wznzHwTOJ3q976U8U4iOF8L/Tr0mM/uVma02s3+LZd8b379hX1aNuy8lGjb8F6Kgu9LMSv3Mvdh+mgIscPcDRK/5x4rUU+o4LKYqpnr9AAAEP0lEQVTU/uxP9Cl5MdGnybtL1Fetbeqq3eH1fRdwIXBPnk9ficTO258T9dTznbcHmVk/YBLw7+Gce4KoA9slPSnQPwOcWWBeWwhYjcCZZnZpoUrc/ffAe4jGrl5IunIzOwf4PxT+2DqHaHii3Bc66XJnEH1JA7A7vNAZJxC7B4a7txMF4Q1EwynlBM4pwHlm9ieiXk0DMD5W99NhKOl8ov2Rz21EH8+PieU9S+fX70yi1xUzOwb4h7CuE80s6VOwd4fX/u1E+/Cq+Ex33xu24zrgFwnrxMxOCG25K+yLLwMfD+0dF6v/cqJx+ao/XsjM/ozoU8iW3Hnuvs3df+ruf0P03OWzS1SXdz+Z2XuIvlx+OGznFRQfBogfh4kV2p+ZwGhmlxBt67jw//rw2h2ObcpV9FjNx91/R/Rlf8n7yhSpo93d/9XdJ1P6vL0AGAQ8Hbbxw1QwfNOTAn0L0N/MpmcyzOw0ol4rAGH89waiIYBibiAaE0zEzI4HfgR80t3fyFfG3Z8jOkD+d9J6kyxnkS8QjeFlhqT+E/jrMH8AUQB6NKQvDB/hWojGKEcRBfxO+yvPut5G9GXtGHcf6+5jiU6eKWY2MLzZZZxOgRvNhWGe+4iCfcY/AN82s4awrtOJAuQPw/yvET0/+Dngc8CtYRgpEXffRfQp4rrwAPq47xAFjm1J6wM+CvzE3d8e9sVooi+aW4EP5XQmji6j3kRCD/2fiL7Y9Zx5483s6DB9LFEH56XOtXSWZz9NIfrCfGz4GwGMMLO352nTacDfEQ0dlavQ/vxIOIa/S/Rl7NPAQmB20oor2aYCbgFmmdlYgPD/RqLjKC8zexfRMFtH0nbnLJ85bzGzYUQdrA1FFpkCfCZ2nr4DOD9zXJQr94SpGXd3M7scuM3Mrie6wuNPRGO6cf8OfN3MPlKkrv8oc/WfJRonbc75ZJY79HMT0ZBJufIt949m9ndEQSTzrXqmh3MN8M/hDcCILrf6rzBvItEXqW8SvX7PAb81s0L7K+5yoMXd98TyFhIF6S8CXzGzfya6nHUnUaAu5DvEPv24+yIzGwn8t5k58Abw1+6+0cz+Iqz7vaHsSjNbSvRJ5xtF1pElLLeK6CR4LJb/DEV6YwVMIfoOJe6XRL3DS4DvmtltRMOFbwDfipX7hJl9OJb+nLv/d4J1ZoYi+hL16H5CFABznQncYWb7iTpjd7n7kwnqBzrtpyuIhgDifhXynyAKxCuJjsMtwBfcfVnSdcUU2p9TiIY9fsWhT2NfB/5oZj929xeTVF7GNuW2IV9dT4UYc38IvvuAr4Qvo+MyrxdE5+GV4YKQUo42s/Wx9HeJOmS3h/MUogsXNuVbOATzC4l9t+buO83sN0QdxnKHKPXLWBGRtOtJQzciItINFOhFRFJOgV5EJOUU6EVEUk6BXkQk5RToRURSToFeRCTlFOhFRFLu/wN+J9QT9k5G/wAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -313,9 +313,9 @@ "source": [ "# 只对属性进行归一化\n", "housing_features = feature_norm(housing_data[:, :13])\n", - "# print(feature_trian.shape)\n", + "# print(housing_features.shape)\n", "housing_data = np.c_[housing_features, housing_data[:, -1]].astype(np.float32)\n", - "# print(training_data[0])" + "# print(housing_data[0])" ] }, { @@ -337,7 +337,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -541,7 +541,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEjCAYAAAAYFIcqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xe8HFXdx/HPj5JIUQgQQkjA0ASDoiaR8gKxoAjxoSOClATB+CAgRYSg0lFp0h5FiqEqCIYiCBKQDkIgtAApJJSYGxISSO+E/J4/zll2796td8vMvff7fr3mNTNnZs6cnbt3fjtzzswxd0dERKS9Vkm6ACIi0rEpkIiISE0USEREpCYKJCIiUhMFEhERqYkCiYiI1ESBRDo9M7vRzNzMzq5zvu/GfL9Rz3xFOprVki6AdF5mNhToB9zj7q8kWxrpCPSd6ZgUSKSRhgJfB94FkjwpTAcmAh/UOd+3gKXA4jrn25UNJR3fGamCAol0eu5+OnB6A/Ldrd55inREqiMREZGaKJBI3ZnZUDNzwi0KgBtipXRmeDd/XTN7PM4famZPmNmHMX3fmL6qme1pZteY2Ytm9r6ZLTez98zsbjP7VonyFKxsN7N+mTLF+S+Y2d/MbIaZLTWzCWZ2hpl1K5Jvwcr2Ap9pLzN7zMzmmtlCM3vOzA4pcwz7mtkIM5sWy/K2mV1mZj3y86+Wma1uZsPM7BEzm2Vmy8xsipk9FNPXKrBNdzM72cxGm9k8M1tiZhPN7FIz26jEvr5kZjfHY7XMzBbEz/KgmZ1oZmvmHjMq+M5ICrm7Bg11HYAfADOA5YAD8+J8ZnghZ92hcZ3HgSvj9MfA7DjeN673hbjMc/JcmJd2epHy3BiXn52X3i9n290JdR0OzI37ziy7p0i+78bl38hLz/1MZ+R8prl55T2xSL7bAR/mrLcgp2yTgZMz+bfjb9MHeDkn74/jvpblpOV/np7ASznLlwLzc+ZnAzsW2NfgnO9AZrt5ecdgm2q/MxrSNyReAA2dd4gnUgeGllgnc9JdAKwEzgTWjcs+A2wYpz8HjIgn/M/kbL8h8GtgRdx+hwL7qCSQzAFuB/rFZWsBw2OeDgwukG+5QDI3luvXOZ+pF/D3uHwJsF7ett0JDQMceBPYOaavEk/M02NZqw4kMe9MQJgFHAGsFZetCgwALss/hsC/cgLG94FVY/ogYGxcNgPYIG+7t+Oy+4DP5aR/BvgacG3meFfzndGQviHxAmjovEOVgcSB39awr8wv/xsKLKskkDwEWIFt74vLry+wrFwgceBXBbZbA5gZlx+Rt+zInCCzeYFtd8gJbo9XeYx+SvbKYLsKt/lazmf5boHlvWKAceDcnPQNc7brVc/vjIb0DaojkbT4GLi0hu3vi+Od27n9BR7PZHnuieMvtCPPpcDl+YnuvgQYVSTf/eN4pLu/XWDb0YSTbXscEcc3uPvYCrc5MI7HuPuo/IXu/j5wdZw9KGfRQkLAA+hdbUGlY1EgkbSY7O4ln/MwszXM7CQze9zMZprZRzmV5S/H1TZu5/5fKJI+LY57tCPPce6+qMp8vxLHT5fI96lqC2JmqwMD4+wDVWw6II4fK7HOo3H8uUxFvbsvBp6I6aPM7Ndm9mUzW7WKfUsHoUAiaTGr1EIz6014QO1SQsuenoQK4lnA+2QfNmzT4qgS7r6gyKKlcbx6O7ItlmepfDeI4+kltn2vHWVZj+xzY/+tYruecTytxDotcWxkyw9wNDCecJvrPEKwn2tm95vZYWam59g6CQUSSYuPyyy/nFDh/jZwAKGSem1339DdNwJ2bHQBu7hPVbtBvDW3HbAfoWJ9PLA2odHALcBoM1u7noWUZCiQSOrF5zj2ibOHuvtd7j4nb7VeTS5Wo2SurErVK7SnzmE2oQUZwGer2C5zpbhpiXX6xrGT9xoad1/h7ve4+0/cvT+h7L8gXJENAM6qoiySUgok0kiZylarMZ8NCE1XIVsXku/bNe4jLTKfb5cS63yt2kzd/SPgxTg7uIpNX4rjr5tZsb9j5mHQN0vUCWXKMcPdLyHbCOHreavU6zsjTaRAIo00P47XrTGfBYRfuwBfzF8Y60+Or3EfaXF3HB9gZv3yF5rZV4FvtjPvm+N4qJltV+E2I+N4W7JXhbnl6QX8b5y9Iyd99RKBB0LzZsj+QMio13dGmkiBRBrpjTje38zWaW8msSL8uTh7vZl9GcDMVjGz3QitgzrLL9hbCU+vrwE8aGY7AViwB6E58rx25j2C0GChO/CImR2e84qSVc1skJldZ2Y7ZDZw96eAB+Ps9WZ2YKbllZkNJDx/04PQ4OGKnH1tC7weX4PyuUxQiQHmAMLT+ZBtBp1Rl++MNJcCiTTSLYRXXuwCfBDfG/WumZVq2lrMSYRfsV8EXjazhYRnFf4NrA8cVacyJ8rdlxKeHp8LbA38x8wWAIsIT5gvJLSAgtBqrZq8lwF7A68TbhfeDMw3sw8Ir2B5gdDSao28TY8gBKAehKfyF5rZfGAMoTJ9DrCfu3+Yt11/wpPyE4ElZvYhoW5kJLBO3P78vG3q+Z2RJlEgkYZx9wnAdwi/aOcBGxEqevuW2q5IXqOBnQi/yOcQms3OBK4Bvgy8Wp9SJ89Dh05fAm4gvHpk9Ti+FNiebD3C3HbkPZXwapOfEZ5VWUBoSTWdcHVwNPB83jazCMf+FMLJ/yOgGzCJUNexrbs/m7er8YSHGa8mNvslvBplXtzv8YTXv8zP3aie3xlpHiv8MK+IpJWZ3QIcBpzj7mcnXBwRXZGIdCRmtjnhORqAh5Msi0iGAolIypjZPmb2WzPbNr7aJNMfyD6E15GsATzn7s8kWlCRSLe2RFLGzI4GrouzK8nWL2ReKTIF2M3d30qgeCJtKJCIpEx8fuRowoN+nyW0sFpKaBZ8L3CFu1dd0S7SKF0ikGywwQber1+/pIshItKhvPjiix+4e89y63WJt2/269ePMWPGJF0MEZEOxcymVLKeKttFRKQmCiQiIlITBRIREamJAomIiNREgURERGqiQCIiIjVRIBERkZookJRz++0wVw8Ri4gUo0BSyptvwsEHw2GHJV0SEZHUUiApZUnsVnrq1GTLISKSYgokIiJSk6YFEjO73sxmmtnrOWnrmdnDZjYpjnvEdDOzK81sspmNNbMBOdsMietPMrMhzSq/iIgU1swrkhuBPfLShgOPuPtWwCNxHmBPYKs4DAP+BCHwAGcBOxD6rj4rE3xERCQZTQsk7v4kMDsveR/gpjh9E7BvTvrNHjwHrGtmvYHvAg+7+2x3n0PoajQ/OImISBMlXUfSy92nx+kZQK843QfIreFuiWnF0tsws2FmNsbMxsyaNau+pRYRkU8kHUg+4aGHrbr1suXu17r7IHcf1LNn2X5ZimVSr+KIiHRaSQeS9+MtK+J4ZkyfBmySs17fmFYsvbHMGr4LEZGOKulAci+QaXk1BPhHTvoRsfXWjsC8eAtsFLC7mfWIley7x7TkLV8O11wDK1cmXRIRkaZqWle7ZnYb8A1gAzNrIbS+ugC4w8yOAqYAB8XVHwAGA5OBxcCRAO4+28zOA16I653r7vkV+PVXyS2uiy6CM86A1VeHH/2o4UUSEUmLpgUSdz+kyKLdCqzrwLFF8rkeuL6ORSuumltaH34YxvPmNaYsIiIplfStLRER6eAUSEREpCYKJCIiUhMFklL0HImISFkKJJXQcyQiIkUpkIiISE0USEREpCYKJJVYvlz1JSIiRSiQVGL8ePj5z5MuhYhIKimQVOqaaypbT1cuItLFKJDUi1p2iUgXpUAiIiI1USAREZGaKJCIiEhNFEgqpUp0EZGCFEhERKQmCiSVUqssEZGCFEhERKQmCiSlqF5ERKQsBZJ6UdARkS5KgaTeVJciIl2MAkkp7QkKujIRkS5GgaRedCUiIl2UAomIiNREgURERGqiQFLK/PnZ6cWLVf8hIlKAAkkpEya0nh83LplyiIikmAJJNT7+OOkSiIikjgKJiIjUJBWBxMxOMrM3zOx1M7vNzD5lZpuZ2Wgzm2xmt5tZt7hu9zg/OS7v17SCqo5ERKSNxAOJmfUBfgYMcvcvAKsCBwMXApe5+5bAHOCouMlRwJyYfllcrzkUSERE2kg8kESrAWuY2WrAmsB04FvAyLj8JmDfOL1PnCcu381MTwOKiCQl8UDi7tOAS4D/EgLIPOBFYK67r4irtQB94nQfYGrcdkVcf/38fM1smJmNMbMxs2bNal/h8uPT7beX30ZXLSLSxSQeSMysB+EqYzNgY2AtYI9a83X3a919kLsP6tmzZ3szaT1/wQXF19VFkYh0UYkHEuDbwDvuPsvdPwLuAnYG1o23ugD6AtPi9DRgE4C4fB3gw+YWWUREMtIQSP4L7Ghma8a6jt2AccBjwIFxnSHAP+L0vXGeuPxR9wbdT9JVhohIWYkHEncfTag0fwl4jVCma4HTgJPNbDKhDmRE3GQEsH5MPxkY3vRCi4jIJ1Yrv0rjuftZwFl5yW8D2xdYdynw/WaUS0REykv8ikRERDo2BZJSli5NugQiIqmnQFLK4sWVr6vnR0Ski1IgKaU9rbbU0ktEuhgFklIUFEREylIgKUWBRESkLAWSUtoTSFRXIiJdjAJJvejqRUS6KAUSERGpiQJJKbrKEBEpS4GklEL1HTff3PxyiIikmAJJtU47LekSiIikigJJKbq1JSJSlgJJKWrKKyJSlgJJKboiEREpS4GkWrpKERFpRYGkFAUNEZGyFEiqVe52l4KPiHQxCiSlVBMUVJ8iIl2UAkkphQKJrjhERFpRIBERkZookJSiqw8RkbIUSEpRIBERKUuBREREaqJAUi+6ehGRLkqBpJS+favfRs2ARaSLUSApZbXVki6BiEjqKZCIiEhNFEhERKQmCiSlFKpAf//96rcREenEUhFIzGxdMxtpZhPMbLyZ7WRm65nZw2Y2KY57xHXNzK40s8lmNtbMBiRdfkCV7CLSZaUikABXAA+6+zbAl4DxwHDgEXffCngkzgPsCWwVh2HAn5pe2pUrm75LEZG0SjyQmNk6wK7ACAB3X+7uc4F9gJviajcB+8bpfYCbPXgOWNfMejekcMVuUy1Y0JDdiYh0RIkHEmAzYBZwg5m9bGZ/NrO1gF7uPj2uMwPoFaf7AFNztm+Jaa2Y2TAzG2NmY2bNmlXfEqseRETkE2kIJKsBA4A/uftXgEVkb2MB4O4OVHX2dvdr3X2Quw/q2bNn3QoLwJNP1jc/EZEOLA2BpAVocffRcX4kIbC8n7llFccz4/JpwCY52/eNac2zcGFTdycikmaJBxJ3nwFMNbOtY9JuwDjgXmBITBsC/CNO3wscEVtv7QjMy7kF1hy6tSUi8omK3wFiZtcDJ7j7grz0tYD/c/cf1VCO44G/mlk34G3gSEKQu8PMjgKmAAfFdR8ABgOTgcVx3cYoFjB0RSIi8olqXiY1hFB3kd9kaQ3gCKDdgcTdXwEGFVi0W4F1HTi2vfuqi//9X9h7b+jdmMZiIiIdSdlAYmbrARaHHma2ImfxqsD3gDKPe3dCLS0KJCIiVHZF8gGhxZQT6i7yOXBWPQuVGu2pC1H9iYh0MZUEkm8SrkYeBQ4AZucsWw5Mcff3GlC2jkWvSBGRLqpsIHH3JwDMbDPgv7GOQprlnXfgzDNhxAjo1i3p0oiItFFN899+wPaZGTMbamZPm9k1ZrZ23UuWds26Ahk2DP7yF3jiiebsT0SkStUEksuBjQDiMx/XAGOBnYCL6180ERHpCKoJJFsCr8XpA4CH3f2nwI+BvepdsFQodRdv8ODK1xUR6cSqCSQrCc19ITzf8WCcngGsX89CdQjFXgSpSncR6WKqCSQvAGeY2eHA14B/xfR+QHNfUSIiIqlRTSA5Efgy8AfgN+7+Vkz/PvBsvQuWCmm6XZWmsoiI5Kj4FSnu/jqwXYFFpwAf161E0ppulYlIylXzri0AzGxzoD/hifbx7v523UslIiIdRjVv//0MoTvcAwgV7zHZ7gSOyn8rcKewW5t3RoqISJ5q6kiuINza+ibhjb9rEFpvbUd4xqTz2Xjj6rdRXYaIdDHVBJK9gaPd/Ql3/ygOjwPDgH0bUrqOJA11GYsWwYMPll9PRKSOqgkkawAfFkifDXyqPsWRoiq50jn6aNhzT5g0qfHlERGJqgkkzwDnmdmamYTYO+I5wH/qXTCJqrnSmTAhjNWDo4g0UTWttk4mPM0+zczGxrQvAkuA3etdMIlU5yIiKVfxFYm7vwZsBZwKjInDqcCW7v5GY4qXciec0Lx9paEORkSkgGqa//4GmOruV+el/6+Z9XH3M+peurS78kq44oqkSyEikqhq6kgOB14ukP4ScER9ipNCP/5x0iWonm6HiUgTVRNINgQKvfL2A6BXfYqTQt//ftIlCCoJDrr9JSIJqCaQ/Jfw1t98uwIt9SmOtKHgICIpV02rrWuAy8ysG/BoTNsN+B1wYb0LJiIiHUM1b//9vZltAFwJdIvJy4Er3P2iRhRORETSr6q3/7r76WZ2PuHtvxDe/tu5n36rtuJaFd0i0sVU/Rp5d19E6C1RcqkuQ0S6qGoq27umSgNEo69EdKUjIimlQFJv9b4y0ZWOiKRcagKJma1qZi+b2T/j/GZmNtrMJpvZ7bG1GGbWPc5Pjsv7NbRgffo0NPtUeeklGDEi6VKISAeTmkACnACMz5m/ELjM3bcE5gBHxfSjgDkx/TIa3fS4f3/YaKPiy2+7DcaMaWgRqtbe22ADB4ZX0YuIVCEVgcTM+gLfA/4c5w34FjAyrnIT2c6z9onzxOW7xfUb5/OfL77shz+Er361cfuuJijoNpiIJCAVgYTQVe+pZPuCXx+Y6+4r4nwLkLnH1AeYChCXz4vrt2Jmw8xsjJmNmTWr0JtdOhgFCRFJqcQDiZn9DzDT3V+sZ77ufq27D3L3QT179qxn1slQqy0RSamqnyNpgJ2Bvc1sMKHL3s8AVwDrmtlq8aqjLzAtrj8N2ARoMbPVgHUo3AVw/VRyNXDJJcntW0QkQYlfkbj76e7e1937AQcDj7r7ocBjwIFxtSHAP+L0vXGeuPxRd/1cb0WHQ0SaKPFAUsJpwMlmNplQB5JplzoCWD+mnwwMb3hJqrkq0ElcRJplyZIwJCwNt7Y+4e6PA4/H6beB7QussxRobichHe32Ukcrr4i0z5prQvfusHRposVI8xWJiIiUs2xZ0iVQIEmdl1+Gu+9um65bZiKSUqm6tZVazbxVNGBAGGcCR3v2raAjIk2kK5LORHUjIpIABZJ6W7Gi9PKVK+G555pTFhGRJlAgqbdf/ar1/Isvwrhx2fkrroCddoJ//7u55RIRaRAFkkpUe8voP//JTg8aBNtum51//fUwnjKl9nI124oVsOOO8PDDSZdERFJEgaQSpd7+W8jOO8OcOY0pS5Lefx9Gj4ahQ5MuiYikiAJJJbp1q36bFLTtFhFpBgWSSrSnNdQrr5Reria6ItJJKJA0yp57Jl2CxlEQFJEcCiSN1NKSdAnqS8+piEgBCiSNtMkmSZdARKThFEg6impuJ+nWk4g0kQJJs1V7e6ia9XXrSUQSoEAiIiI1USBJq9/9LukSiKTT4sXwxS/Cs88mXRKJFEgqceKJ8LWv1ZbHgQeWXyfXuefWtj+Rzurll8Orhk45JemSSKRAUoneveHJJ2vL484761OWSnTUyvaLLoInnki6FI2zdClcfXV4A7RIJ6JA0kxnnpk9yU+YAOuvD1OnVrZtmoJDo8py2mnwjW80Ju80OOccOOYYuOOOpEsiUlcKJM103nnhtfIQfpnOng0jR5bepj0tsRrVekutwmrzwQdhvGBB/fPeaScYPLj++YpUQF3tNlt+F7rlft2n6UpE0kudpUmCdEXSbO39VZ+GqwEFtfrQcaxNRz5+22wDRx6ZdCnqToEkKZVekbRHR/5H68zS8GNAkjVxItx4Y9KlqDsFkmZr5Mmk0rzdYfjwUOHfiPxFGknfw9RRIGm2/H+CSq8e6nmVMW0aXHgh7LFH/fKUyumKUToZBZJqvPpq7XlkAkmlLXca8esrcyL7+OPK1r/88lCONDz/8ItfwPnnw6hRoUwzZiRdonTJHJdp05IuibTXiy/CM88kXYqqKJBUY7vtas8jTZfllf4y/sUvwjgTeJL8RX3JJXDGGXDllWE+05y6Xlpasnk3SiO/A1dfHcbPP9+4fSSts1/RDRoEu+ySdCmqokDSbM0IJOX+0Rr5BuKObu+94YQT4L//TbokUk5X+l6mXOKBxMw2MbPHzGycmb1hZifE9PXM7GEzmxTHPWK6mdmVZjbZzMaa2YCmFnjpUjjssPZvP2ZM6/kkf11Vu+80/hKsd5lmzw7jSm/7tUcaj6NIDRIPJMAK4Ofu3h/YETjWzPoDw4FH3H0r4JE4D7AnsFUchgF/amppu3eHgw5q6i7bWLq09D1ws3Cy+uij+uwv88svU0eS1C/BBx9s3r4a8Rn1C7q+FJBTI/FA4u7T3f2lOL0AGA/0AfYBboqr3QTsG6f3AW724DlgXTPr3dRC9+hRv7xy/xnmzatsvX33hb594YgjwlDIL34B3bqVDiaVntja29Ks3s44o/H7aMZnGz0alixpTN5d4eSqgJw6iQeSXGbWD/gKMBro5e7T46IZQK843QfIfdNhS0xrnkZVhK27btu0Qv80o0aF8S23hKGQP8ULteXLi++v0pNOGv9xcx/ovPVWWLasMfk3wg03wLBhjctfpMlSE0jMbG3gTuBEd5+fu8zdHajqp5aZDTOzMWY2ZtasWXUsaQrlB5NiAWLECNhnn9pPksuWwfz55ddrhn/9Cw49FH7966RLUp2XXgp/t3qXO41Bv966wlVXB5OKQGJmqxOCyF/d/a6Y/H7mllUcz4zp04BNcjbvG9Nacfdr3X2Quw/q2bNn4wqfBpnbW+VOIkcfDffem51vb2X73LmwzjrVbdsoc+aE8XvvJVuOarmHv9tvfpN0STqujhY0L7446RI0TOKBxMwMGAGMd/dLcxbdCwyJ00OAf+SkHxFbb+0IzMu5BdbxuIf37xT7p6j0ZD9zZrZvk7POKr1uZ2j+m1/xXslxeuaZ8v/MHf3XbqPK/8wz8M1v1q8BR1d00UVJl6Bh0vAa+Z2Bw4HXzOyVmPZL4ALgDjM7CpgCZJpKPQAMBiYDi4GO/SrN4cMre2bBDP72N3j33cLLe/XKTo8aBWuuWT7P6dNDC7BPfar8viFdJ9n2NM/N1G1lHrAsJP81//WUm2ejg3O98x86FCZPDt+/rbaqb95dRZr+f+os8UDi7k8Dxb71uxVY34FjG1qoZrvqqvLrXHopPPpo/fd94onZp6GLaUQgOf74cGL/wQ/ql2c91fNEvGxZaDaeq9knlUWLQg+d551X2Y+MfGk8CaaxTF1U4re2pIilS8NzG5kTWi1BZN684n3OT5xYOP2ee+ArX2n9fq16/uP+4Q9w8MHFl596aihDR3fTTeGKb/Lk5u43/291ySXhx8gVV1SXz9tvw3rrhTGk4zZnvcvgDj/6ETz7bH3z7UIUSNLs1lvrk8/++8PXv17dNocfDq+8En7JZjTzJHLxxbDffpWvn3/ifPNNuP/+yrf/6KPwbEe9f+VmulIeN66++VYr0wy82luCN94YGjTkHpfPfz7ZPjXq/TdauDA0yd599/rm24UokKRZpkVSrV55pfV8JQEh95+1mltbt98Od95ZedkyphdpL9Heyt2tt4b/+Z/K199hh9a3fOodNJv9S77YQ6TVlqPQ33zChHT08peGqyMBFEjSbfFiePjh+udbzYnerPJAss024XbVgQdWV54FC2DjjbPzua9/KVd/Uy8vv1z9NsuXh79RKcWO2fjxle1j+PD6njDrEUikfTrxsVQgSbPhw0s/mV5K5ku7bFn2RYQZxx+fnX78cbjuurZ1MLm3tDJ9p5T7RyhW35Iv/5mP/Icb+/bNTmdO1I880vaFl9CY++WV+vKXYa21Qn1Ooe3uuy97e22VMv9qEybAXXe1Tb/wwsrLU0q9rkg68cmwQ5s6tfw6DaRA0tlV0irqpJNgtzYN5ILce/t//nPxPKq5BdUn7402pV5vkjnxZeoaisk9wf3nP9npE06ovFzVylxVXHxx4WbZp56anc69sivk85+HAw6oX9nyT/jtfeFmGjozg9BIoNKO5WbMCJ8/00CgKyj2WECTKJB0dv/+d/l1Sv3KXLo0O33JJcXX69at9fwqq1T2tPmxx8IWWxRfXultNXeYNClcSe28cza92k6qMvup9pf35puX/mcudQK//PLq9tUe+Vckc+YUvgKqNJ9aXHtt9W9yPvHEcAVYzr/+Bb17h26kt9givIqmXi67LFwZV2L27PBDYsWK+u2/lISvFBVIOqtqvsD59/kr7QY4o9A/l3vr+p2WFjjttOwLJzMqeYZm7Fi45prS69xxB3zuc/U7cbTnH7NU3VOpQHLSSdXvq5xi+8uk/+AH4Qqo3MOw5W5tLVpU/FitXFm4ldhPfgJ77ll6v+2V6RnyoYfC+K23Kt+20Od4+mn43e/C9Mknw7e/XVleJ54YrlRzm7A362R///3l6+7qTIGks6rlVRa5zY5LNRs++2z44Q9DPUs5hx8eXhGxxx7VlcWs9Db59T+F7hVX09thJf/s//d/hfuKd4fXXoMf/7jtLaFyt7ZytbTU/1Ukmc917rnhFlHmtk/ubcWpU1tfgeZuV2h+1ixYe+3siTZf//5t35pQTZ3fY4+F41mN/GN80EFt/xbu4TVCkyaVz+9rX4Nf/rK6MkD2uDayg7RCxo4NrRWPbe4z2wok0lZ+c+FizjkHbrsNzj+/9Hp/+ENlwaaQceOKNw2Gtlc4b7zRdp3PfrZt2n77lT6xFwooEyfC9dfDz35WuHOzt96C7bYLdUlTpoQK9IxMZ2PlzJsHm2zSukEEhIYXmVuFzz0XTuKlHHJI+DU9PPYHlzmZLlrU+haRGbzzTjhpb7pp2xZ3uY0uoPVnyJTnb3/L7iO3n5WJE9teGX/rW9np/fcP+8z14YfhAcjnnw/rbrdd2882c2bbtFLyf2xMmxYCarU/aoo59dRwHAvVJ5XqHE5AAAAPRUlEQVT6mw8cGPrYufzywg1JqpHZT6bhyqRJ4apsxx2bc3vN3Tv9MHDgQK+78KcLQ58+rec1hOHGG9seq2qHvfaqT1lyy/Hzn2enX3219bKNNgrjd95xnzfP/TvfcZ8wwf2cc1rn94UvlN7fW2+1nn/oIfeddy5fzv32C+O+fd1fe631srXXdj/rrDDdu7f7woVtv4977134s590UuH9TZrUNm3lysLfc3B/443Wxy5zLNyzx3XJktbbbrml+1VXFf8u5Bo5svVxyP/b5ecxd6771Knuzz/v/vHH7uee2zb/mTNb72PKlOwxdnefPz/Mr7VWmJ80qe13N3861yqrhPQttnAfOjSkHXRQSLvttjDfvXvx72N+vsX2U0hm3ccfD/NPPx3md9rJfcMNw/SMGZXlVTB7xriXP8fqiqQeRo9OugTpdd11tW1/3331KUeu3/8+Oz1rVnirbb6HHgqvyn/4YfjpT9u+Ufn110vvY++9W88vW1bZsyp33x3GLS3wxS+2XrZwYbgKhHCVtvba5fPLuOyywumlOk4rxL3ttpm0ESPCOP/+/OTJ4RhWItNMOnMc8uW/xmTo0HDFuf32xY9Hbpnfew/++c/SZRgwIORbzAcfFM7/rbfaPvGfOUbt7XhtypTWV9mXXgqnn158/UKNU3KnGyTxlzZ2WGPHZi+785uzSlDqn7HZinVtO2dO69tumbqPn/wkm9aef8T8W2x77VV9HpW47z7YddfsfKHA8P771eVZqsvn3NfWHHNMGOcfn5aWwrdHK6kj+vvf26blPmd06aWtl+VWZi9ZUngfmTdjL1sWbvUUe+Zi0aJQJ5JpbJJbX5TbcKRnz8pP1O7te9NDZtt+/cJ0S0toHJH50ZpfL5UpQ+bzFzsWDaJA0l75vxYl3Yp1btbsytB623tv+O53s/OFWq1ttFHx7QudbI45BjbcsHBDi9wK6meeCeNx40Jjiowvfal0mQsZNap4ncX3vpedruXX9T//2TqIFPrsTz+dnT777Ox0/nu4li4NrRWLNTTIOOSQqov5idzntq68su2dj/wrI8h+pldfbd21RIMpkEjXkF9pnFFJN8yPPVbfstRb7q2oap9wLnQynTMnVHRvuWXl+fzlL9XtN78M++9ffHnuyb2cd94pviz/gU/30Ey3WAAr9VaBU06BP/6x8nLlK1YBnnv1mPvS0fxOsVaubPvjqFjTd1W2p7iy3b10xZkGDRoqH/bfP/kyVDN85zvFl33wQWgYUWr7v/61bZq7+9ZbZ+e/973i269YUTj9yCPbpm29dQ2nOFW2N96dd4bOgqB897YiUlx+E920K/XqmEGDQsOIUg49tG2aWev31VXTDULGDTe0Tav0HXg10K2tWuy/f/aSfN11ky2LSEfW3ueMkpL7jFC+hN97lQRdkdRLo175ICLpk9vVQRJWS9c1gAJJvWy9ddIlEBFJhAKJiIjURIFERERqokBST7q9JSJdkAJJPRV6vYOISCenQFJPn/500iUQEWk6BZJ6Wn/9tmnlHkwSEengFEjq6dOfDj3b5T71utZayZVHRKQJ0vVUS2eQsgeFREQaTVckIiJSEwWSRundO+kSiIg0RYcNJGa2h5lNNLPJZjY86fK0MX582/fxjBlTW0c3jbTmmnDVVWF69dUr365PH9hll8rW3XTT6sslIqnXIQOJma0K/BHYE+gPHGJm/ZMtVZ511oGNN26dNnAg3Hpr+W2XLi39NuGHHmo9/7vfwaOPhh7dinXr2dLS+ippyJDQGdH554c+thctCj3juYeuVseNC9PPPBP299RTxfN96qkw/tnPQtq667btsxxC/9PuoTFCpn9vaP0gZ27jhBUrYPlyGDYsm/bCC+HtqnffHZaPHx+6xT399NDBk3u2O9Y//zn8HSB01LRyJVxwQTYvd7j44uz8kUcW/owZTz4Z8txmm9BJUqaP8OOPL71dbjet+RYtKry8e/cwXnXV0nlnFGoxWEiPHpWtl2/gwPZtV0y1PYxeckl999+VNKM310o6LUnbAOwEjMqZPx04vdj6DevYqlJ33eV+/PHZeXD//vfdJ01yv/POMP/UU607uMkYM8Z95MiwPNett7o//3zbfa1c6X7TTe5Ll2bz+/vfs8vvucf9lVfa9zmmTnUfN879pJPcjzvO/cEHy28zd677r3/t/uqrpdc77rjsZz/55LBdxsiRYdlVV1VWzhUr3O++OxyLmTPdJ0zILvv4Y/dtt3UfPDibtnhx6/1Nnx6GuXOzx/Dtt0vv89ln3efPz86vXOn+wAPuv/pVmH/mGffzzgvT8+eHPNdfP7v+woXuy5eH8uVbuND9t791/+53w3Z/+5v7W2+533JLmB85Muxv0aLW2/32t+5Dh2Y/w/z5Yb311gvzS5e6f/hhdvl++7m/8477o4+G/PfaK6RfeWXI7/nnw/ydd7ovW+Z+9NHuU6aEz/nAA2FZ//7heF57bZi/7rqw7VNPuffu7f7kk9nyvfee+wUXuM+ZEz53S0vIzz2UbcKEUI533skeU3f3WbPc77jD/f773X/zG/ePPgqdQJ15pvuIEdk8Zs8On3mrrdxPOy37OVeuDNsvXBj2+9BDIe2++9x/+Uv3c84J6z3ySPgfBfeBA93/8pew7gEHZPPaeOMwPvTQMJ48OeR98cUhv48+CnlffbX7YYeFMuVatsz9lFPCtm+8kc33hhvC9+/uu0MnWbNnu599dlg2e3bIC8L3+Oij3Q88MOR37LHZz1gHVNixlYV1OxYzOxDYw92PjvOHAzu4+3E56wwDhgFsuummA6dMmZJIWQv6+GNYZZVsN6dz54Zf8fffH/rK/upX67OfJ54I40J9b3ck7uFqYNddC3cN20jTp4eWeMX6fG+vqVPDFU17rxCqsXhxuIrrX+Sifdmy0L3uhhuG72UpCxYUf/B20SLo1i3cGnWH++6DvfZq/t+smPvvD5+1VLe+lVqyJFwtzpgROpM688z2f84VK2DsWBgwIPTL/tnPwkYbtS+vlSvDIwiZK9oamdmL7j6o7HqdNZDkGjRokI8ZM6aZRRQR6fAqDSQdso4EmAZskjPfN6aJiEiTddRA8gKwlZltZmbdgIOBexMuk4hIl9QhH8N29xVmdhwwClgVuN7d30i4WCIiXVKHDCQA7v4A8EDS5RAR6eo66q0tERFJCQUSERGpiQKJiIjURIFERERq0iEfSKyWmc0Canm0fQPggzoVpzPS8SlNx6c8HaPSkjo+n3X3sq916BKBpFZmNqaSpzu7Kh2f0nR8ytMxKi3tx0e3tkREpCYKJCIiUhMFkspcm3QBUk7HpzQdn/J0jEpL9fFRHYmIiNREVyQiIlITBRIREamJAkkJZraHmU00s8lmNjzp8jSamb1rZq+Z2StmNiamrWdmD5vZpDjuEdPNzK6Mx2asmQ3IyWdIXH+SmQ3JSR8Y858ct01J13nFmdn1ZjbTzF7PSWv4MSm2j7QpcnzONrNp8Xv0ipkNzll2evysE83suznpBf/XYlcRo2P67bHbCMyse5yfHJf3a84nro6ZbWJmj5nZODN7w8xOiOmd6ztUSX+8XXEgvJ7+LWBzoBvwKtA/6XI1+DO/C2yQl3YRMDxODwcujNODgX8BBuwIjI7p6wFvx3GPON0jLns+rmtx2z2T/swVHJNdgQHA6808JsX2kbahyPE5GzilwLr94/9Rd2Cz+P+1aqn/NeAO4OA4fTVwTJz+KXB1nD4YuD3pY1Hk+PQGBsTpTwNvxuPQqb5DiR/otA7ATsConPnTgdOTLleDP/O7tA0kE4Hecbo3MDFOXwMckr8ecAhwTU76NTGtNzAhJ73VemkegH55J8qGH5Ni+0jjUOD4nE3hQNLqf4jQn9BOxf7X4onxA2C1mP7Jeplt4/RqcT1L+lhUcKz+AXyns32HdGuruD7A1Jz5lpjWmTnwkJm9aGbDYlovd58ep2cAveJ0seNTKr2lQHpH1IxjUmwfHcVx8dbM9Tm3VKo9PusDc919RV56q7zi8nlx/dSKt9++Aoymk32HFEgk1y7uPgDYEzjWzHbNXejhp43ai+doxjHpgMf9T8AWwJeB6cDvky1O8sxsbeBO4ER3n5+7rDN8hxRIipsGbJIz3zemdVruPi2OZwJ3A9sD75tZb4A4nhlXL3Z8SqX3LZDeETXjmBTbR+q5+/vu/rG7rwSuI3yPoPrj8yGwrpmtlpfeKq+4fJ24fuqY2eqEIPJXd78rJneq75ACSXEvAFvFViPdCBV69yZcpoYxs7XM7NOZaWB34HXCZ860EBlCuMdLTD8itjLZEZgXL6NHAbubWY94S2N3wn3t6cB8M9sxtio5IievjqYZx6TYPlIvc/KK9iN8jyB8poNji6vNgK0IFcUF/9fir+jHgAPj9vnHOnN8DgQejeunSvy7jgDGu/ulOYs613co6cqnNA+EFhRvElqU/Crp8jT4s25OaC3zKvBG5vMS7js/AkwC/g2sF9MN+GM8Nq8Bg3Ly+hEwOQ5H5qQPIpxU3gL+QMeoHL2NcHvmI8L956OacUyK7SNtQ5Hjc0v8/GMJJ7PeOev/Kn7WieS02iv2vxa/l8/H4/Z3oHtM/1ScnxyXb570sShyfHYh3FIaC7wSh8Gd7TukV6SIiEhNdGtLRERqokAiIiI1USAREZGaKJCIiEhNFEhERKQmCiQiDWBmN5rZP5Muh0gzqPmvSAOY2TqE/6+5ZvY44aWGxyVcLJGGWK38KiJSLXefV+88zaybuy+vd74itdIViUgDmNmNwAaE15sPyVu8mbu/a2b9gYsJfXosITyFfJK7z8jL4yngeKCbu2/YlA8gUgXVkYg01gnAs8ANhD4hegNT4/uoniS82mJ74NvA2sA/zCz3//LrwHbAHsBuTSy3SMV0a0ukgdx9npktBxZnrjQAzOwY4FV3Py0n7QhgNuHdSc/H5KXAj9x9WROLLVIVBRKRZAwEdjWzhQWWbUE2kLyuICJpp0AikoxVgPuBUwosez9nelFziiPSfgokIo23HFg1L+0l4CBgirt/1PwiidSPKttFGu9dYHsz62dmG8TK9D8SevW73cx2MLPNzezbZnZtpoMxkY5CgUSk8S4hXJWMA2YBm7r7e8DOwErgQUJnYn8ElsVBpMPQcyQiIlITXZGIiEhNFEhERKQmCiQiIlITBRIREamJAomIiNREgURERGqiQCIiIjVRIBERkZr8PxVub6AJ+YU2AAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -654,7 +654,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] diff --git a/docs/templates/common_docs.py b/docs/templates/common_docs.py index 93d0c09deae..594f05961da 100644 --- a/docs/templates/common_docs.py +++ b/docs/templates/common_docs.py @@ -23,12 +23,12 @@ stride (tuple|int): The stride size. It can be a single integer or a tuple containing two integers, representing the strides of the convolution along the height and width. If it is a single integer, the height and width are equal to the integer. Default is 1. groups (int, optional): The group number of convolution layer. When group=n, the input and convolution kernels are divided into n groups equally, the first group of convolution kernels and the first group of inputs are subjected to convolution calculation, the second group of convolution kernels and the second group of inputs are subjected to convolution calculation, ……, the nth group of convolution kernels and the nth group of inputs perform convolution calculations. Default is 1. regularization (WeightDecayRegularizer, optional): The strategy of regularization. There are two method: :ref:`api_fluid_regularizer_L1Decay` 、 :ref:`api_fluid_regularizer_L2Decay` . If a parameter has set regularizer using :ref:`api_fluid_ParamAttr` already, the regularization setting here in optimizer will be ignored for this parameter. Otherwise, the regularization setting here in optimizer will take effect. Default None, meaning there is no regularization. - grad_clip (GradientClipBase, optional): Gradient cliping strategy, it's an instance of some derived class of ``GradientClipBase`` . There are three cliping strategies ( :ref:`api_fluid_clip_GradientClipByGlobalNorm` , :ref:`api_fluid_clip_GradientClipByNorm` , :ref:`api_fluid_clip_GradientClipByValue` ). Default None, meaning there is no gradient clipping. + grad_clip (GradientClipBase, optional): Gradient clipping strategy, it's an instance of some derived class of ``GradientClipBase`` . There are three clipping strategies ( :ref:`api_fluid_clip_GradientClipByGlobalNorm` , :ref:`api_fluid_clip_GradientClipByNorm` , :ref:`api_fluid_clip_GradientClipByValue` ). Default None, meaning there is no gradient clipping. dilation (tuple|int): The dilation size. It can be a single integer or a tuple containing two integers, representing the height and width of dilation of the convolution kernel elements. If it is a single integer,the height and width of dilation are equal to the integer. Default is 1. stop_gradient (bool, optional): A boolean that mentions whether gradient should flow. Default is True, means stop calculate gradients. force_cpu (bool, optional): Whether force to store the output tensor in CPU memory. If force_cpu is False, the output tensor will be stored in running device memory, otherwise it will be stored to the CPU memory. Default is False. data_format (str, optional): Specify the input data format, the output data format will be consistent with the input, which can be ``NCHW`` or ``NHWC`` . N is batch size, C is channels, H is height, and W is width. Default is ``NCHW`` . - grad_clip (GradientClipBase, optional): Gradient cliping strategy, it's an instance of some derived class of ``GradientClipBase`` . There are three cliping strategies ( :ref:`api_fluid_clip_GradientClipByGlobalNorm` , :ref:`api_fluid_clip_GradientClipByNorm` , :ref:`api_fluid_clip_GradientClipByValue` ). Default is None, meaning there is no gradient clipping. + grad_clip (GradientClipBase, optional): Gradient clipping strategy, it's an instance of some derived class of ``GradientClipBase`` . There are three clipping strategies ( :ref:`api_fluid_clip_GradientClipByGlobalNorm` , :ref:`api_fluid_clip_GradientClipByNorm` , :ref:`api_fluid_clip_GradientClipByValue` ). Default is None, meaning there is no gradient clipping. num_filters (int): The number of filter. It is as same as the output channals numbers. dim (int, optional): A dimension along which to operate. Default is 0. is_sparse (bool, optional): Whether use sparse updating. For more information, please refer to :ref:`api_guide_sparse_update_en` . If it's True, it will use sparse updating. diff --git a/lychee.toml b/lychee.toml new file mode 100644 index 00000000000..c597f3c24a7 --- /dev/null +++ b/lychee.toml @@ -0,0 +1,24 @@ +# For all options, see +# Accept 200 (OK) and 403 (Forbidden) responses as valid +accept = [ + "200", + "403", + "429" +] + +# Exclude links +exclude = [ + "zhuanlan.zhihu.com", + "demo.doctrp.top", + "127.0.0.1", + "localhost" +] + +# Don't check any links to private addresses +exclude_all_private = true + +# Avoid rate limits by limiting concurrency of checks +max_concurrency = 10 + +# Redirected links can eventually become broken links +max_redirects = 0