复现PointNet++时,遇到的问题总结(PointNet++中的python语法)

1、使用GPU和CPU的方法。

y.cpu()使用CPU进行计算。

y.cuda(),使用GPU进行计算。

2、one-hot encode(独热编码)

独热码是一组数,其中只有一个值为1,其余都是0。同样的,一组数中只有一个0,而其余都为1则称为独冷码

举例:

如四类物品,标签为1,2,3,4.

采用独热编码,一个标签对应一个编码:

1:[1,0,0,0]

2:[0,1,0,0]

3:[0,0,1,0]

4:[0,0,0,1]

为什么要用独热编码呢?

  1. 使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
  2. 将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
  3. 将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理

3、命令行参数解析器--argparse

argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过这个我们可以获取在命令行输入的内容。

使用方法:

  1. 导入argparse:import argparse
  2. 创建ArgumentParser()对象
  3. 调用add_argument()方法添加参数
  4. 使用parse_args()添加解析参数
import argparse

parse = argparseArgumentParser('Model')#Model是自己定义的名字
parse.add_argument('--model',type=str,default='mymodel',help='model name[default:mymodel]')

return parser.parse_args()

4、日志信息(转自:https://blog.csdn.net/pansaky/article/details/90710751)

#1、通过函数创建日志信息
import logging

#创建日志函数
def log_string(str):
    logger.info(str)
    print(str)

普通日志的创建步骤:

  1. 定义logger
  2. 定义handler
  3. 创建formatter
  4. 给handler添加formatter
  5. 给logger添加handler
import logger

#创建logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.info)

#创建一个handler,用于写入日志文件
file_handler = logging.FileHandler('test.log')
file_handler.setLevel(logging.info)

#在创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.info)

#定义handler的输出格式(formatter)
formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')

#给handler添加formatter
file_handler.setFormatter(formatter)
ch.setFormatter(formatter)

#给logger添加handler
logger.addHandler(file_handler)
logger.addHandler(ch)

之后可以正式开始写日志文件了。(logging模块参数的详细解释,请参考:https://blog.csdn.net/pansaky/article/details/90710751)

5、路径处理库pathlib(参考:https://blog.csdn.net/itanders/article/details/88754606)

Python3之后,自带的pathlib模块的Path对路径操作更加简单,可以取代os.path了。

from pathlib import Path
#获取当前目录
current_path = Path.cwd()
print(current_path)
#输出:/Users/liuzihao/Documents/项目文件/测试文件

#获取home目录
home_path = Path.home()
print('\n',home_path)
#/Users/liuzihao

#获取当前目录的父目录
print('\n',current_path.parent)
# /Users/liuzihao/Documents/项目文件

#如果父目录很长,可以用遍历的方法获取所有父目录
for p in current_path.parents:
    print(p)
#/Users/liuzihao/Documents/项目文件
#/Users/liuzihao/Documents
#/Users/liuzihao
#/Users
#/

文件名操作:

  1. name目录的最后一个部分
  2. suffix目录中最后一个部分的拓展名
  3. suffixes返回多个拓展名列表
  4. stem目录最后一个部分,没有后缀
  5. with_name(name)替换目录最后一个部分并返回一个新的路径
  6.  with_suffix(suffix)替换拓展名,返回新的路径,拓展名存在则不变
from pathlib import Path

#name目录的最后一个部分
example_path = Path('/Users/liuzihao/Documents/项目文件/from_json_to_txt.py')
print(example_path.name)
#from_json_to_txt.py

#suffix目录中最后一个部分的拓展名
example_path = Path('/Users/liuzihao/Documents/项目文件/from_json_to_txt.py')
print(example_path.suffix)
#.py

#stem目录最后一个部分,没有后缀
example_path = Path('/Users/liuzihao/Documents/项目文件/from_json_to_txt.py')
print(example_path.stem)
#from_json_to_txt

创建和删除文件夹

from pathlib import Path
example_path = Path('/Users/liuzihao/Documents/项目文件/测试文件/test1')
example_path.mkdir(exist_ok=True)

判断文件是否存在:

  1. is_dir() 是否是目录
  2. is_file() 是否是普通文件
  3. is_symlink() 是否是软链接
  4. is_socket() 是否是socket文件
  5. is_block_device() 是否是块设备
  6. is_char_device() 是否是字符设备
  7. is_absolute() 是否是绝对路径
  8. resolve() 返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析
  9. absolute() 也可以获取绝对路径,但是推荐resolve()
  10. exists() 该路径是否指向现有的目录或文件:
from pathlib import Path

example_path = Path('/Users/Anders/Documents/pic-2.jpg')

# 判断对象是否存在
print(example_path.exists())
# 输出如下:
# True

# 判断对象是否是目录
print(example_path.is_dir())
# 输出如下:
# False

# 判断对象是否是文件
print(example_path.is_file())
# 输出如下:
# True

 

6、strip()和split()的用法

#strip()的用法

str ='  airphone 123421   5   '
print(str)
#结果:'   airphone 123421  5   '
str2 = str.strip()#只删除开头和结尾处的空格
print(str2)
#结果:'airphone 123421  5'

split()的用法:

  • 按某一个字符进行分割,如'.'

>>> str = ('www.google.com') 
>>> print str
www.google.com 
>>> str_split = str.split('.') 
>>> print str_split 
['www', 'google', 'com']
  • 按某一个字符分割,且分割n次。如按‘.'分割1次
>>> str_split = str.split('.',1) 
>>> print str_split 
['www', 'google.com']
  • split()函数后面还可以加正则表达式,例如:

>>> str_split = str.split('.')[0] 
>>> print str_split 
www
  • split分隔后是一个列表,[0]表示取其第一个元素;

 
>>> str_split = str.split('.')[::-1] 
>>> print str_split 
['com', 'google', 'www'] 
>>> str_split = str.split('.')[::] 
>>> print str_split 
['www', 'google', 'com']
  • 按反序列排列,[::]按正序排列

>>> str = str + '.com.cn'
>>> str
'www.google.com.com.cn'
>>> str_split = str.split('.')[::-1] 
>>> print str_split 
['cn', 'com', 'com', 'google', 'www'] 
>>> str_split = str.split('.')[:-1] 
>>> print str_split 
['www', 'google', 'com', 'com']

 

你可能感兴趣的:(pytorch,1024程序员节)