1. ホーム
  2. Pytorch

Pytorchの高バージョン(1.0)のプログラムを実行すると、いくつかのエラーが発生します。

2022-01-22 23:06:21
<パス

Pytorch high バージョン 1.0 ランナーからのいくつかのエラー


Python 2.7 + pytorch 0.4 のソースと Python 3.5 + pytorch 1.0 の環境なので、pytorch プログラムを実行します。
多くのエラーを出しながら実行されましたが、その内容はここに記されています。

形状[1, 28, 28]のエラー出力は、放送の形状[3, 28, 28]と一致しない

解決方法 https://github.com/udacity/deep-learning-v2-pytorch/pull/151
なぜなら

Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) を実行すると、次のようなエラーが発生します。
RuntimeError: 形状 [1, 28, 28] を持つ出力は、放送の形状 [3, 28, 28] と一致しない。

に変更する必要があります。
正規化((0.5,), (0.5,))

task_generator.py の get_data_loader に存在し、以下のコメントで変更されました。

def get_data_loader(task, num_per_class=1, split='train',shuffle=True,rotation=0):
    # NOTE: batch size here is # instances PER CLASS
    #normalize = transforms.Normalize(mean=[0.92206, 0.92206, 0.92206], std=[0.08426, 0.08426, 0.08426])
    normalize = transforms.Normalize(mean=[0.92206], std=[0.08426])
    dataset = Omniglot(task,split=split,transforms=transforms.Compose([Rotate(rotation),transforms.ToTensor(),normalize]))

    if split == 'train':
        sampler = ClassBalancedSampler(num_per_class, task.num_classes, task.train_num,shuffle=shuffle)
    else:
        sampler = ClassBalancedSampler(num_per_class, task.num_classes, task.test_num,shuffle=shuffle)
    loader = DataLoader(dataset, batch_size=num_per_class*task.num_classes, sampler=sampler)

    return loader


NotADirectoryErrorというエラーです。[WinError 267] 無効なディレクトリ名です。

この無効なディレクトリ名には長い間悩まされてきました。明らかにディレクトリパスは正常で、ファイルもそこにあるのに、なぜエラーが報告されるのでしょうか?
パス情報だけが必要で、ファイルには書き込まないから問題なのだと判明しました。
https://forums.fast.ai/t/notadirectoryerror-winerror-267-the-directory-name-is-invalid-data-bts-valid-features-npy/19657

エラー スカラー型のオブジェクトを期待したが、引数#3 'index'にスカラー型のIntを得た。

Long型のスカラーオブジェクトを期待したが、引数#3 'index'にInt型のスカラーオブジェクトを得た。
omniglot_train_one_shot.py に表示され、コメントのように修正されています。

        mse = nn.MSELoss().cuda(GPU)
        one_hot_labels = Variable(torch.zeros(BATCH_NUM_PER_CLASS * CLASS_NUM, CLASS_NUM).scatter_(1, batch_labels.view(-1, 1).long(),1)).cuda( GPU)
        #one_hot_labels = Variable(torch.zeros(BATCH_NUM_PER_CLASS*CLASS_NUM, CLASS_NUM).scatter_(1, 1, batch_labels.view(-1,1))).cuda(GPU) #see scatter modification
        loss = mse(relations,one_hot_labels)


実はネットで似たような問題がいろいろ出ているのを見たのですが、わざわざ原因を調べず、ただ早く解決しようと思って30分以上無駄にしてしまいました。
問題はscatterの関数引数にある。第2引数(selfを第3引数と数える)はtensorでなければならず、それが含む要素型はLongでなければならないが、元のプログラムではIntであった。
型変換を行うには https://ptorch.com/news/71.html

スキャッターコードを投稿してください。

	def scatter(self, dim, index, source): ...

    @overload
    def scatter_(self, dim: int, index: 'Tensor', src: 'Tensor') -> 'Tensor': ...

    @overload #!!! It's this overload, you can see that the index is in tensor format, but the code requires the elements within it to be Long
    def scatter_(self, dim: int, index: 'Tensor', value: float) -> 'Tensor': ...


Error RuntimeError: バックエンドCUDAのオブジェクトを期待したが、引数#2 'other'のバックエンドCPUを得た。

これは前回のものとよく似ていて、非常に紛らわしいです。

問題なのは

