xml version="1.0" encoding="utf-8" standalone="yes"12bet++博客-杰http://www.fometaux.com/guijie/杰哥好,哈哈!zh-cnWed, 03 Apr 2019 20:37:52 GMTWed, 03 Apr 2019 20:37:52 GMT6012bet++博客-杰http://www.fometaux.com/guijie/archive/2019/04/02/216325.html杰哥杰哥Mon, 01 Apr 2019 21:42:00 GMThttp://www.fometaux.com/guijie/archive/2019/04/02/216325.htmlhttp://www.fometaux.com/guijie/comments/216325.htmlhttp://www.fometaux.com/guijie/archive/2019/04/02/216325.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216325.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216325.htmlWhile research in Generative Adversarial Networks (GANs) continues to improve the fundamental stability of these models, we use a bunch of tricks to train them and make them stable day to day.

Here are a summary of some of the tricks.

Here's a link to the authors of this document

If you find a trick that is particularly useful in practice, please open a Pull Request to add it to the document. If we find it to be reasonable and verified, we will merge it in.

1. Normalize the inputs

  • normalize the images between -1 and 1
  • Tanh as the last layer of the generator output

2: A modified loss function

In GAN papers, the loss function to optimize G is min (log 1-D), but in practice folks practically use max log D

  • because the first formulation has vanishing gradients early on
  • Goodfellow et. al (2014)

In practice, works well:

  • Flip labels when training generator: real = fake, fake = real

3: Use a spherical Z

  • Dont sample from a Uniform distribution

cube

  • Sample from a gaussian distribution

sphere

4: BatchNorm

  • Construct different mini-batches for real and fake, i.e. each mini-batch needs to contain only all real images or all generated images.
  • when batchnorm is not an option use instance normalization (for each sample, subtract mean and divide by standard deviation).

batchmix

5: Avoid Sparse Gradients: ReLU, MaxPool

  • the stability of the GAN game suffers if you have sparse gradients
  • LeakyReLU = good (in both G and D)
  • For Downsampling, use: Average Pooling, Conv2d + stride
  • For Upsampling, use: PixelShuffle, ConvTranspose2d + stride

6: Use Soft and Noisy Labels

  • Label Smoothing, i.e. if you have two target labels: Real=1 and Fake=0, then for each incoming sample, if it is real, then replace the label with a random number between 0.7 and 1.2, and if it is a fake sample, replace it with 0.0 and 0.3 (for example).
    • Salimans et. al. 2016
  • make the labels the noisy for the discriminator: occasionally flip the labels when training the discriminator

7: DCGAN / Hybrid Models

  • Use DCGAN when you can. It works!
  • if you cant use DCGANs and no model is stable, use a hybrid model : KL + GAN or VAE + GAN

8: Use stability tricks from RL

  • Experience Replay
    • Keep a replay buffer of past generations and occassionally show them
    • Keep checkpoints from the past of G and D and occassionaly swap them out for a few iterations
  • All stability tricks that work for deep deterministic policy gradients
  • See Pfau & Vinyals (2016)

9: Use the ADAM Optimizer

  • optim.Adam rules!
    • See Radford et. al. 2015
  • Use SGD for discriminator and ADAM for generator

10: Track failures early

  • D loss goes to 0: failure mode
  • check norms of gradients: if they are over 100 things are screwing up
  • when things are working, D loss has low variance and goes down over time vs having huge variance and spiking
  • if loss of generator steadily decreases, then it's fooling D with garbage (says martin)

11: Dont balance loss via statistics (unless you have a good reason to)

  • Dont try to find a (number of G / number of D) schedule to uncollapse training
  • It's hard and we've all tried it.
  • If you do try it, have a principled approach to it, rather than intuition

For example

while lossD > A:   train D while lossG > B:   train G 

12: If you have labels, use them

  • if you have labels available, training the discriminator to also classify the samples: auxillary GANs

13: Add noise to inputs, decay over time

14: [notsure] Train discriminator more (sometimes)

  • especially when you have noise
  • hard to find a schedule of number of D iterations vs G iterations

15: [notsure] Batch Discrimination

  • Mixed results

16: Discrete variables in Conditional GANs

  • Use an Embedding layer
  • Add as additional channels to images
  • Keep embedding dimensionality low and upsample to match image channel size

17: Use Dropouts in G in both train and test phase

Authors

  • Soumith Chintala
  • Emily Denton
  • Martin Arjovsky
  • Michael Mathieu
