autodiff.py
),过程中无报错,且无提醒对话框,便在最后关掉了Spyder。autodiff.py
代码移植到笔记本上想进行进一步训练(开始出现问题的是台式机,安装的是Anaconda3.5,笔记本上安装的是最新的2020.07),过程也无报错,但期间一直出现anaconda internal problem(error)
的窗口提示,还让我发错误相关信息到Spyder官方进行问题解决。但是当时没有重视,以为是什么效果反馈,这里贴出一张比较像但不是当时的完整结果的窗口图:UnicodeDecodeError
,翻译一下就是解码到unicode
模式时出现错误,用的是gbk
解码器。这在我们平时使用python读入文件时是一个常见的错误,因此我就先按照处理读文件出错时的那套思路进行修复。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.
(错误中间的说明有点忘了,但结构是这样的)。这样一来gbk
与utf-8
两大解码神器都没有起到效果,只能另辟他径。
position 64
处的byte 0x80
无法被解码,那我们是不是找到这个字节并且修改或删除掉就可以解决这个问题,之后我就在site.py
文件、我写的autodiff.py
文件中寻找可能存在问题的字节。经过相当多次的尝试,最后并没有用。。。site
模块失败。site.py
文件替换掉尝试一下,结果没有变化。最后又将python.exe
文件与pythonw.exe
文件置换,结果跑出来一个错误提示框:找不到python38.dll,重新安装或许可以解决此问题
python38.dll
的安装包,安装在指定路径后,仍然什么都没发生,没解决问题。autodiff.py
这个文件(最开始说到台式机与笔记本两个spyder编辑器都崩了都是在运行autodiff.py
之后)。。。其实在网上有许多和本篇所讲问题相似的问题,最多的一个是关于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,就能运行了。
希望有大佬可以给我指点迷津!不胜感激!!!
以上如有侵权内容,请及时联系本人,谢谢!