チュートリアルの例文を少し書き換える形で初めてpytorchを使ってみたのですが、思ったような結果が得られないので質問させていただくことにしました。
tfidfVectorizerを使って文章をベクトル化したものを使って2クラス分類の問題を解こうとしていて、train_vectorsはcsr_matrix形式のベクトルで、それをCSR_to_Tensorという関数でTensor型に直しています。大きさは(7613, 15269)です。
train['target']はtrainというDataFrameに含まれる目的変数です。
以下がコードになります。
python
1# -*- coding: utf-8 -*- 2import torch 3 4# N is batch size; D_in is input dimension; 5# H is hidden dimension; D_out is output dimension. 6N, D_in, H, I, D_out = 7613, 15269, 1000, 100, 1 7 8# Create random Tensors to hold inputs and outputs 9x = CSR_to_Tensor(train_vectors) 10y = torch.tensor(train['target']) 11 12# Use the nn package to define our model as a sequence of layers. nn.Sequential 13# is a Module which contains other Modules, and applies them in sequence to 14# produce its output. Each Linear Module computes output from input using a 15# linear function, and holds internal Tensors for its weight and bias. 16model = torch.nn.Sequential( 17 torch.nn.Linear(D_in, H), 18 torch.nn.ReLU(), 19 torch.nn.Linear(H, I), 20 torch.nn.ReLU(), 21 torch.nn.Linear(I, D_out), 22) 23 24# The nn package also contains definitions of popular loss functions; in this 25# case we will use Mean Squared Error (MSE) as our loss function. 26loss_fn = torch.nn.BCEWithLogitsLoss() 27 28learning_rate = 1e-3 29for t in range(100): 30 # Forward pass: compute predicted y by passing x to the model. Module objects 31 # override the __call__ operator so you can call them like functions. When 32 # doing so you pass a Tensor of input data to the Module and it produces 33 # a Tensor of output data. 34 y_pred = model(x.float()) 35 y_pred = y_pred.reshape(len(y_pred)) 36 37 # Compute and print loss. We pass Tensors containing the predicted and true 38 # values of y, and the loss function returns a Tensor containing the 39 # loss. 40 loss = loss_fn(y_pred, y.float()) 41 if t % 10 == 9: 42 print(t, loss.item()) 43 44 # Zero the gradients before running the backward pass. 45 model.zero_grad() 46 47 # Backward pass: compute gradient of the loss with respect to all the learnable 48 # parameters of the model. Internally, the parameters of each Module are stored 49 # in Tensors with requires_grad=True, so this call will compute gradients for 50 # all learnable parameters in the model. 51 loss.backward() 52 53 # Update the weights using gradient descent. Each parameter is a Tensor, so 54 # we can access its gradients like we did before. 55 with torch.no_grad(): 56 for param in model.parameters(): 57 param -= learning_rate * param.grad
一応実行はできるのですが誤差関数の値がほとんど小さくなっていないことから学習ができていないと思われます。
その原因と解決方法を教えていただければ幸いです。
出力は以下のようになっていました。
9 0.7005422115325928
19 0.7004371285438538
29 0.7003325819969177
39 0.7002285718917847
49 0.7001250386238098
59 0.7000225186347961
69 0.6999202966690063
79 0.6998189687728882
89 0.6997179388999939
99 0.6996178030967712
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/03/25 08:16
退会済みユーザー
2020/03/25 08:28