Reference:
https://github.com/soumith/ganhacks#authors



GAN的一些小trick

最近训练GAN遇到了很多坑,GAN的训练的确是个很dt的问题,如果只是用别人的paper跑一些应用还好,如果自己设计新的结构,做一些新的研究的话,就需要了解这些trick了,都是泪~

这个doc soumith/ganhackssoumith/ganhacks 简直是GAN武林界的九阴真经,看完以后感觉自己上了一个level。

自己做个笔记:

1。normalize输入,让它在[-1,1]。generater的输出用tanh,也是[-1,1],这就对应起来了。

2。论文里面optimize G是min log(1 - D),但在实际训练的时候可以用 max log(D)

3。对于噪声z,别用均匀(uniform)分布,用高斯分布。

4。可以用instance norm代替 batch norm。还有就是real放一起,generated放一起(感觉这个是废话QAQ)。

5。避免稀疏的gradients:RELU,Maxpool那些。这一点我认为原因是不像做辨别式的网络,判别式的,尽可能提取重要的信息,其实一些对预测影响不大的信息都被忽略掉了。但是GAN不同,是生成式的模型,所以要尽可能的表现出细节方面的内容,所以避免使用稀疏的这些?

  • LeakyRelu
  • For Downsampling, use: Average Pooling, Conv2d + stride
  • For Upsampling, use: PixelShuffle, ConvTranspose2d + stride

6。可以把label为1的(real)变到0.7~1.2,label为0的变到0~0.3。这个可以深入想想。

7。能用DCGAN就用,用不了的话用混合模型,KL+GAN,VAE+GAN之类的。

8。借用RL训练技巧。

  • Keep a replay buffer of past generations and occassionally show them
  • Keep checkpoints from the past of G and D and occassionaly swap them out for a few iterations

9。用ADAM!或者是D可以用SGD,G用ADAM

10。注意训练过程,尽早发现训练失败,不至于训练好长时间最后才发现,浪费时间。

11。最好别尝试设置一些常量去balance G与D的训练过程。(他们说这个work很难做。我觉得有时间的话其实还是可以试一下的。)

12。如果你对real有相应的label,用label,AC-GAN。加入label信息,可以降低生成的难度,这个应该可以想的通。

13。加噪声?作用是improve生成内容得diversity?

  • Add some artificial noise to inputs to D (Arjovsky et. al., Huszar, 2016)
  • adding gaussian noise to every layer of generator (Zhao et. al. EBGAN)

14。【not sure】多训练D,特别是加噪声的时候。

15。【not sure】batch D,感觉貌似是和pix2pix中的patchGAN有点像?

16。CGAN,我一直觉得CGAN这种才符合人类学习的思路。原始的GAN就太粗暴了,就好像什么都不知道,然后两个人D与G讨论交流对抗,产生的都是一些前人没有做过的工作,开篇的工作,所以比较困难一些,但是CGAN的话就有了一定的前提,也就是技术积累,所以比较简单一些。有点类似科研中的大牛挖坑,开辟新方向(GAN)。小牛填坑(CGAN)。

17。在G中的几层中用dropout(50%)。这个有一篇论文,还没看。


读完这些感觉自己想要设计GAN的话,应该有个系统的认识了,不会觉得自己好像有哪些重要的地方还不知道,很不踏实感觉。这种感觉对我这种强迫症的感觉很不爽啊!!看完以后顿时舒服了很多~~~

https://zhuanlan.zhihu.com/p/27725664

杰哥 2019-04-02 05:42 发表评论
]]>
12bet++博客-杰http://www.fometaux.com/guijie/archive/2019/03/27/216316.html杰哥杰哥Tue, 26 Mar 2019 21:01:00 GMThttp://www.fometaux.com/guijie/archive/2019/03/27/216316.htmlhttp://www.fometaux.com/guijie/comments/216316.htmlhttp://www.fometaux.com/guijie/archive/2019/03/27/216316.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216316.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216316.htmlWhat is the meaning of the word logits in TensorFlow?
In the following TensorFlow function, we must feed the activation of artificial neurons in the final layer. That I understand. But I don't understand why it is called logits? Isn't that a mathematical function?
loss_function = tf.nn.softmax_cross_entropy_with_logits(
     logits = last_layer,
     labels = target_output
)

For example, in the last layer of the discriminator of generative adversarial networks (GAN), we will use sigmoid(logits) to get the output of D. This is discussed with Zhengxia.
Reference:
https://stackoverflow.com/questions/41455101/what-is-the-meaning-of-the-word-logits-in-tensorflow


