所以我试图在一个文件夹中循环一堆图像,做一些更改并将它们保存在一个子目录中,但我遇到了权限被拒绝的问题。
from PIL import Image
import os
path = 'D:/my_path/'
dirs = os.listdir( path )
new_folder = 'out'
if not os.path.exists(path + new_folder):
os.makedirs(path + new_folder)
def resize():
num=0
for item in dirs:
#print(path + item)
if os.path.isfile(path+item):
im = Image.open(path+item).convert('RGB')
imResize = im.resize((64, 64), Image.ANTIALIAS)
im.Resize = os.rename(os.path.join(path, item),os.path.join(path, 'bad_' + str(num)) )
imResize.save(path + new_folder, 'JPEG', quality=90)
num+=1
#if num > 1000:
#break
resize()
Run Code Online (Sandbox Code Playgroud)
PermissionError: [Errno 13] 权限被拒绝: 'D:/my_path/out/'
错误在这条线上触发imResize.save(path + new_folder, 'JPEG', quality=90)
知道为什么吗?
该文档含糊不清,没有示例代码向您展示如何使用它。它的文档是
将参数组添加到Optimizer的param_groups中。
当对预训练的网络进行微调时,这很有用,因为可以使冻结的层成为可训练的,并随着训练的进行而添加到优化器中。
参数:param_group(dict)–指定应优化哪些张量以及组优化选项。(具体)–
我假设我可以param_group
通过输入从模型的state_dict()
?获得的值来获取参数。例如所有实际重量值?我之所以这样问是因为我想建立一个渐进网络,这意味着我需要不断地从新创建的卷积和激活模块中输入Adam参数。
我在官方 pytorch 教程中得到了这个 nn 结构:
输入 -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d -> 视图 -> 线性 -> relu -> 线性 -> relu -> 线性 -> MSELoss -> 损失
然后是如何使用变量中的内置 .grad_fn 向后跟踪 grad 的示例。
# Eg:
print(loss.grad_fn) # MSELoss
print(loss.grad_fn.next_functions[0][0]) # Linear
print(loss.grad_fn.next_functions[0][0].next_functions[0][0]) # ReLU
Run Code Online (Sandbox Code Playgroud)
所以我想我可以通过粘贴 next_function[0][0] 9 次来达到 Conv2d 的 grad 对象,因为给定的例子但我得到了索引之外的错误元组。那么如何正确索引这些反向传播对象呢?
我编写了以下代码作为测试,因为在我的原始网络中,我使用 ModuleDict 并取决于我提供的索引将仅切片和训练该网络的一部分。
我想确保只有切片层会更新它们的权重,所以我写了一些测试代码来仔细检查。好吧,我得到了一些奇怪的结果。假设我的模型有 2 层,layer1 是 FC,而 layer 2 是 Conv2d,如果我对网络进行切片并且只使用 layer2,我希望 layer1 的权重保持不变,因为它们未使用,并且 layer2 的权重将在 1 个时期后更新。
所以我的计划是使用for
循环从网络中获取所有权重在训练之前然后我会在 1 之后做optimizer.step()
。两次我都将这些权重完全分开存储在 2 个 Python 列表中,以便稍后比较它们的结果。好吧,出于某种原因,如果我将它们与torch.equal()
我认为的进行比较,这两个列表是完全相同的,因为也许内存中仍然存在某种隐藏的链接?因此.detach()
,当我从循环中抓取它们时,我尝试使用它们,结果仍然相同。在这种情况下,Layer2 的权重应该不同,因为它应该包含训练前来自网络的权重。
在下面的代码中指出,我实际上使用的是 layer1 而忽略了 layer2。
完整代码:
class mymodel(nn.Module):
def __init__(self):
super().__init__()
self.layer1 = nn.Linear(10, 5)
self.layer2 = nn.Conv2d(1, 5, 4, 2, 1)
self.act = nn.Sigmoid()
def forward(self, x):
x = self.layer1(x) #only layer1 and act are used layer 2 is ignored so only layer1 and act's …
Run Code Online (Sandbox Code Playgroud)