with 关键字 上下文管理器 + Numpy

with一个比较经典的用法就是打开或者写入文件的时候。

with open ("xx", "r") as f:
    lines = f.readlines()

在有with关键字的这一行,首先你会执行一些命令,而且很有可能和as关键字一起创造一个新的变量。在这里就是文件的对象f。在这里就是文件的对象f。

with之所以叫做上下文管理器,就是因为在with关键字的作用域内,创建了一个对象或者变量,这个变量只有在with关键字的作用域内起作用的,也就是说,它创造了一个f是可用的上下文。出了这个上下文,这个变量就会被收回,就不起作用了。有点像函数的那种感觉,但是它不是一个函数,只是作用域的处理上有点像函数。

文件的操作上,一旦你打开了文件的读取,在不用文件的时候,一旦你打开了文件的读取,在不用的时候,大佬记得是需要调用file.close()之类的方法来把文件占用的内存关闭。倘若使用with关键字,在出了with关键字的作用域之后,文件的对象就被自动close和回收掉了,因此十分的方便。

with的另外一个场景是TensorFlow1.xx版本的时候。计算必须放在TensorFlow的Session里面,也会用到with,因为Session在结束的时候同样需要Session.close。

总结:如果你希望一个变量在一段时间后会自动回收掉,那么使用with是一个比较好的选择。你甚至可以定义自己的函数支持with关键字,需要用到Python自带的Contextlib库。

第二个知识点

Numpy是Python的一个矩阵运算库。

在机器学习相关的场景下,Numpy用的很多,尤其是ndarray就是多个维度的矩阵,实际上和Pytorch的Tensor是一个意思,只不过是不同库的不同实现,然后一个tensor.numpy()就是把一个Pytorch的Tensor转换成Numpy的矩阵。因为之后可能是可视化啊或者是什么其他操作,需要numpy的矩阵才行。

Pytorch中有data 

data 的意思是这样的。PyTorch规定:在计算图里面的Tensor是不能直接转换成numpy矩阵的,tensor.data是获取一个数值相同的tensor,同时这个tensor是不在计算图中的,然后它才能用numpy(),但是这个是0.4版本之前的操作,现在有了操作更安全的tensor.datach()操作,用这个会更好,但是本身功能两者是一样的。要修改成tensor.detach().numpy()

以后写detach,别写data,因为detach更安全。注意detach是方法,要tensor.detach().numpy();data是属性,是tensor.data.numpy()。大概是这样。

参考链接:

https://blog.csdn.net/u013066730/article/details/96484351?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control
 

上一篇:多层·感知机


下一篇:C++创建线程