杰哥 2019-03-27 05:01 发表评论
]]>
12bet++博客-杰http://www.fometaux.com/guijie/archive/2019/03/20/216303.html杰哥杰哥Tue, 19 Mar 2019 19:08:00 GMThttp://www.fometaux.com/guijie/archive/2019/03/20/216303.htmlhttp://www.fometaux.com/guijie/comments/216303.htmlhttp://www.fometaux.com/guijie/archive/2019/03/20/216303.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216303.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216303.htmlFor https://github.com/scutan90/DeepLearning-500-questions/blob/master/ch07_%E7%94%9F%E6%88%90%E5%AF%B9%E6%8A%97%E7%BD%91%E7%BB%9C(GAN)/%E7%AC%AC%E4
%B8%83%E7%AB%A0_%E7%94%9F%E6%88%90%E5%AF%B9%E6%8A%97%E7%BD%91%E7%BB%9C(GAN).md, the formula doesn't show well. I asked Zhengxia, he says that markdown doesn't support formula very well. As he knows markdown doesn't support the in-line formula. He uses markdown, but he doesn't use formula in it. If you have to use formula, you can use latex. If we use Typora, at the lower left corner, select "启用源代码模式". Change 
$$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {{\rm E}{x\sim{p{data}}(x)}}[\log D(x)] + {{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z)))]$$
to make both $$ in a separate line. Select "退出源代码模式" and press F5 which means 刷新. The formula will show correctly.
Google search "online markdown". For example, if we use https://dillinger.io/, copy the code from Typora to https://dillinger.io/. We will find that if we want to see the formula, we have to use in this way: $$\mathop {\min }\limits_G \mathop {\max }\limits_D V(D,G) = {{\rm E}{x\sim{p{data}}(x)}}[\log D(x)] + {{\rm E}_{z\sim{p_z}(z)}}[\log (1 - D(G(z)))]$$


杰哥 2019-03-20 03:08 发表评论
]]>
12bet++博客-杰http://www.fometaux.com/guijie/archive/2019/03/17/216300.html杰哥杰哥Sun, 17 Mar 2019 15:24:00 GMThttp://www.fometaux.com/guijie/archive/2019/03/17/216300.htmlhttp://www.fometaux.com/guijie/comments/216300.htmlhttp://www.fometaux.com/guijie/archive/2019/03/17/216300.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216300.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216300.htmlgoogle scholar, 点进paper,cited by的number => 勾上search within citing articles, search box里输入 -author:"your name" 
Reference: http://www.unknownspace.org/article_t/Immigration/33820191.html

杰哥 2019-03-17 23:24 发表评论
]]>
12bet++博客-杰http://www.fometaux.com/guijie/archive/2019/02/13/216240.html杰哥杰哥Wed, 13 Feb 2019 15:56:00 GMThttp://www.fometaux.com/guijie/archive/2019/02/13/216240.htmlhttp://www.fometaux.com/guijie/comments/216240.htmlhttp://www.fometaux.com/guijie/archive/2019/02/13/216240.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216240.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216240.html原文出处:

https://www.kdnuggets.com/2018/02/essential-google-colaboratory-tips-tricks.html


试想一下,如果有个免费的在线云端平台,既可以不用安装 TensorFlow 直接使用,又可以实现 GPU 加速训练,那该是多好的一件事情。你没听错,这种好事确实存在!今天我就重磅介绍一个谷歌推出的免费的云端工具:Colaboratory。


Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果。它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行。Colaboratory 笔记本存储在 Google 云端硬盘中,并且可以共享,就如同您使用 Google 文档或表格一样。Colaboratory 可免费使用。


也就是说,Colaboratory 存储在 Google 云端硬盘中,我们可以在 Google 云端硬盘里直接编写 Jupyter Notebook,在线使用深度学习框架 TensorFlow 并训练我们的神经网络了。超炫!



这里有 3 个令人相见恨晚的奇技淫巧来简化它的使用,分别是:使用免费的 GPU、安装库、上传并使用数据文件。


下面分别介绍:


1. 使用免费的 GPU


在打开的 Jupyter Notebook 中,选择菜单栏“代码执行程序(Runtime)”,“更改运行类型(Change runtime type)”,这时将看到以下弹出窗口:

确保“硬件加速器(Hardware accelerator)”设置为 GPU(默认为 CPU)。设置完毕后点击保存。


