Pytorch/Tensorflow随手记

卷积尺寸公式(I - W + 2*P) / S + 1
池化尺寸公式 (I - W) / S + 1

  • pytorch中tensor变量,分成内存和逻辑索引(一些stride),.view()函数使变量的内存不变,而只是改变的逻辑语义;所以需要后接contiguous(),可以建立一个连续的内存空间,按照逻辑语义重新构造一个内存空间!可以直接使用reshape()函数实现二合一的效果!
  • Pytorch:nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2), nn.ReLU(inplace=True) inplace-选择是否进行覆盖运算
  • Pytorch: Conv2d中的padding策略! 上下左右都加pad!
  • conv1 = nn.Conv2d(1, 1, 3, stride=1, bias=False, dilation=1) # 普通卷积
  • conv2 = nn.Conv2d(1, 1, 3, stride=1, bias=False, dilation=2) # dilation就是空洞率,即间隔
  • Python: 类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类__dict__里的;对象的__dict__中存储了一些self.xxx的一些东西
  • pytorch: model.to(device)
  • in-place operation 在 pytorch中是指改变一个tensor的值的时候,不经过复制操作,而是在运来的内存上改变它的值。可以把它称为原地操作符。
  • 在pytorch中经常加后缀 “” 来代表原地in-place operation, 比如 .add() 或者.scatter() ; python 中里面的 += *= 也是in-place operation。
  • astype函数用于array中数值类型转换: x = np.array([1, 2, 2.5]); x.astype(int) >输出:array([1, 2, 2])
  • numpy.tile() 类似于 matlab中的repmat, a = np.array([0,1,2]); np.tile(a,(2,1)) > array([[0,1,2], [0,1,2]]) (batchNum c y x)
  • is用于判断两个变量引用对象是否为同一个, ==用于判断引用变量的值是否相等。a is b 相当于 id(a)==id(b),id() 能够获取对象的内存地址。
a=100000000000;
b=100000000000;
print a is b   >> true

后来查了资料才发现是:Python出于对性能的考虑,但凡是不可变对象,在同一个代码块中的对象,只有是值相同的对象,就不会重复创建,而是直接引用已经存在的对象。
PS 避免使用is用于比较类似数值和字符串这类不可变值 因为python内部操作方式,使用is是不可预测的!

内嵌函数 lambda global nonlocal 闭包 => 装饰器

  • 函数式编程的经典问题!
  • python look in Look in
    • python 中作用域的问题,循环不在python中形成作用域!Look in
    • Python 中 global和nonlocal Look in
    • Python中的闭包,global,nonlocal
>>> def funX():
    x = 5
    def funY():
        nonlocal x
        x+=1
        return x
    return funY
>>> a = funX()
>>> print(a())
6
>>> print(a())
7
>>> print(a())
8

其实大家仔细看看就明白了,当a = funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x就没有被重新初始化。

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs
f1, f2, f3 = count()
print(f1(),f2(),f3())

调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是 9,9,9。
因为当count()函数返回三个函数时,这三个变量所引用的变量i的值已经变成了3,
因为在返回的时候三个函数并没有被调用,从整个循环过程到函数被print调用过程之间,count的外部变量一直是没有释放!所以实际调用时,i已经都是3了 修改如下

def count():
    fs = []
    for i in range(1, 4):
        def f(m=i):
            return m*m
        fs.append(f)
    return fs
f1, f2, f3 = count()
print (f1(), f2(), f3())

所以闭包是能保存运行环境的,如变量m这里就在循环过程中保存下来了,实际调用时就能输出 1 4 9

装饰器

  • 修改其他函数的功能的函数,又可以理解就是用函数作为函数的参数的一个操作,用@简化表示!

Python 生成器

>>> set(dir(Generator)) - set(dir(Iterator))
{'close', 'send', 'throw'}
  • Send
`generator.send(value)`
`作用`:向生成器发送一个值,随后恢复执行。
`value` 参数是 send 方法向生成器发送的值,这个值会作为当前所在的 yield 表达式的结果。
`随后`生成器恢复执行,直到下一个 yield,把它后面的值作为 send 方法的结果返回。如果恢复执行后再也没有 yield 语句,生成器退出,并抛出 StopIteration 异常。
`如果一开始`使用 send 启动生成器,必须使用 None 作为参数,因为一开始没有可以接收值的 yield 表达式。
  • throw
`generator.throw(type[, value[, traceback]])`
`作用`:在生成器暂停的地方抛出类型为 `type` 的异常,并返回下一个 `yield` 的返回值。
`如果`生成器函数没有捕获并处理传入的异常,或者说抛出了另一个异常,那么该异常会被传递给调用方。
`如果`生成器退出时还没有 `yield` 新值,则会抛出 `StopIteration` 异常。

类型

  • 斐波拉契堆???
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值