Spyder使用过程BUG记录

Spyder使用过程BUG记录

  • 问题描述
  • 解决尝试
  • 心得体会
  • 小插曲
    • 关于traceback
    • 小尝试

问题描述

  • 由于本人的研究生课题偏向机器学习,因此经常用到pytorch工具进行代码编写。前几天在anaconda自带的编辑器Spyder进行网络训练时(文件名为autodiff.py),过程中无报错,且无提醒对话框,便在最后关掉了Spyder
  • 之后两次尝试打开Spyder时界面没有打开,类似于没有响应的感觉,以为是电脑出现卡顿,便没有在意。但之后需要进一步编写代码时连续数次尝试打开编辑器都没有响应,应该就是出了问题。在一些大佬博主的博客中得知这种情况并不是没有响应,而是dos命令行报错之后闪退,时间极短,造成无响应的假象。所以尝试打开Anaconda Prompt(其实相当于dos命令行的感觉,在cmd窗口输入python效果也一样),之后果然出现了问题提示,也是本篇的核心所在,如图所示:
    Spyder使用过程BUG记录_第1张图片
  • 出现该图之后,我以为是普通的文件错误,进行一定的修改即可,可是事情没有那么简单,具体尝试过程在下一节具体描述。总之三个小时没有解决,我又把autodiff.py代码移植到笔记本上想进行进一步训练(开始出现问题的是台式机,安装的是Anaconda3.5,笔记本上安装的是最新的2020.07),过程也无报错,但期间一直出现anaconda internal problem(error)的窗口提示,还让我发错误相关信息到Spyder官方进行问题解决。但是当时没有重视,以为是什么效果反馈,这里贴出一张比较像但不是当时的完整结果的窗口图:
    Spyder使用过程BUG记录_第2张图片
    没管这个窗口我就直接退出编辑器了,之后发现笔记本上的Spyder也打不开了,这就有点小规律了。原本台式机和笔记本的Spyder都能正常运行,在跑了同一个程序之后就都打不开了,所以矛头又都指向了我的这个程序。
  • 以上应该是对遇到的BUG一个比较详细的描述了。下面稍微展开一下解决尝试的过程。

解决尝试

  • 先说发现了不是电脑卡顿的问题,而是Spyder报错打不开了。这里指的是python无法进入,而不是无法跑程序的问题。首先对anaconda附带的JupyterPromptSpyder等编辑器或运行环境进行打开尝试,均无果,因此直接从之前贴的报错图入手:
    Spyder使用过程BUG记录_第3张图片
  • 红框处是我们在处理错误时最着重的一行,这里显示的是UnicodeDecodeError,翻译一下就是解码到unicode模式时出现错误,用的是gbk解码器。这在我们平时使用python读入文件时是一个常见的错误,因此我就先按照处理读文件出错时的那套思路进行修复。
    Spyder使用过程BUG记录_第4张图片
  • 上图红框中展示了Traceback,也是python出错时回溯的地方,这里的所有回溯都在一个文件中,也就是site.py,是python的自带模块。这种情况一般来说就看到了解决问题的曙光,都在一个文件中关系较为明了,(但是我想多了)。我把site.py文件的报错回溯部分进行了整合理解,最后一行的f其实是一个读取的文件,具体过程如下:
def addpackage(sitedir, name, known_paths):
    """Process a .pth file within the site-packages directory:
       For each line in the file, either combine it with sitedir to a path
       and add that to known_paths, or execute it if it starts with 'import '.
    """
    if known_paths is None:
        known_paths = _init_pathinfo()
        reset = True
    else:
        reset = False
    fullname = os.path.join(sitedir, name)
    try:
        f = io.TextIOWrapper(io.open_code(fullname))
    except OSError:
        return
    with f:
        for n, line in enumerate(f):
            if line.startswith("#"):
                continue
  • 再结合针对读取文件时的UnicodeDecodeError,这里显然就可以将文件f的解码方式由gbk转为utf-8。改完保存后再次尝试打开Anaconda Prompt,结果出现了另一个错误:
UnicodeDecodeError:'utf-8' codec can't decode..: invalid start byte.

(错误中间的说明有点忘了,但结构是这样的)。这样一来gbkutf-8两大解码神器都没有起到效果,只能另辟他径。

  • 现在回到最开始的错误提示:
    Spyder使用过程BUG记录_第5张图片
    这里显示的是在position 64处的byte 0x80无法被解码,那我们是不是找到这个字节并且修改或删除掉就可以解决这个问题,之后我就在site.py文件、我写的autodiff.py文件中寻找可能存在问题的字节。经过相当多次的尝试,最后并没有用。。。
  • 最后就来到了之前没有提到的问题描述第一行,也是最简单粗暴的一行:
    Spyder使用过程BUG记录_第6张图片
    致命的python错误,引入site模块失败。
    就这一行奠定了这个错误的不平凡,搜遍博客贴吧,也只找到相同的问题描述,并没有大佬下场解答,也使得我在寻求解决方法的过程中没有可靠依据,只能自己摸索,自我感觉是python内核崩了。
  • 之后由于没有具体的解决办法,我只能将site.py文件替换掉尝试一下,结果没有变化。最后又将python.exe文件与pythonw.exe文件置换,结果跑出来一个错误提示框:
    找不到python38.dll,重新安装或许可以解决此问题
    之后又在网上搜到了python38.dll的安装包,安装在指定路径后,仍然什么都没发生,没解决问题。
  • 最后,由于时间有限,实在没有心情与精力和这头洪水猛兽做抗争,只能保存重要数据后把anaconda卸载重装,之后不再运行autodiff.py这个文件(最开始说到台式机与笔记本两个spyder编辑器都崩了都是在运行autodiff.py之后)。。。
    可以说没有解决问题,只是之后知道如何可以大概率规避这个问题。这并不是一个好的结束。