值得注意的是确认笔记本处于已连接的状态:



检查是否真的开启了 GPU(即当前连接到了GPU实例),可以直接在 Jupyter Notebook 中运行以下命令


import tensorflow as tf
device_name = tf.test.gpu_device_name()
if device_name != '/device:GPU:0':
 raise SystemError('GPU device not found')
print('Found GPU at: {}'.format(device_name))

 

若输出以下语句,则表明已经使用了 GPU 实例。


Found GPU at: /device:GPU:0


但是,由于在线 GPU 资源有限,有时候可能会出现下面的问题提示:



 

就这样,谷歌允许你一次最多持续使用 12 小时的免费 GPU。


2. 安装库


目前,在 Google Colaboratory 中安装的软件并不是持久的,意味着每次重新连接实例时都需要重新安装。但是,Colab 已经默认安装了需要有用的库,安装新的库也并非难事,方法也有好几种。


但需要注意的是,安装任何需要从源代码构建的软件可能需要很长的时间。


Colab 同时支持 pip 和 apt 包管理器。无论您使用的是哪一个,记住要在命令前面加上符号 “!”。


# Install Keras with pip
!pip install -q keras
import keras

>
>> Using TensorFlow backend.

#
Install GraphViz with apt
!apt-get install graphviz -y



3. 上传并使用数据文件


我们一般都需要在 Colab 笔记本中使用数据,对吧?你可以使用 wget 之类的工具从网络上获取数据,但是如果你有一些本地文件,想上传到你的谷歌硬盘中的 Colab 环境里并使用它们,该怎么做呢


很简单,只需 3 步即可实现!


首先使用以下命令调用笔记本中的文件选择器:


from google.colab import files
uploaded = files.upload()


运行之后,我们就会发现单元 cell 下出现了“选择文件”按钮:



这样就可以直接选择你想上传的文件啦!


选择文件后,使用以下迭代方法上传文件以查找其键名,命令如下:


for fn in uploaded.keys():
 print('User uploaded file "{name}" with length {length} bytes'.format(name=fn, length=len(uploaded[fn])))


例如待上传的是 iris.csv 文件,若运行没有问题的话,应该出现类似下面的提示语句:


User uploaded file "iris.csv" with length 3716 bytes


最后,就使用以下命令将文件的内容加载到 Pandas 的 DataFrame 中了:


import pandas as pd
import io
df = pd.read_csv(io.StringIO(uploaded['iris.csv'].decode('utf-8')))
print(df)


这种上传文件的方法是不是很简单呢?当然,上传和使用数据文件还有其它的方法,但是我发现这一方法最简单明了。


以上就是关于 Google Calaboratory 的 3 个非常实用的技巧,赶紧尝试一下吧!


最后,可能有的读者朋友对 Google Calaboratory 不太了解的,可以查看我之前写的一篇文章:如何在免费云端运行 Python 深度学习框架?链接如下:


https://redstonewill.com/1493/


也可以点击阅读原文查看!


Reference:
https://mp.weixin.qq.com/s/vLnBFPZNvIjs4R7d4_6M_g


杰哥 2019-02-13 23:56 发表评论
]]>
12bet++博客-杰http://www.fometaux.com/guijie/archive/2019/02/02/216230.html杰哥杰哥Fri, 01 Feb 2019 17:51:00 GMThttp://www.fometaux.com/guijie/archive/2019/02/02/216230.htmlhttp://www.fometaux.com/guijie/comments/216230.htmlhttp://www.fometaux.com/guijie/archive/2019/02/02/216230.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216230.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216230.html

分享一篇文章:The Meaning of Underscores in Python

本文介绍了Python中单下划线和双下划线("dunder")的各种含义和命名约定,名称修饰(name mangling)的工作原理,以及它如何影响你自己的Python类。

单下划线和双下划线在Python变量和方法名称中都各有其含义。有一些含义仅仅是依照约定,被视作是对程序员的提示 - 而有一些含义是由Python解释器严格执行的。

如果你想知道“Python变量和方法名称中单下划线和双下划线的含义是什么?”,我会尽我所能在这里为你解答。

在本文中,我将讨论以下五种下划线模式和命名约定,以及它们如何影响Python程序的行为:

  • 单前导下划线:_var
  • 单末尾下划线:var_
  • 双前导下划线:__var
  • 双前导和末尾下划线:__var__
  • 单下划线:_

在文章结尾处,你可以找到一个简短的“速查表”,总结了五种不同的下划线命名约定及其含义,以及一个简短的视频教程,可让你亲身体验它们的行为。

