前提・実現したいこと
Python、Pytorch初心者です。
入力されたデータセットを0又は1に分類して、csvファイルに結果を書き込むというプログラムを作成しました。
ですが、実行してみたところ以下のようなエラーが出てしまい、どう対処すれば良いか分かりません。
また、csvファイルへ実際に入力された数値も一緒に書き込みたいのですが、どこにどのようなコードを書き加えれば良いか分からない状態です。
anacondaでpytorch19という環境を構築し、その中で実行などを行なっています。
情報が少なく申し訳ありません。ご助言をいただけると幸いです。よろしくお願いいたします。
該当するソースコード(classification.py)
Python
1 2import time 3import torch 4import pandas as pd 5import numpy as np 6import csv 7 8# データサイズ(I行J列) 9DATA_SIZE_I = 11 10DATA_SIZE_J = 11 11 12# ファイルパス 13TRAIN_CSV_PATH = r"C:\Users\Tokyo.vscode\sug\train_data_noise.csv" 14VALIDATION_CSV_PATH = r"C:\Users\Tokyo.vscode\sug\validation_data_noise.csv" 15TEST_CSV_PATH = r"C:\Users\Tokyo.vscode\sug\test_data_noise.csv" 16OUTPUT_CSV_PATH = 'result_noise.csv' 17LOSS_CSV_PATH = '.result_losses.csv' 18 19# ハイパーパラメータ 20EPOCHS = 10 21BATCH = 100 22lr = 1.0e-4 23NODE_NUM = DATA_SIZE_I*DATA_SIZE_J 24 25 26class BGS(torch.utils.data.Dataset): 27 28 def __init__(self, csv_path): 29 df = pd.read_csv(csv_path, header=0, dtype='float') 30 data = df.iloc[:, 1:].values 31 data = data_transform(data) 32 self.data = torch.tensor(data, dtype=torch.float32) 33 labels = df.iloc[:, 0].values 34 self.labels = torch.tensor(labels, dtype=torch.long) 35 36 def __len__(self): 37 return len(self.data) 38 39 def __getitem__(self, index): 40 return self.data[index], self.labels[index] 41 42 43class Net(torch.nn.Module): 44 def __init__(self): 45 super(Net, self).__init__() 46 self.fc1 = torch.nn.Linear(DATA_SIZE_I*DATA_SIZE_J, NODE_NUM*5) 47 self.fc2 = torch.nn.Linear(NODE_NUM*5, NODE_NUM) 48 self.fc3 = torch.nn.Linear(NODE_NUM, 2) 49 50 def forward(self, x): 51 x = self.fc1(x) 52 x = torch.nn.functional.relu(x) 53 x = self.fc2(x) 54 x = torch.nn.functional.relu(x) 55 x = self.fc3(x) 56 x = torch.nn.functional.softmax(x, dim=1) 57 return x 58 59 60def data_transform(x): 61 return (x - np.mean(x, axis=1, keepdims=True)) / np.std(x, axis=1, ddof=1, keepdims=True) 62 63 64# 学習用関数 65def train(train_loader, model, optimizer, criterion, device, num_epochs, epoch, losses): 66 model.train() # モデルを学習モードに変更 67 train_loss = 0 68 train_acc = 0 69 i = 0 70 for i, (data, target) in enumerate(train_loader): 71 data, target = data.to(device), target.to(device) 72 optimizer.zero_grad() # 勾配を初期化 73 output = model(data) # 順伝播の計算 74 loss = criterion(output, target) # 誤差を計算 75 train_loss += float(loss.item()) 76 preds = torch.max(output, 1)[1] 77 train_acc += torch.sum(preds == target).item() / len(target) 78 loss.backward() # 誤差を逆伝播させる 79 optimizer.step() # 重みを更新する 80 losses.append(train_loss) 81 print('#train_epoch: [{}/{}], Loss: {}, acc: {}'.format(epoch + 1, num_epochs, train_loss / (i+1), train_acc / (i+1)), end=' ') 82 83 84def validation(validation_loader, model, criterion, device, num_epochs, epoch, losses): 85 model.eval() # モデルを推論モードに変更 86 val_loss = 0 87 val_acc = 0 88 i = 0 89 with torch.no_grad(): 90 for i, (data, target) in enumerate(validation_loader): 91 data, target = data.to(device), target.to(device) 92 output = model(data) 93 loss = criterion(output, target) # 誤差を計算 94 val_loss += float(loss.item()) 95 preds = torch.max(output, 1)[1] 96 val_acc += torch.sum(preds == target).item() / len(target) 97 losses.append(val_loss) 98 print('#val_epoch: [{}/{}], Loss: {}, acc: {}'.format(epoch + 1, num_epochs, val_loss / (i+1), val_acc / (i+1))) 99 100 101def test(test_loader, model, device): 102 model.eval() # モデルを推論モードに変更 103 with torch.no_grad(): 104 for i, (data, target) in enumerate(test_loader): 105 data, target = data.to(device), target.to(device) 106 output = model(data) 107 preds = torch.max(output, 1)[1] 108 accuracy = torch.sum(preds == target).item() / len(target) 109 target, preds = target.cpu().numpy(), preds.cpu().numpy() 110 target, preds = pd.DataFrame(target), pd.DataFrame(preds) 111 df = pd.concat([target, preds], axis=1) 112 with open(OUTPUT_CSV_PATH, 'w', newline='') as file: 113 writer = csv.writer(file) 114 writer.writerow(['accuracy', '{}'.format(accuracy)]) 115 writer.writerow(['labels', 'predict']) 116 df.to_csv(OUTPUT_CSV_PATH, mode='a', header=False, index=False) 117 118 119def main(): 120 # 1. GPUの設定(PyTorchでは明示的に指定する必要がある) 121 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') 122 print(device) 123 124 # 3. データセットを取得 125 train_data = BGS(TRAIN_CSV_PATH) 126 validation_data = BGS(VALIDATION_CSV_PATH) 127 test_data = BGS(TEST_CSV_PATH) 128 129 # 4. DataLoaderの作成 130 train_loader = torch.utils.data.DataLoader(train_data, batch_size=BATCH, shuffle=True, num_workers=2) 131 validation_loader = torch.utils.data.DataLoader(validation_data, batch_size=BATCH, shuffle=False) 132 test_loader = torch.utils.data.DataLoader(test_data, batch_size=test_data.__len__(), shuffle=False) 133 134 # 5. モデル作成 135 torch.manual_seed(0) 136 model = Net().to(device) 137 138 # 6. 損失関数を定義 139 criterion = torch.nn.CrossEntropyLoss() 140 141 # 7. 最適化手法を定義 142 optimizer = torch.optim.Adam(model.parameters(), lr=lr) 143 144 # 8. 出力用ファイル作成 145 train_losses = [] 146 # train_accuracy = [] 147 validation_losses = [] 148 # validation_accuracy = [] 149 150 # 9. 学習(エポック終了時点ごとにテスト用データで評価) 151 start = time.time() 152 for epoch in range(EPOCHS): 153 train(train_loader, model, optimizer, criterion, device, EPOCHS, epoch, train_losses) 154 validation(validation_loader, model, criterion, device, EPOCHS, epoch, validation_losses) 155 test(test_loader, model, device) 156 process_time = time.time() - start 157 print("process_time:{0}".format(process_time) + "[sec]") 158 # train_losses, validation_losses = pd.DataFrame(train_losses), pd.DataFrame(validation_losses) 159 # df_losses = pd.concat([train_losses/1000, validation_losses/100], axis=1) 160 # df_losses.to_csv(LOSS_CSV_PATH, mode='a', header=False, index=False) 161 162 163if __name__ == '__main__': 164 main() 165
発生したエラーメッセージ
Python
1 2PS C:\Users\Tokyo\PycharmProjects\SugNN> python classification.py 3cuda 4Traceback (most recent call last): 5 File "pandas\_libs\parsers.pyx", line 1050, in pandas._libs.parsers.TextReader._convert_tokens 6TypeError: Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe' 7 8During handling of the above exception, another exception occurred: 9 10Traceback (most recent call last): 11 File "classification.py", line 163, in <module> 12 main() 13 File "classification.py", line 124, in main 14 train_data = BGS(TRAIN_CSV_PATH) 15 File "classification.py", line 28, in __init__ 16 df = pd.read_csv(csv_path, header=0, dtype='float') 17 File "C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\pandas\io\parsers.py", line 610, in read_csv 18 return _read(filepath_or_buffer, kwds) 19 File "C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\pandas\io\parsers.py", line 468, in _read 20 return parser.read(nrows) 21 File "C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\pandas\io\parsers.py", line 1057, in read 22 index, columns, col_dict = self._engine.read(nrows) 23 File "C:\Users\Tokyo\anaconda3\envs\pytorch19\lib\site-packages\pandas\io\parsers.py", line 2061, in read 24 data = self._reader.read(nrows) 25 File "pandas\_libs\parsers.pyx", line 756, in pandas._libs.parsers.TextReader.read 26 File "pandas\_libs\parsers.pyx", line 771, in pandas._libs.parsers.TextReader._read_low_memory 27 File "pandas\_libs\parsers.pyx", line 850, in pandas._libs.parsers.TextReader._read_rows 28 File "pandas\_libs\parsers.pyx", line 982, in pandas._libs.parsers.TextReader._convert_column_data 29 File "pandas\_libs\parsers.pyx", line 1056, in pandas._libs.parsers.TextReader._convert_tokens 30ValueError: could not convert string to float: ' 0.5185022.336320e-001' 31 32
試したこと
はじめのエラーが関数がfloat64でなくObjectとして捉えられているということだと考えたのですが、それをどのように確認するかが分からない状態です。
補足情報(FW/ツールのバージョンなど)
Python3.8の中の自作の環境pytorch19で行っています。
該当のプログラムはTokyoというディレクトリ内にあります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/11/14 10:55