python list是有序的,感觉还是改成list之后,print net 会出问题
1 Like
Q1
class MySequential2(nn.Module):
"""顺序块"""
# 使用list
def __init__(self, *args):
super(MySequential2, self).__init__()
self.sequential = []
for module in args:
self.sequential.append(module)
def forward(self, X):
# OrderedDict保证了按照成员添加的顺序遍历它们
for module in self.sequential:
X = module(X)
return X
linear1 = nn.Linear(20, 256)
relu = nn.ReLU()
linear2 = nn.Linear(256, 10)
net = MySequential(linear1, relu, linear2)
net2 = MySequential2(linear1, relu, linear2)
# 结果一样
# print(net(X))
# print(net2(X))
# 使用_modules方便打印net的网络结构和参数,而list则无法做到
# print(net, '\n', net.state_dict())
# print(net2, '\n', net2.state_dict())
Q2
class MyBlock(nn.Module):
def __init__(self, block1, block2):
super(MyBlock, self).__init__()
self.block1 = block1
self.block2 = block2
def forward(self, X):
X = torch.cat((self.block1(X), self.block2(X)), 1)
return X
block = MyBlock(nn.Linear(20, 5), nn.Linear(20, 5))
net = nn.Sequential(block, nn.ReLU(), nn.Linear(10, 5))
print(net(X).shape)
Q3
class Factory(nn.Module):
def __init__(self, block, ins, outs, k):
super().__init__()
self.dims = []
self.dims.append(ins)
for i in range(k):
self.dims.append(8 * pow(2, i + 1))
self.dims.append(outs)
for idx in range(k):
self._modules[str(idx)] = block(self.dims[idx], self.dims[idx + 1])
def forward(self, X):
for block in self._modules.values():
X = block(X)
return X
net = Factory(nn.Linear, 20, 10, 3)
print(net)
4 Likes
5.1.4 效率这一章就仅是提一下“在深度学习环境中,我们担⼼
速度极快的GPU可能要等到CPU运⾏Python代码后才能运⾏另⼀个作业”吗。。。之后有什么好的建议吗?因为我最近就是遇到这个CPU限制GPU性能的问题
可是换成list之后并没有报错-------
我跟着代码运行并查看了输出:
Factory
中的
for idx in range(k):
self._modules[str(idx)] = block(self.dims[idx], self.dims[idx + 1])
需要修改为
for idx in range(k+1):
self._modules[str(idx)] = block(self.dims[idx], self.dims[idx + 1])
这样输出的net层才包含了输出的维度(outs)
是的!应该是range(k + 1)
,非常感谢您的指正!
net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
net2 = MySequential2(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
结果不一样的原因应该是线性层的权值不同,网络结构相同,但是每层的参数不同
1 Like
有一个问题,
class MYS(nn.Module):
def init(self, *args):
super().init()
for idx,module in enumerate(args):
self._modules[str(idx)]=module
def forward(self, x):
for b in self._modules.values():
x=b(x)
return x
在自定义顺序块这段代码中,按理说self._modules只在MYS类里面调用,所以写成self.__modules也是可以的,但是为什么写成后面这一种报错了,错误类型是’MYS’ object has no attribute ‘_MYS__modules’
怎么我的torch里没有concat这个方法