让我们马上开始!

1. 单前导下划线 _var

当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。 它是对程序员的一个提示 - 意味着Python社区一致认为它应该是什么意思,但程序的行为不受影响。

下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅供内部使用。 该约定在PEP 8中有定义。

这不是Python强制规定的。 Python不像Java那样在“私有”和“公共”变量之间有很强的区别。 这就像有人提出了一个小小的下划线警告标志,说:

“嘿,这不是真的要成为类的公共接口的一部分。不去管它就好。“

看看下面的例子:

class Test:    def __init__(self):        self.foo = 11        self._bar = 23 

如果你实例化此类,并尝试访问在__init__构造函数中定义的foo和_bar属性,会发生什么情况? 让我们来看看:

>>> t = Test() >>> t.foo 11 >>> t._bar 23 

你会看到_bar中的单个下划线并没有阻止我们“进入”类并访问该变量的值。

这是因为Python中的单个下划线前缀仅仅是一个约定 - 至少相对于变量和方法名而言。

但是,前导下划线的确会影响从模块中导入名称的方式。

假设你在一个名为my_module的模块中有以下代码:

# This is my_module.py:  def external_func():    return 23  def _internal_func():    return 42 

现在,如果使用通配符从模块中导入所有名称,则Python不会导入带有前导下划线的名称(除非模块定义了覆盖此行为的__all__列表):

>>> from my_module import * >>> external_func() 23 >>> _internal_func() NameError: "name '_internal_func' is not defined" 

顺便说一下,应该避免通配符导入,因为它们使名称空间中存在哪些名称不清楚。 为了清楚起见,坚持常规导入更好。

与通配符导入不同,常规导入不受前导单个下划线命名约定的影响:

>>> import my_module >>> my_module.external_func() 23 >>> my_module._internal_func() 42 

我知道这一点可能有点令人困惑。 如果你遵循PEP 8推荐,避免通配符导入,那么你真正需要记住的只有这个:

单个下划线是一个Python命名约定,表示这个名称是供内部使用的。 它通常不由Python解释器强制执行,仅仅作为一种对程序员的提示。

2. 单末尾下划线 var_

有时候,一个变量的最合适的名称已经被一个关键字所占用。 因此,像class或def这样的名称不能用作Python中的变量名称。 在这种情况下,你可以附加一个下划线来解决命名冲突:

>>> def make_object(name, class): SyntaxError: "invalid syntax"  >>> def make_object(name, class_): ...    pass 

总之,单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。 PEP 8解释了这个约定。

3. 双前导下划线 __var

到目前为止,我们所涉及的所有命名模式的含义,来自于已达成共识的约定。 而对于以双下划线开头的Python类的属性(包括变量和方法),情况就有点不同了。

双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突。

这也叫做名称修饰(name mangling) - 解释器更改变量的名称,以便在类被扩展的时候不容易产生冲突。

我知道这听起来很抽象。 因此,我组合了一个小小的代码示例来予以说明:

class Test:    def __init__(self):        self.foo = 11        self._bar = 23        self.__baz = 23 

让我们用内置的dir()函数来看看这个对象的属性:

>>> t = Test() >>> dir(t) ['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_bar', 'foo'] 

以上是这个对象属性的列表。 让我们来看看这个列表,并寻找我们的原始变量名称foo,_bar和__baz - 我保证你会注意到一些有趣的变化。

  • self.foo变量在属性列表中显示为未修改为foo。
  • self._bar的行为方式相同 - 它以_bar的形式显示在类上。 就像我之前说过的,在这种情况下,前导下划线仅仅是一个约定。 给程序员一个提示而已。
  • 然而,对于self.__baz而言,情况看起来有点不同。 当你在该列表中搜索__baz时,你会看不到有这个名字的变量。

__baz出什么情况了?

如果你仔细观察,你会看到此对象上有一个名为_Test__baz的属性。 这就是Python解释器所做的名称修饰。 它这样做是为了防止变量在子类中被重写。

让我们创建另一个扩展Test类的类,并尝试重写构造函数中添加的现有属性:

class ExtendedTest(Test):    def __init__(self):        super().__init__()        self.foo = 'overridden'        self._bar = 'overridden'        self.__baz = 'overridden' 

现在,你认为foo,_bar和__baz的值会出现在这个ExtendedTest类的实例上吗? 我们来看一看:

