Pytorch:十二的作業(yè)


用LSTM來做下那個預(yù)測問題

LSTM要初始化的參數(shù):input_size,hidden_size,num_layers,batch_first

import torch

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.emb = torch.nn.Embedding(input_size, embedding_size)
        self.lstm = torch.nn.LSTM(input_size=embedding_size
                                ,hidden_size=hidden_size
                                ,num_layers=num_layers
                                ,batch_first=True)
        self.fc = torch.nn.Linear(hidden_size, num_class)

    def forward(self, x):
        hidden = torch.zeros(num_layers, x.size(0), hidden_size)
        # 因為LSTM輸入限制,要多弄一個c的輸入,和hidden一起放進去
        c = torch.zeros(num_layers, x.size(0), hidden_size)
        x = self.emb(x) #這樣就可以變成稠密的向量
        x, _ = self.lstm(x, (hidden, c))
        x = self.fc(x)
        return x.view(-1,num_class)

#一堆參數(shù)
num_class = 4
input_size = 4
hidden_size = 8
embedding_size = 10
num_layers = 2
batch_size = 1
seq_len = 5

#準(zhǔn)備數(shù)據(jù)
idx2char = ['e', 'h', 'l', 'o']
x_data = [[1, 0, 2, 2, 3]] # (batch, seq_len)
y_data = [3, 1, 2, 3, 2] # (batch * seq_len)

inputs = torch.LongTensor(x_data).view(batch_size, seq_len)
labels = torch.LongTensor(y_data)

#實例化模型并構(gòu)造損失函數(shù)和優(yōu)化器
net = Model()

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.05)

#訓(xùn)練
for epoch in range(20):
    optimizer.zero_grad()
    outputs = net(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()

    _, idx = outputs.max(dim=1)
    idx = idx.data.numpy()
    print('Predicted string:', ''.join([idx2char[x] for x in idx]), end='')
    print(', Epoch[%d/20] loss=%.4f' % (epoch+1, loss.item()))

注意,LSTM的輸入是input,(h_0,c_0),所以要再多弄一個c_0


用GRU做

GRU要初始化的參數(shù):input_size,hidden_size

import torch

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.emb = torch.nn.Embedding(input_size, embedding_size)
        self.gru = torch.nn.GRU(embedding_size, hidden_size)
        self.fc = torch.nn.Linear(hidden_size, num_class)

    def forward(self, x):
        hidden = torch.zeros(num_layers, x.size(1), hidden_size)
        x = self.emb(x)
        x, _ = self.gru(x, hidden)
        x = self.fc(x)
        return x.view(-1, num_class)

num_class = 4
input_size = 4
hidden_size = 8
embedding_size = 10
num_layers = 1
batch_size = 1
seq_len = 5

idx2char = ['e', 'h', 'l', 'o']
x_data = [1, 0, 2, 2, 3] 
y_data = [3, 1, 2, 3, 2] 

inputs = torch.LongTensor(x_data).view(batch_size, seq_len)
labels = torch.LongTensor(y_data)

net = Model()

criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.05)

for epoch in range(20):
    optimizer.zero_grad()
    outputs = net(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()

    _, idx = outputs.max(dim=1)
    idx = idx.data.numpy()
    print('Predicted string:', ''.join([idx2char[x] for x in idx]), end='')
    print(', Epoch[%d/20] loss=%.4f' % (epoch+1, loss.item()))

這里不知道為啥要改成x.size(1),而且最后的結(jié)果都不是想要的結(jié)果。。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容