心得体会

  • 见识到了奇葩的错误能有多奇葩,独立解决问题的能力确实不太行。
  • 因为之前一直钻在数据驱动推导控制方程的小框架中,没有思考过实现了之后要往哪里走(毕竟机器学习那么广那么深),借着python内核崩了的契机仔细思考了未来短时间科研的指向,虽然没有特别明确的计划,但还是思考出了一点东西,可以之后有进展了分享一下。

小插曲

关于traceback

其实在网上有许多和本篇所讲问题相似的问题,最多的一个是关于history_path的问题,打开history_path这个文件可以看到操作python的历史记录,可能中间有不和谐的字符,删掉就能解决问题,操作起来比本篇问题简单的多。

小尝试

可能很多朋友好奇什么代码能把python内核跑崩,其实这个我也很迷,因为检查了很多次,没有错误语法,都是简单应用,怎么就能跑崩了呢,下面贴出来这个代码(autodiff.py文件),各位大佬可以帮忙看一下可能的解决方法^_^。

# -*- coding: utf-8 -*-
"""
Created on Sun Oct 11 18:35:59 2020

@author: DELL
"""
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
directory='H:\\anaconda\\code'

class Net(nn.Module):   # ae(s)=a
    def __init__(self,i_dim,o_dim):
        super(Net,self).__init__()
        self.fc1 = nn.Linear(i_dim,20)
        self.fc1.weight.data.uniform_(-1,1) # initialization
#        self.BN1=nn.BatchNorm1d(400,eps=1e-5,momentum=0.1)
        self.fc2 = nn.Linear(20,15)
        self.fc2.weight.data.uniform_(-1,1)
#        self.BN2=nn.BatchNorm1d(300,eps=1e-5,momentum=0.1)
        self.fc3 = nn.Linear(15,10)
        self.fc3.weight.data.uniform_(-1,1)
##        self.BN3=nn.BatchNorm1d(200,eps=1e-5,momentum=0.1)
        self.out=nn.Linear(10,o_dim)
        self.out.weight.data.uniform_(-1,1)
        # initialization
    def forward(self,x):
        x = self.fc1(x)
        x = F.relu(x)
        x=F.relu(self.fc2(x))
        
        x=F.relu(self.fc3(x))
        x = self.out(x)
        return x

def save(net):
    torch.save(net.state_dict(),directory+'net.pth')
    print('model has been saved...')
def load(net):
    net.load_state_dict(torch.load(directory+'net.pth'))
    print('model has been loaded...')

steps = 65
n = 64
m = 64

W = np.loadtxt('w.dat')   # vorticity
U = np.loadtxt('u.dat')   # x-component of velocity
V = np.loadtxt('v.dat')      # y-component of velocity

Wn=np.zeros([m*n,steps])
Un=np.zeros([m*n,steps])
Vn=np.zeros([m*n,steps])


for i in range(steps):
    Wn[:,i]=W[:,1*i]
    Un[:,i]=U[:,1*i]
    Vn[:,i]=V[:,1*i]

Wn=Wn.reshape(n,m,steps)
Un=Un.reshape(n,m,steps)
Vn=Vn.reshape(n,m,steps)

valid_data = []
for i in range(n):
    for j in range(m):
        for k in range(steps):
            a = np.array([Wn[i,j,k],Un[i,j,k],Vn[i,j,k]])
            valid_data.append(a)
valid_data = torch.tensor(valid_data,dtype = torch.float32)/2   

net = Net(3,3)
train_data = []
for i in range(n):
    for j in range(m):
        for k in range(steps):
            a = np.array([i,j,k])
            train_data.append(a)
train_data = torch.tensor(train_data,dtype = torch.float32)/64

optimizer = torch.optim.Adam(net.parameters(), lr=0.15)  # 传入 net 的所有参数, 学习率
loss_func = torch.nn.MSELoss()
print(train_data,valid_data,train_data.type,valid_data.type)
for t in range(100):
    prediction = net(train_data)     # 喂给 net 训练数据 x, 输出预测值

    loss = loss_func(prediction, valid_data)     # 计算两者的误差
    if t%10 == 0:
            print(loss.item())


    optimizer.zero_grad()   # 清空上一步的残余更新参数值
    loss.backward()         # 误差反向传播, 计算参数更新值
    optimizer.step()  

save(net)

其中的w、u、v都是大小为[64*64,65]的矩阵,自己生成就好,同时把directory改为自己电脑的路径,再安装一个CPU版本的pytorch,就能运行了。
希望有大佬可以给我指点迷津!不胜感激!!!

以上如有侵权内容,请及时联系本人,谢谢!

你可能感兴趣的:(BUG,python,bug,debug,深度学习)