>>> t2 = ExtendedTest() >>> t2.foo 'overridden' >>> t2._bar 'overridden' >>> t2.__baz AttributeError: "'ExtendedTest' object has no attribute '__baz'" 

等一下,当我们尝试查看t2 .__ baz的值时,为什么我们会得到AttributeError? 名称修饰被再次触发了! 事实证明,这个对象甚至没有__baz属性:

>>> dir(t2) ['_ExtendedTest__baz', '_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_bar', 'foo', 'get_vars'] 

正如你可以看到__baz变成_ExtendedTest__baz以防止意外修改:

>>> t2._ExtendedTest__baz 'overridden' 

但原来的_Test__baz还在:

>>> t2._Test__baz 42 

双下划线名称修饰对程序员是完全透明的。 下面的例子证实了这一点:

class ManglingTest:    def __init__(self):        self.__mangled = 'hello'     def get_mangled(self):        return self.__mangled  >>> ManglingTest().get_mangled() 'hello' >>> ManglingTest().__mangled AttributeError: "'ManglingTest' object has no attribute '__mangled'" 

名称修饰是否也适用于方法名称? 是的,也适用。名称修饰会影响在一个类的上下文中,以两个下划线字符("dunders")开头的所有名称:

class MangledMethod:    def __method(self):        return 42     def call_it(self):        return self.__method()  >>> MangledMethod().__method() AttributeError: "'MangledMethod' object has no attribute '__method'" >>> MangledMethod().call_it() 42 

这是另一个也许令人惊讶的运用名称修饰的例子:

_MangledGlobal__mangled = 23  class MangledGlobal:    def test(self):        return __mangled  >>> MangledGlobal().test() 23 

在这个例子中,我声明了一个名为_MangledGlobal__mangled的全局变量。然后我在名为MangledGlobal的类的上下文中访问变量。由于名称修饰,我能够在类的test()方法内,以__mangled来引用_MangledGlobal__mangled全局变量。

Python解释器自动将名称__mangled扩展为_MangledGlobal__mangled,因为它以两个下划线字符开头。这表明名称修饰不是专门与类属性关联的。它适用于在类上下文中使用的两个下划线字符开头的任何名称。

有很多要吸收的内容吧。

老实说,这些例子和解释不是从我脑子里蹦出来的。我作了一些研究和加工才弄出来。我一直使用Python,有很多年了,但是像这样的规则和特殊情况并不总是浮现在脑海里。

有时候程序员最重要的技能是“模式识别”,而且知道在哪里查阅信息。如果您在这一点上感到有点不知所措,请不要担心。慢慢来,试试这篇文章中的一些例子。

让这些概念完全沉浸下来,以便你能够理解名称修饰的总体思路,以及我向您展示的一些其他的行为。如果有一天你和它们不期而遇,你会知道在文档中按什么来查。

4. 双前导和双末尾下划线 _var_

也许令人惊讶的是,如果一个名字同时以双下划线开始和结束,则不会应用名称修饰。 由双下划线前缀和后缀包围的变量不会被Python解释器修改:

class PrefixPostfixTest:    def __init__(self):        self.__bam__ = 42  >>> PrefixPostfixTest().__bam__ 42 

但是,Python保留了有双前导和双末尾下划线的名称,用于特殊用途。 这样的例子有,__init__对象构造函数,或__call__ --- 它使得一个对象可以被调用。

这些dunder方法通常被称为神奇方法 - 但Python社区中的许多人(包括我自己)都不喜欢这种方法。

最好避免在自己的程序中使用以双下划线(“dunders”)开头和结尾的名称,以避免与将来Python语言的变化产生冲突。

5.单下划线 _

按照习惯,有时候单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的。

例如,在下面的循环中,我们不需要访问正在运行的索引,我们可以使用“_”来表示它只是一个临时值:

>>> for _ in range(32): ...    print('Hello, World.') 

你也可以在拆分(unpacking)表达式中将单个下划线用作“不关心的”变量,以忽略特定的值。 同样,这个含义只是“依照约定”,并不会在Python解释器中触发特殊的行为。 单个下划线仅仅是一个有效的变量名称,会有这个用途而已。

在下面的代码示例中,我将汽车元组拆分为单独的变量,但我只对颜色和里程值感兴趣。 但是,为了使拆分表达式成功运行,我需要将包含在元组中的所有值分配给变量。 在这种情况下,“_”作为占位符变量可以派上用场:

>>> car = ('red', 'auto', 12, 3812.4) >>> color, _, _, mileage = car  >>> color 'red' >>> mileage 3812.4 >>> _ 12 

除了用作临时变量之外,“_”是大多数Python REPL中的一个特殊变量,它表示由解释器评估的最近一个表达式的结果。

这样就很方便了,比如你可以在一个解释器会话中访问先前计算的结果,或者,你是在动态构建多个对象并与它们交互,无需事先给这些对象分配名字:

>>> 20 + 3 23 >>> _ 23 >>> print(_) 23  >>> list() [] >>> _.append(1) >>> _.append(2) >>> _.append(3) >>> _ [1, 2, 3] 

Python下划线命名模式 - 小结

以下是一个简短的小结,即“速查表”,罗列了我在本文中谈到的五种Python下划线模式的含义:


你想更深入了解学习Python知识体系,你可以看一下我们花费了一个多月整理了上百小时的几百个知识点体系内容:

【超全整理】《Python自动化全能开发从入门到精通》python基础教程笔记

发布于 2018-04-26

Reference:
https://zhuanlan.zhihu.com/p/36173202

杰哥 2019-02-02 01:51 发表评论
]]>
12bet++博客-杰http://www.fometaux.com/guijie/archive/2019/01/23/216218.html杰哥杰哥Tue, 22 Jan 2019 16:47:00 GMThttp://www.fometaux.com/guijie/archive/2019/01/23/216218.htmlhttp://www.fometaux.com/guijie/comments/216218.htmlhttp://www.fometaux.com/guijie/archive/2019/01/23/216218.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216218.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216218.html今天在搭建编译环境的时候出现了一点问题,自己的ls命令不好用了,百度一下找到了正解,3x BaiDu!

    原因:在设置环境变量时,编辑profile文件没有写正确,导致在命令行下 ls等命令不能够识别。
解决方案:在命令行下打入下面这段就可以了
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin


本文是作者原创,转载必须保证文章的完整性并标明出处(blog.sina.com.cn/xywatersky),请尊重作者,支持原创。



杰哥 2019-01-23 00:47 发表评论
]]>
12bet++博客-杰http://www.fometaux.com/guijie/archive/2019/01/17/216205.html杰哥杰哥Wed, 16 Jan 2019 20:09:00 GMThttp://www.fometaux.com/guijie/archive/2019/01/17/216205.htmlhttp://www.fometaux.com/guijie/comments/216205.htmlhttp://www.fometaux.com/guijie/archive/2019/01/17/216205.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216205.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216205.htmlGoogle办公室套件,是Google的一个在线文字处理、电子表格和演示程序。2006年10月10日Google将Writely与旗下Google Spreadsheets集成为Google文档,它的第三个组件,演示功能,在引入Tonic Systems所开发的而技术之后于2007年9月17日发布。 维基百科

G
oogle search: Google Doc and you will get it. If you open a docx file, you input the emails of other people and can "share(共享)". You can select "可以编辑", "可以查看", and "可以评论".

In my flagged email (20181006), "our previous reading list", how to create this? In google doc, in the top left corner, select "表格", "新建电子表格". Then share the "表格" to the people you want to share. Only the people who you share the link can see this. Sui Li send me a test docx on 20190116 (test in my google doc), then I can receive the email reminder. When I revise this document, I do not have to save this file. If I want to see the revising history, click the last menu. You can see that the color of different people's writing is different.
This is with Sui Li's help.

We can also use "腾讯文档". I logged into this on my computer using my webchat account on January 21, 2019.


杰哥 2019-01-17 04:09 发表评论
]]>
12bet++博客-杰http://www.fometaux.com/guijie/archive/2019/01/15/216200.html杰哥杰哥Mon, 14 Jan 2019 20:16:00 GMThttp://www.fometaux.com/guijie/archive/2019/01/15/216200.htmlhttp://www.fometaux.com/guijie/comments/216200.htmlhttp://www.fometaux.com/guijie/archive/2019/01/15/216200.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216200.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216200.html
例如"PyTorch_tutorial_0.0.5"的pytorch的第八页Code/1_data_prepare/1_1_cifar10_to_png.py,为什么Github上"链接另存为"与Clone or download出来的有区别?链接另存为虽然保存的也是.py文件,再在此文件后加上.html后缀,打开就是该网页,保存的实际是网页

