卷积尺寸公式(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 闭包 => 装饰器
>>> 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` 异常。
类型
- 斐波拉契堆???