rewards = [1 if predict_labels[j]==test_labels[j] else 0 for j in range(CLASS_NUM)]


predict_labels と test_labels に問題があるので、デバッグの際にその値を確認してください。

predict_labels[j] = tensor([4, 0, 3, 1, 2], device='cuda:0')
test_labels[j] = tensor([4, 0, 3, 1, 2], dtype=torch.int32)


この2つは等しくなく、最初の値が等しくても、2つ目は等しくありません。一番困るのは、一方がdevice、一方がdtypeを持つことで、両方を統一する必要があります。
理由 : 0.4.0からdevice-agnosticの概念が変更されました(つまり、どのデバイスでコードを書いても実行できる、という意味です)。
以前のバージョンのPyTorchでは、デバイスに依存しないコードを書く(つまり、コードを修正せずにCUDA対応のデバイスやCPUのみのデバイスで実行する)ことが非常に困難でした。

PyTorch 0.4.0は以下から入手可能です。 2つの方法 は、コードの互換性を非常に簡単にします。

1. tensor の device プロパティは、全ての tensor に対して torch.device のデバイスを提供する。(注意: get_device は CUDA のテンソルに対してのみ利用可能である)

2. メソッドに テンソルやモジュールを使って、オブジェクトを異なるデバイスに簡単に移動させることができる(これまでのcpu()やcuda()メソッドの代わりに)。
ここでは、toメソッドを使用しました。
質問文の前に追加します。

predict_labels = predict_labels.to(device,dtype=torch.int32) # add
test_labels = test_labels.to(device) # add	


問題解決しました。
参考にしてください。
https://ptorch.com/news/189.html
https://discuss.pytorch.org/t/expected-object-of-scalar-type-long-but-got-scalar-type-float-for-argument-2-target/33102/2

Error IndexError: 0-dimのテンソルのインデックスが無効です。0-dimのテンソルをPythonに変換するにはtensor.item()を使用します。

UserWarning: invalid index of a 0-dim tensor. This will be an error in PyTorch 0.5. Use tensor.item() to convert a 0-dim tensor to a Python number
  train_loss += loss.data[0]


pytorchを最新版の0.4.0に更新すると、0.3.1のコードに対して上記の警告が出るので、次のバージョンでバグになることを警告している(ここでは1.0からやっている)。
取得元 https://blog.csdn.net/martinue/article/details/80342461
解決策

#Original statement.
train_loss+=loss.data[0]
#Modified.
train_loss+=loss.item()
#bingo


グラフィックカード選びの問題点

pytorchでグラフィックカードを選択する。
サーバー上でプログラムを実行する準備ができましたが、ブロック0が占有されています。.cuda(1)を指定しましたが、pytorchはまだブロック0としてプログラムを実行するように強制します。本当に頑固です。
やっと見つけた問題点:バグと考えるべきでしょう
参照 https://www.cnblogs.com/jisongxie/p/10276742.html
CUDA_VISIBLE_DEVICES を使用して、使用する GPU を少し制限します。

Error RuntimeError: スカラー型のオブジェクトを期待したが、引数#2 'other'にスカラー型のIntを得た。

この問題はほぼ1日私を苦しめています。pytorchのテンソルは、cpuまたはgpu、あるいは最初のgpuを指定します。
エラーが出続けます。

    rewards = [1 if predict_labels[j]==test_labels[j] else 0 for j in range(CLASS_NUM)]
RuntimeError: Expected object of scalar type Long but got scalar type Int for argument #2 'other'


前の問題と似たような感じですが、うまくいかず、ドキュメントを見ても
対応するGPUをテンソルに追加してみましたが、やはりうまくいきません

 test_labels = test_labels.to(device)
 predict_labels = predict_labels.to(device)


最後に怒っている私は、比較を強制的にnumpyフォーマットにすることを選びました predict_labels[j] == test_labels[j]そしてそれはうまくいきました。

predict_labels = predict_labels.cpu().numpy()
test_labels = test_labels.cpu().numpy()
rewards = [1 if predict_labels[j]== test_labels[j] else 0 for j in range(CLASS_NUM)]


なんという粉砕エラー

ps pycharm pass in コマンドライン引数
実行/デバッグ設定->設定->スクリプトパラメ-ジ
https://www.cnblogs.com/darkknightzh/p/5670821.html