小编Ink*_*ay_的帖子

Pillow Image.save() [Errno 13] 权限被拒绝

所以我试图在一个文件夹中循环一堆图像,做一些更改并将它们保存在一个子目录中,但我遇到了权限被拒绝的问题。

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)知道为什么吗?

python file-permissions save pillow

5
推荐指数
1
解决办法
8966
查看次数

在pytorch中,如何与优化器一起使用add_param_group()?

该文档含糊不清,没有示例代码向您展示如何使用它。它的文档是

将参数组添加到Optimizer的param_groups中。

当对预训练的网络进行微调时,这很有用,因为可以使冻结的层成为可训练的,并随着训练的进行而添加到优化器中。

参数:param_group(dict)–指定应优化哪些张量以及组优化选项。(具体)–

我假设我可以param_group通过输入从模型的state_dict()?获得的值来获取参数。例如所有实际重量值?我之所以这样问是因为我想建立一个渐进网络,这意味着我需要不断地从新创建的卷积和激活模块中输入Adam参数。

parameters backpropagation python-3.x pytorch

5
推荐指数
1
解决办法
2535
查看次数

您如何在 pytorch 中正确使用 grad_fn 上的 next_functions[0][0] ?

我在官方 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 对象,因为给定的例子但我得到了索引之外的错误元组。那么如何正确索引这些反向传播对象呢?

pytorch

4
推荐指数
1
解决办法
1583
查看次数

为什么在 Pytorch 中,当我复制网络权重时,它会在反向传播后自动更新?

我编写了以下代码作为测试,因为在我的原始网络中,我使用 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)

python machine-learning backpropagation pytorch

2
推荐指数
1
解决办法
6126
查看次数