list
- 20230703 Segmentation fault (core dumped)
- GPU被额外占用
- 环境错误:conda环境不一致,对图片进行相同转换,得到不同tensor
- TensorFlow错误:RuntimeError: tf.summary.FileWriter is not compatible with eager execution. ontrib.summary instead.
- shell错误:extract.sh: line 3: $'\r': command not found
- pycharm错误:“No such file or directory”
- python错误: extend (扩展) 与 append (追加) 的差别
- pytorch错误:RuntimeError: expected scalar type Double but found Float
- Pytorch中的model.train()和model.eval()模式详解
- mixup
- torch 和 numpy 实现 normalize
- json存取数据
20230703 Segmentation fault (core dumped)
问题分析:
执行python test.py,提示:“Segmentation fault (core dumped)”。
ChatGPT提示:“使用了损坏的库或依赖”。
验证发现,tensorboard_logger错误
解决方案:
- 重装tensorboard_logger
- 用tensorboardX替代
GPU被额外占用
- 设置环境变量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上。
- 额外的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上
环境错误: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'])