bug


20230703 Segmentation fault (core dumped)

问题分析:
执行python test.py,提示:“Segmentation fault (core dumped)”。
ChatGPT提示:“使用了损坏的库或依赖”。
在这里插入图片描述
验证发现,tensorboard_logger错误

解决方案:

  1. 重装tensorboard_logger
  2. 用tensorboardX替代

GPU被额外占用

  1. 设置环境变量CUDA_VISIBLE_DEVICES=5后,系统会对设置的GPU进行重新编号,从’0’开始。

验证代码如下:

import torch

# 查看可见的GPU设备
visible_devices = torch.cuda.device_count()
print("Visible GPU devices:", visible_devices)

# 遍历可见的GPU设备,并输出它们的索引和名称
for i in range(visible_devices):
    print(f"Device {i}: {torch.cuda.get_device_name(i)}")

设置CUDA_VISIBLE_DEVICES=5,打印数据,也会显示在cuda:0上。

  1. 额外的GPU占用,从哪里来?
    以下是问题重现的代码:

train.py: 保存模型

import torch
import os

class SimpleNeuralNetwork(torch.nn.Module):
    def __init__(self):
        super(SimpleNeuralNetwork, self).__init__()
        self.weights = torch.nn.Parameter(torch.randn(1))

    def forward(self, x):
        weighted_sum = torch.matmul(x, self.weights)
        output = torch.sigmoid(weighted_sum)
        return output

device = torch.device("cuda:1")
network = SimpleNeuralNetwork()
network.to(device)

torch.save(network.state_dict(), 'weights.pth')

test.py:加载模型

import torch
import os

class SimpleNeuralNetwork(torch.nn.Module):
    def __init__(self):
        super(SimpleNeuralNetwork, self).__init__()
        self.weights = torch.nn.Parameter(torch.randn(1))

    def forward(self, x):
        weighted_sum = torch.matmul(x, self.weights)
        output = torch.sigmoid(weighted_sum)
        return output

device = torch.device("cuda:0")

network = SimpleNeuralNetwork()
network.to(device)

data = torch.load('weights.pth')
#data = torch.load('weights.pth', map_location='cpu')
network.load_state_dict(data)
for name, param in network.named_parameters():
    print(f"Parameter: {name}, Device: {param.device}")

x_test = torch.tensor([[0], [1]], dtype=torch.float32).to(device)
predictions = network(x_test)
print(predictions)
  • train.py:模拟在cuda:1上训练并保存模型
  • test.py: 模拟在cuda:0上加载模型并测试。
    在这里插入图片描述
    显示结果没有问题,但是运行过程中,会观察到cuda:1上占用内存的情况。【使用.cuda(),类似情况没有复现出来。】
  • 问题分析:
    torch.load(model_path)
    默认情况下,会尝试将模型加载到同一GPU设备。
  • 解决方法:
    torch.load(model_path, map_location=‘cpu’)
    GPU预训练保存的权值可以直接载入到CPU下的网络模型network中,并且载入之后network的参数会移到预训练权值所在的device上

[1] 载入模型权重GPU内存被额外占用的bug解决


环境错误:conda环境不一致,对图片进行相同转换,得到不同tensor

在这里插入图片描述

  • 现象:如图所示,clip环境和base环境下,同一张图片生成的tensor,不一致。

chatgpt的回复是:
在这里插入图片描述

  • 解决方法:
    尝试在clip环境下,安装9.0.1,但是出现依赖问题,决定放弃。

  • 修改方案:
    将clip下预测的标签,保存后,切换到base环境下训练。

TensorFlow错误:RuntimeError: tf.summary.FileWriter is not compatible with eager execution. ontrib.summary instead.

解决方法:在import tensorflow as tf之后,加入

tf.compat.v1.disable_eager_execution()

shell错误:extract.sh: line 3: $‘\r’: command not found

