質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.32%

pytorchを使ってみたいです

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 551
退会済みユーザー

退会済みユーザー

チュートリアルの例文を少し書き換える形で初めてpytorchを使ってみたのですが、思ったような結果が得られないので質問させていただくことにしました。

tfidfVectorizerを使って文章をベクトル化したものを使って2クラス分類の問題を解こうとしていて、train_vectorsはcsr_matrix形式のベクトルで、それをCSR_to_Tensorという関数でTensor型に直しています。大きさは(7613, 15269)です。
train['target']はtrainというDataFrameに含まれる目的変数です。
以下がコードになります。

# -*- coding: utf-8 -*-
import torch

# N is batch size; D_in is input dimension;
# H is hidden dimension; D_out is output dimension.
N, D_in, H, I, D_out = 7613, 15269, 1000, 100, 1

# Create random Tensors to hold inputs and outputs
x = CSR_to_Tensor(train_vectors)
y = torch.tensor(train['target'])

# Use the nn package to define our model as a sequence of layers. nn.Sequential
# is a Module which contains other Modules, and applies them in sequence to
# produce its output. Each Linear Module computes output from input using a
# linear function, and holds internal Tensors for its weight and bias.
model = torch.nn.Sequential(
    torch.nn.Linear(D_in, H),
    torch.nn.ReLU(),
    torch.nn.Linear(H, I),
    torch.nn.ReLU(),
    torch.nn.Linear(I, D_out),
)

# The nn package also contains definitions of popular loss functions; in this
# case we will use Mean Squared Error (MSE) as our loss function.
loss_fn = torch.nn.BCEWithLogitsLoss()

learning_rate = 1e-3
for t in range(100):
    # Forward pass: compute predicted y by passing x to the model. Module objects
    # override the __call__ operator so you can call them like functions. When
    # doing so you pass a Tensor of input data to the Module and it produces
    # a Tensor of output data.
    y_pred = model(x.float())
    y_pred = y_pred.reshape(len(y_pred))

    # Compute and print loss. We pass Tensors containing the predicted and true
    # values of y, and the loss function returns a Tensor containing the
    # loss.
    loss = loss_fn(y_pred, y.float())
    if t % 10 == 9:
        print(t, loss.item())

    # Zero the gradients before running the backward pass.
    model.zero_grad()

    # Backward pass: compute gradient of the loss with respect to all the learnable
    # parameters of the model. Internally, the parameters of each Module are stored
    # in Tensors with requires_grad=True, so this call will compute gradients for
    # all learnable parameters in the model.
    loss.backward()

    # Update the weights using gradient descent. Each parameter is a Tensor, so
    # we can access its gradients like we did before.
    with torch.no_grad():
        for param in model.parameters():
            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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

pytorchの使用経験がないのでぴったりの回答になりませんが、コードを見て気づいた点をコメントします。

質問の記載によるとやりたいことは2クラス分類ということですが、コスト関数に回帰で使用するMSEが用いられています。pytorchにもエントロピー誤差関数が存在すると思うのでこちらに変更するといいでしょう。
また2クラス分類の場合、最終的な出力は真値である確率です。確率は0~1の実数なので、出力層のアウトプットをsigmoid関数を使って変換する必要があります。pytorchはこのあたりを明示する必要がないのであれば問題ありませんが、確認したほうがいいでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/25 17:16

    ありがとうございます。アドバイスを参考に書き直させていただきました。

    キャンセル

  • 2020/03/25 17:28

    今のコードではBCEWithLogitsLoss()にsigmoidが含まれています。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る