下記の関数を実行するとタイトルのエラーが発生します。Google collabo使用中はエラーが発生しなかったのですJupitor Notebookで同一の内容を実行するとエラーが発生します。ライブラリー等のバージョンの違いからでしょうか。
何かアドバイスを頂けますと幸いでございます。
def train_model(model, criterion, optimizer, scheduler, num_epochs):
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
since = time.time()
best_model_wts = copy.deepcopy(model.state_dict()) best_acc = 0.0 #エポックごとの正解率、損失関数情報取得 acc_history_ft = {'train': [], 'valid': []} loss_history_ft= {'train': [], 'valid': []} #エポックループ for epoch in range(num_epochs): print('Epoch {}/{}'.format(epoch, num_epochs - 1)) print('-' * 10) #それぞれのエポックで訓練データで訓練→検証データで検証 for phase in ['train', 'valid']: if phase == 'train': model.train() # モデルを訓練モードに else: model.eval() # モデルを検証モードに #各種変数の初期化 running_loss = 0.0 running_corrects = 0 #データローダーからミニバッチを読み込むループ for inputs, labels in dataloaders[phase]: inputs = inputs.to(device) labels = labels.to(device) #勾配を初期化 optimizer.zero_grad() #順伝播 #※1:訓練データの時はテンソルの勾配を求める with torch.set_grad_enabled(phase == 'train'): outputs = model(inputs) _, preds = torch.max(outputs, 1) loss = criterion(outputs, labels) #訓練データの時に逆伝播+重みの更新を行う if phase == 'train': loss.backward() optimizer.step() #損失等を計算する running_loss += loss.item() * inputs.size(0) running_corrects += torch.sum(preds == labels.data) #学習率の更新を行う if phase == 'train': scheduler.step() epoch_loss = running_loss / dataset_sizes[phase] epoch_acc = running_corrects.double() / dataset_sizes[phase] #エポックごとの正解率、損失関数情報取得 acc_history_ft[phase].append(epoch_acc) loss_history_ft[phase].append(epoch_loss) print('{} Loss: {:.4f} Acc: {:.4f}'.format( phase, epoch_loss, epoch_acc)) #検証データで精度が以前より高ければモデルをdeepcopyする if phase == 'valid' and epoch_acc > best_acc: #ベストの精度を更新 best_acc = epoch_acc #モデルのコピーを保存して「best_model_wts」に格納 best_model_wts = copy.deepcopy(model.state_dict()) print() #1エポック終了毎の表示 time_elapsed = time.time() - since print('Training complete in {:.0f}m {:.0f}s'.format( time_elapsed // 60, time_elapsed % 60)) print('Best val Acc: {:4f}'.format(best_acc)) # Accuracyのグラフ plt.figure() plt.plot(range(num_epochs), acc_history_ft['train'], color='blue', linestyle='-', label='train_acc') plt.plot(range(num_epochs), acc_history_ft['valid'], color='green', linestyle='--', label='val_acc') plt.legend() plt.xlabel('epoch') plt.ylabel('acc') plt.title('Training and validation accuracy') plt.grid() # Lossのグラフ plt.figure() plt.plot(range(num_epochs), loss_history_ft['train'], color='blue', linestyle='-', label='train_loss') plt.plot(range(num_epochs), loss_history_ft['valid'], color='green', linestyle='--', label='val_loss') plt.legend() plt.xlabel('epoch') plt.ylabel('loss') plt.title('Training and validation loss') plt.grid() #最も良いモデルを読みだして返す model.load_state_dict(best_model_wts) return model
回答1件
あなたの回答
tips
プレビュー