谷歌搜索: Github difference clone download
When you clone you get a copy of the history and it is a functional git repo. Downloading a repository just downloads the files from the most recent commit of the default branch. It doesn't download any of the files in the .git folder. ... It's as ifgit never existed, and all you have is a copy of the code/files.
Zhengxia said, if you clone a project, you can have v1, v2 and the most recent version. If you download a project, you can only have the 
most recent version. 

怎么clone,没什么特别讲究吧,还有网址? 
This is with Zhengxia's help.


杰哥 2019-01-15 04:16 发表评论
]]>
12bet++博客-杰http://www.fometaux.com/guijie/archive/2019/01/12/216191.html杰哥杰哥Fri, 11 Jan 2019 18:43:00 GMThttp://www.fometaux.com/guijie/archive/2019/01/12/216191.htmlhttp://www.fometaux.com/guijie/comments/216191.htmlhttp://www.fometaux.com/guijie/archive/2019/01/12/216191.html#Feedback0http://www.fometaux.com/guijie/comments/commentRss/216191.htmlhttp://www.fometaux.com/guijie/services/trackbacks/216191.html正定、超定、欠定矩阵
正定
定义
广义定义
设M是n阶方阵,如果对任何非零向量z,都有 z′Mz>0z′Mz>0,其中z’ 表示z的转置,就称M正定矩阵。[1] 
例如:B为n阶矩阵,E为单位矩阵,a为正实数。aE+BaE+B在a充分大时,aE+BaE+B为正定矩阵。(B必须为对称阵)。
狭义定义
一个n阶的实对称矩阵M是正定的当且仅当对于所有的非零实系数向量z,都有z′Mz>0z′Mz>0。其中z’表示z的转置。
性质
正定矩阵在合同变换下可化为标准型, 即单位矩阵。
合同矩阵:两个实对称矩阵A和B,如存在可逆矩阵P,使得A=PTBPA=PTBP,就称矩阵A和B互为合同矩阵,并且称由A到B的变换叫合同变换。
所有特征值大于零的对称矩阵(或厄米矩阵)是正定矩阵。
判定定理1:对称阵A为正定的充分必要条件是:A的特征值全为正。 
判定定理2:对称阵A为正定的充分必要条件是:A的各阶顺序主子式都为正。 
判定定理3:任意阵A为正定的充分必要条件是:A合同于单位阵。
1.正定矩阵一定是非奇异的。非奇异矩阵的定义:若n阶矩阵A的行列式不为零,即|A|≠0|A|≠0。 
2.正定矩阵的任一主子矩阵也是正定矩阵。 
3.若A为n阶对称正定矩阵,则存在唯一的主对角线元素都是正数的下三角阵L,使得A=L∗L'A=L∗L′,此分解式称为 正定矩阵的乔列斯基(Cholesky)分解。 
4.若A为n阶正定矩阵,则A为n阶可逆矩阵。
矩阵的每一行代表一个方程,m行代表m个线性联立方程。 n列代表n个变量。如果m是独立方程数,根据m
超定方程组
方程个数大于未知量个数的方程组。
对于方程组 Ra=yRa=y,R为n×mn×m矩阵,如果R列满秩,且n>mn>m。
超定方程一般是不存在解的矛盾方程。
例如,如果给定的三点不在一条直线上,我们将无法得到这样一条直线,使得这条直线同时经过给定这三个点。 也就是说给定的条件(限制)过于严格, 导致解不存在。在实验数据处理和曲线拟合问题中,求解超定方程组非常普遍。比较常用的方法是最小二乘法。形象的说,就是在无法完全满足给定的这些条件的情况下,求一个最接近的解。
曲线拟合的最小二乘法要解决的问题,实际上就是求以上超定方程组的最小二乘解的问题。
欠定方程组
方程个数小于未知量个数的方程组。
对于方程组Ra=yRa=y,RR为n×mn×m 矩阵,且n<mn<m。则方程组有无穷多组解,此时称方程组为欠定方程组。
内点法和梯度投影法是目前解欠定方程组的常用方法。
--------------------- 
原文:https://blog.csdn.net/hfdwdjl/article/details/44133845 

评论:欠定方程,这种定义不太严格,因为n<m未必有无穷多解,极端例子,x+y+z=1x+y+z=3,两个方程,三个未知数,无解。
还是要应该要用到the notes of linear algebra P41反页。下面维基上这个应该是严格的,有无穷多解的就叫欠定。
https://zh.wikipedia.org/wiki/%E7%BA%BF%E6%80%A7%E6%96%B9%E7%A8%8B%E7%BB%84

杰哥 2019-01-12 02:43 发表评论
]]>