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

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

新規登録して質問してみよう
ただいま回答率
85.35%
PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1836閲覧

pytorchを使ってみたいです

退会済みユーザー

退会済みユーザー

総合スコア0

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/03/24 03:40

編集2020/03/25 08:26

チュートリアルの例文を少し書き換える形で初めて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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

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

投稿2020/03/25 00:04

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/25 08:16

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

退会済みユーザー

2020/03/25 08:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問