Neural network 在Pytorch培训RNN

Neural network 在Pytorch培训RNN,neural-network,recurrent-neural-network,pytorch,rnn,Neural Network,Recurrent Neural Network,Pytorch,Rnn,我想有一个RNN模型,并教它学习从“hihell”生成“ihello”。我是Pytorch的新手,按照视频中的说明编写代码。 我已经编写了两个python文件,分别名为train.py和model.py。 这是model.py: #----------------向ihello教授hihell的模型 #-----------------我们的模型--------------------- 进口火炬 导入torch.nn作为nn 从火炬进口自动广告 类模型(nn.Module): 定义初始化(自)

我想有一个RNN模型,并教它学习从“hihell”生成“ihello”。我是Pytorch的新手,按照视频中的说明编写代码。 我已经编写了两个python文件,分别名为
train.py
model.py
。 这是
model.py

#----------------向ihello教授hihell的模型
#-----------------我们的模型---------------------
进口火炬
导入torch.nn作为nn
从火炬进口自动广告
类模型(nn.Module):
定义初始化(自):
超级(模型,自我)。\uuuu初始化
self.rnn=nn.rnn(input\u size=input\u size,hidden\u size=hidden\u size,batch\u first=True)
def forward(自身、x、隐藏):
#重塑输入(批次大小、序列长度、输入大小)
x=x.view(批次大小、序列长度、输入大小)
#通过RNN传播输入
#输入:(批次,序号+长度,输入大小)
out,hidden=self.rnn(x,hidden)
out=out.view(-1,num\u类)
返回隐藏,退出
def init_隐藏(自):
#初始化隐藏和单元格状态
#(层数*层数方向、批次、隐藏大小)
返回autograd.Variable(torch.zero(层数、批次大小、隐藏大小))
这是
train.py

“”-----------------培训将rnn教给hihell教给ihello------------------------------------------------
#-----------------数据准备---------------------
#进口
进口火炬
导入torch.nn作为nn
从火炬进口自动广告
从模型导入模型
导入系统
idx2char=['h','i','e','l','o']
#教hihell->ihello
x#u数据=[0,1,0,2,3,3]#hihell
y#u数据=[1,0,2,3,3,4]#ihello
一个热查找=[[1,0,0,0,0],#0
[0,1,0,0,0],#1
[0,0,1,0,0],#2
[0,0,0,1,0],#3
[0,0,0,0,1]]#4
x_one_hot=[x_数据中x的one_hot_查找[x]
输入=自动加载变量(火炬张量(x_one_hot))
标签=自动标签变量(火炬长传感器(y_数据))
“”--------参数初始化------------------“”
num_classes=5
输入尺寸=5#一个热尺寸
隐藏的_大小=5#从LSTM输出直接预测onr热
批次大小=1#一个序列
序列长度=1#让我们一个接一个地做
层数=1#一层RNN
“”------------------损失和培训------------------”
#实例化RNN模型
模型=模型()
#设置损失和优化器功能
#CrossEntropyLoss=LogSoftmax+NLLLOSS
标准=torch.nn.CrossEntropyLoss()
optimizer=torch.optim.Adam(model.parameters(),lr=0.1)
“”------------------培训模型-----------------“”
对于范围内的历元(100):
optimizer.zero_grad()
损失=0
hidden=model.init_hidden()
sys.stdout.write(“预测字符串:”)
对于输入,在zip中添加标签(输入,标签):
#打印(input.size(),label.size())
隐藏,输出=模型(输入,隐藏)
val,idx=输出最大值(1)
sys.stdout.write(idx2char[idx.data[0]]
损失+=标准(输出、标签)
打印(“,历元:%d,损失:%1.3f”%(历元+1,损失。数据[0]))
loss.backward()
optimizer.step()
当我运行
train.py
时,我收到以下错误:

self.rnn=nn.rnn(input\u size=input\u size,hidden\u size=hidden\u size,batch\u first=True) 名称错误:未定义名称“输入大小”


我不知道为什么会收到此错误,因为我的代码的上面几行中有
input\u size=5
。有人能帮我吗?谢谢。

train.py
num\u classes
input\u size
,…)中定义的变量范围是
train.py
本身。它们仅在此文件中可见。
model.py
忽略了这些。 我建议在构造函数中包含以下参数:

class Model(nn.Module):
  def __init__(self, hidden_size, input_size):
    # same
然后将模型称为:

model = Model(hidden_size, input_size)

类似地,对于您在
train.py
中定义的其他变量(并且希望在
model.py
中使用它们),您必须将它们作为参数传递给各自的函数或构造函数,并将它们存储为属性。

train.py
中定义的变量范围(
num_classes
input_size
,…)是
train.py
本身。它们仅在此文件中可见。
model.py
对这些内容不起作用。 我建议在构造函数中包含以下参数:

class Model(nn.Module):
  def __init__(self, hidden_size, input_size):
    # same
然后将模型称为:

model = Model(hidden_size, input_size)
类似地,对于在
train.py
中定义的其他变量(并且希望在
model.py
中使用它们),您必须将它们作为参数传递给各自的函数或构造函数,并将它们作为属性存储