vim -b a.sh
在这里插入图片描述
去掉这些^M
用替换命令%s/\r/g

pycharm错误:“No such file or directory”

torch.save(model.state_dict(), 'cur/a.pkl')

现象:
torch.save在pycharm运行失败,在服务器上直接运行通过。

修改:需要写出文件的绝对路径,或者只给一个文件名’a.pkl’

代码路径:VSC/Tools/Finetune.py,在Tools下调试代码,而文件在Tools的同级文件夹Experiments中。所以提示错误。

解决方案:
为方便在pycharm下调试,全写成绝对路径。

python错误: extend (扩展) 与 append (追加) 的差别

  extend添加列表元素,append添加列表。
  例如:l=[1,2]
             l.extend([3])结果l是[1,2,3]
             l.append([3])结果l是[1,2,[3]]

分别用extend和append实现数组拼接

## 处理多维数组
import torch

a=torch.rand(2,8)
b=torch.rand(2,8)

c=[]
c.extend(a)
c.extend(b)

d=torch.cat([i.unsqueeze(0) for i in c])
#d=d.reshape(2, -1) ## 一维必须有维度转换
print(d)

注意:如果是多维数组拼接,extend需要扩展补充一维;如果是一维数组拼接,只能手动改。

import torch

a=torch.rand(2)
b=torch.rand(2)
c=[]
c.append(a)
c.append(b)
d=torch.cat([i.unsqueeze(0) for i in c])
print(d)
## 拼接2为数组
import torch

a=torch.rand(3,8)
b=torch.rand(1,8)
c=[]
c.append(a)
c.append(b)
d=torch.cat([i for i in c])
print(d)

pytorch错误:RuntimeError: expected scalar type Double but found Float

torch.tensor->torch.FloatTensor

Pytorch中的model.train()和model.eval()模式详解

一、model.train()和model.eval()分别在训练和测试中都要写,它们的作用如下:
(1)、 model.train()
启用BatchNormalization和 Dropout,将BatchNormalization和Dropout置为True
(2)、 model.eval()
不启用 BatchNormalization 和 Dropout,将BatchNormalization和Dropout置为False

二、总结
(1)、在训练模块中千万不要忘了写model.train()
(2)、在评估(或测试)模块千万不要忘了写model.eval()


mixup

#链接:https://www.zhihu.com/question/308572298/answer/585140274
for i,(images,target) in enumerate(train_loader):
    # 1.input output
    images = images.cuda(non_blocking=True)
    target = torch.from_numpy(np.array(target)).float().cuda(non_blocking=True)

    # 2.mixup
    alpha=config.alpha
    lam = np.random.beta(alpha,alpha)
    index = torch.randperm(images.size(0)).cuda()
    inputs = lam*images + (1-lam)*images[index,:]
    targets_a, targets_b = target, target[index]
    outputs = model(inputs)
    loss = lam * criterion(outputs, targets_a) + (1 - lam) * criterion(outputs, targets_b)

    # 3.backward
    optimizer.zero_grad()   # reset gradient
    loss.backward()
    optimizer.step()        # update parameters of net

torch 和 numpy 实现 normalize

import numpy as np
import torch
import torch.nn.functional as F

def normalize(x, axis=1):
    return x / np.linalg.norm(x, axis=axis, keepdims=True)

def normalize1(x, dim=1):
    return 1. * x / (torch.norm(x, dim=dim, keepdim=True).expand_as(x) + 1e-12)

x = torch.randn(3,3,3)

print('\nF.normalize归一化')
print(F.normalize(x))
print('\n自定义归一化')
print(normalize(x))
print('\n自定义归一化1')
print(normalize1(x))

json存取数据

import torch
import json
import numpy as np

a = torch.rand(3)
json.dump({'data':a.tolist()}, open('a.json', "w"))

## 从json文件取出,然后list转成tensor/ndarray
f=json.load(open('a.json', "r"))
aa = torch.tensor(f['data'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值