前提・実現したいこと
Pytorch初心者です。ニューラルネットワークを用いて入力したデータを1と0に分類し、その入力した値と一緒に出力する、というプログラムを作成したいと考えています。
現在入力した値から0と1に分類し出力するところまでは作成したのですが、エラーが出てしまいどのように対処すれば良いのかわからない状態です。
Anacondaにpytorch19という環境を作っており、そこで実行を行いました。また、今回作成したニューラルネットワークのプログラムNN_classification.pyは Tokyo/PycharmProjectsに入っていて、環境のpytorch19もこのTokyoファイル内のanaconda3に入っています。
発生した問題、エラーメッセージ
Pycharm Community Edition にて作成したニューラルネットワークのプログラムを実行したところ、以下のようなエラーが出てしまいます。
Python
C:\Users\Tokyo\anaconda3\envs\pytorch19\python.exe C:/Users/Tokyo/PycharmProjects/Su/NN_classification.py Traceback (most recent call last): File "C:/Users/Tokyo/PycharmProjects/Su/NN_classification.py", line 2, in <module> import torch File "C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\torch\__init__.py", line 629, in <module> from .functional import * # noqa: F403 File "C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\torch\functional.py", line 6, in <module> import torch.nn.functional as F File "C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\torch\nn\__init__.py", line 50 ^ SyntaxError: unexpected EOF while parsing Process finished with exit code 1
ターミナルにて以下のコマンドを入力してもこのようなエラーが出る状態です。
Pytorch
PS C:\Users\Tokyo\PycharmProjects\Su> import torch import : 用語 'import' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パ スが含まれている場合はそのパスが正しいことを確認してから、再試行してください。 発生場所 行:1 文字:1 + import torch + ~~~~~~ + CategoryInfo : ObjectNotFound: (import:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException PS C:\Users\Tokyo\PycharmProjects\SuNN> print(torch.__version__) torch.__version__ : 用語 'torch.__version__' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述され ていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。 発生場所 行:1 文字:7 + print(torch.__version__) + ~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (torch.__version__:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
該当のソースコード
Pytorch
import time import torch import pandas as pd import numpy as np import csv # データサイズ(I行J列) DATA_SIZE_I = 11 DATA_SIZE_J = 11 # ファイルパス TRAIN_CSV_PATH = r"C:\Users\Tokyo.vscode\su\train_data_noise.csv" VALIDATION_CSV_PATH = r"C:\Users\Tokyo.vscode\su\validation_data_noise.csv" TEST_CSV_PATH = r"C:\Users\Tokyo.vscode\su\test_data_noise.csv" OUTPUT_CSV_PATH = 'result_noise.csv' LOSS_CSV_PATH = '.result_losses.csv' # ハイパーパラメータ EPOCHS = 10 BATCH = 100 lr = 1.0e-4 NODE_NUM = DATA_SIZE_I*DATA_SIZE_J class BGS(torch.utils.data.Dataset): def __init__(self, csv_path): df = pd.read_csv(csv_path, header=0, dtype='float') data = df.iloc[:, 1:].values data = data_transform(data) self.data = torch.tensor(data, dtype=torch.float32) labels = df.iloc[:, 0].values self.labels = torch.tensor(labels, dtype=torch.long) def __len__(self): return len(self.data) def __getitem__(self, index): return self.data[index], self.labels[index] class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = torch.nn.Linear(DATA_SIZE_I*DATA_SIZE_J, NODE_NUM*5) self.fc2 = torch.nn.Linear(NODE_NUM*5, NODE_NUM) self.fc3 = torch.nn.Linear(NODE_NUM, 2) def forward(self, x): x = self.fc1(x) x = torch.nn.functional.relu(x) x = self.fc2(x) x = torch.nn.functional.relu(x) x = self.fc3(x) x = torch.nn.functional.softmax(x, dim=1) return x def data_transform(x): return (x - np.mean(x, axis=1, keepdims=True)) / np.std(x, axis=1, ddof=1, keepdims=True) # 学習用関数 def train(train_loader, model, optimizer, criterion, device, num_epochs, epoch, losses): model.train() # モデルを学習モードに変更 train_loss = 0 train_acc = 0 i = 0 for i, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() # 勾配を初期化 output = model(data) # 順伝播の計算 loss = criterion(output, target) # 誤差を計算 train_loss += float(loss.item()) preds = torch.max(output, 1)[1] train_acc += torch.sum(preds == target).item() / len(target) loss.backward() # 誤差を逆伝播させる optimizer.step() # 重みを更新する losses.append(train_loss) print('#train_epoch: [{}/{}], Loss: {}, acc: {}'.format(epoch + 1, num_epochs, train_loss / (i+1), train_acc / (i+1)), end=' ') def validation(validation_loader, model, criterion, device, num_epochs, epoch, losses): model.eval() # モデルを推論モードに変更 val_loss = 0 val_acc = 0 i = 0 with torch.no_grad(): for i, (data, target) in enumerate(validation_loader): data, target = data.to(device), target.to(device) output = model(data) loss = criterion(output, target) # 誤差を計算 val_loss += float(loss.item()) preds = torch.max(output, 1)[1] val_acc += torch.sum(preds == target).item() / len(target) losses.append(val_loss) print('#val_epoch: [{}/{}], Loss: {}, acc: {}'.format(epoch + 1, num_epochs, val_loss / (i+1), val_acc / (i+1))) def test(test_loader, model, device): model.eval() # モデルを推論モードに変更 with torch.no_grad(): for i, (data, target) in enumerate(test_loader): data, target = data.to(device), target.to(device) output = model(data) preds = torch.max(output, 1)[1] accuracy = torch.sum(preds == target).item() / len(target) target, preds = target.cpu().numpy(), preds.cpu().numpy() target, preds = pd.DataFrame(target), pd.DataFrame(preds) df = pd.concat([target, preds], axis=1) with open(OUTPUT_CSV_PATH, 'w', newline='') as file: writer = csv.writer(file) writer.writerow(['accuracy', '{}'.format(accuracy)]) writer.writerow(['labels', 'predict']) df.to_csv(OUTPUT_CSV_PATH, mode='a', header=False, index=False) def main(): # 1. GPUの設定(PyTorchでは明示的に指定する必要がある) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') print(device) # 3. データセットを取得 train_data = BGS(TRAIN_CSV_PATH) validation_data = BGS(VALIDATION_CSV_PATH) test_data = BGS(TEST_CSV_PATH) # 4. DataLoaderの作成 train_loader = torch.utils.data.DataLoader(train_data, batch_size=BATCH, shuffle=True, num_workers=2) validation_loader = torch.utils.data.DataLoader(validation_data, batch_size=BATCH, shuffle=False) test_loader = torch.utils.data.DataLoader(test_data, batch_size=test_data.__len__(), shuffle=False) # 5. モデル作成 torch.manual_seed(0) model = Net().to(device) # 6. 損失関数を定義 criterion = torch.nn.CrossEntropyLoss() # 7. 最適化手法を定義 optimizer = torch.optim.Adam(model.parameters(), lr=lr) # 8. 出力用ファイル作成 train_losses = [] # train_accuracy = [] validation_losses = [] # validation_accuracy = [] # 9. 学習(エポック終了時点ごとにテスト用データで評価) start = time.time() for epoch in range(EPOCHS): train(train_loader, model, optimizer, criterion, device, EPOCHS, epoch, train_losses) validation(validation_loader, model, criterion, device, EPOCHS, epoch, validation_losses) test(test_loader, model, device) process_time = time.time() - start print("process_time:{0}".format(process_time) + "[sec]") # train_losses, validation_losses = pd.DataFrame(train_losses), pd.DataFrame(validation_losses) # df_losses = pd.concat([train_losses/1000, validation_losses/100], axis=1) # df_losses.to_csv(LOSS_CSV_PATH, mode='a', header=False, index=False) if __name__ == '__main__': main()
エラーがありそうなコードも以下に載せさせていただきます。
Pytorch
# C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\torch\__init__.py . . . ################################################################################ # Import interface functions defined in Python ################################################################################ # needs to be after the above ATen bindings so we can overwrite from Python side from .functional import * # noqa: F403 . . .
Pytorch
# C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\torch\functional.py from typing import ( Tuple, Optional, Union, Any, Sequence, TYPE_CHECKING ) import torch import torch.nn.functional as F from torch.types import _size from ._lowrank import svd_lowrank, pca_lowrank from .overrides import ( has_torch_function, has_torch_function_unary, has_torch_function_variadic, handle_torch_function) from ._jit_internal import boolean_dispatch, List from ._jit_internal import _overload as overload from torch._autograd_functions import _LU . . .
Pytorch
# C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\torch\nn\__init__.py . . def functional():
行ったこと、補足
Pythonを起動し、ニューラルネットワークのプログラムでtorch.nn.functionalをそのまま書いていたため as F の部分を削除し import torch を入力したところ、以下のようなエラーが出ました。
Pytorch
>>> import torch Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\torch\__init__.py", line 229, in <module> __all__ += [name for name in dir(_C) NameError: name '_C' is not defined
anacondaで行っていることは分かっているのですが、バージョンなどの確認方法も分からない状態です。情報が少なく大変申し訳ありませんが、ご助言をいただけると幸いです。宜しくお願い致します。
まだ回答がついていません
会員登録して回答してみよう