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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1742閲覧

python 自作モジュール インポートエラー

Sh1nn

総合スコア24

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2021/06/03 06:11

編集2021/06/03 07:04

前提・実現したいこと

Pythonで自作モジュールを読み込む

https://qiita.com/halhorn/items/c91497522be27bde17ce
https://github.com/halhorn/deep_dialog_tutorial
このサイトのコードを動かしたいのですが、モジュールの読み込みでエラーが出ます

githubにあるコードでは最初にディレクトリを一番上に持っていってそこからパスを入れていると思います。
training.pyの中でtransformer.pyの中のTensorflowクラスを呼び出したいです。

ですが、deepdialogフォルダをなぜかファイルとして認識しているのでは?と思っています。

発生している問題・エラーメッセージ

ModuleNotFoundError: No module named 'deepdialog'

該当のソースコード(training.py)

python

1import os 2while os.getcwd().split('/')[-1] != 'deep_dialog_tutorial': 3 os.chdir('..') 4print('current dir:', os.getcwd()) 5 6import tensorflow as tf 7from deepdialog.transformer.transformer import Transformer 8from deepdialog.transformer.preprocess.batch_generator import BatchGenerator

terminal

1current dir: /home/user/deep_dialog_tutorial 2Traceback (most recent call last): 3 File "test.py", line 9, in <module> 4 from deepdialog.transformer.transformer import Transformer 5ModuleNotFoundError: No module named 'deepdialog' 6

該当のソースコード(transformer.py)

python

1import tensorflow as tf 2from typing import List 3from .common_layer import FeedForwardNetwork, ResidualNormalizationWrapper, LayerNormalization 4from .embedding import TokenEmbedding, AddPositionalEncoding 5from .attention import MultiheadAttention, SelfAttention 6from .metrics import padded_cross_entropy_loss, padded_accuracy 7 8PAD_ID = 0 9 10 11class Transformer(tf.keras.models.Model): 12 ''' 13 Transformer モデルです。 14 ''' 15 def __init__( 16 self, 17 vocab_size: int, 18 hopping_num: int = 4, 19 head_num: int = 8, 20 hidden_dim: int = 512, 21 dropout_rate: float = 0.1, 22 max_length: int = 50, 23 *args, 24 **kwargs, 25 ) -> None: 26 super().__init__(*args, **kwargs) 27 self.vocab_size = vocab_size 28 self.hopping_num = hopping_num 29 self.head_num = head_num 30 self.hidden_dim = hidden_dim 31 self.dropout_rate = dropout_rate 32 self.max_length = max_length 33 34 self.encoder = Encoder( 35 vocab_size=vocab_size, 36 hopping_num=hopping_num, 37 head_num=head_num, 38 hidden_dim=hidden_dim, 39 dropout_rate=dropout_rate, 40 max_length=max_length, 41 ) 42 self.decoder = Decoder( 43 vocab_size=vocab_size, 44 hopping_num=hopping_num, 45 head_num=head_num, 46 hidden_dim=hidden_dim, 47 dropout_rate=dropout_rate, 48 max_length=max_length, 49 ) 50

###フォルダ構成
/deep_dialog_tutorial
..../data
..../deepdialog
......../pycache
......../datasource
......../rnnlm
......../transformer
............/training.py(実行ファイル)
............/transformer.py
..../temp
..../test

試したこと

colabでは正常に動きます
しかし、ローカルで試すと上記のエラーが出ます

補足情報(FW/ツールのバージョンなど)

tensorflow==1.14.0

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

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

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

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

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

ppaul

2021/06/03 06:36

print('current dir:', os.getcwd())の結果はなんと出力されていますか?
Sh1nn

2021/06/03 06:44

current dir: /home/user/deep_dialog_tutorial と出力されています よろしくおねがいしますm__m
guest

回答2

0

ベストアンサー

https://docs.python.org/ja/3/library/sys.html#sys.path

起動時に初期化された後、リストの先頭 (path[0]) には Python インタプリタを起動したスクリプトのあるディレクトリが挿入されます。スクリプトのディレクトリがない (インタプリタが対話セッションで起動された時や、スクリプトを標準入力から読み込んだ場合など) 場合、 path[0] は空文字列となり、Python はカレントディレクトリからモジュールの検索を開始します。

したがって、

対話環境を実行した時や、python -c 'コード'と実行した時や、JupyterやGoogle Colaboratoryで実行した時()は、空文字sys.pathに入っていてカレントディレクトリから探索されます。
(
) JupyterやGoogle Colaboratoryが入れてくれているのだと思います

python training.pyと実行した時は、起動したスクリプトのあるディレクトリつまり/home/user/deep_dialog_tutorial/deepdialog/transformerが入っていて、カレントディレクトリからは探索されません。
(追記)というか、逆に、セキュリティ的な動機でカレントディレクトリから探索されないようにしている、と考えるのが自然かと思います。

不思議なことは何もなく、そのようには動かせないコードであるというだけの話です。


正直「そんなディレクトリ構造をPythonは想定していない」で終わりたいところですが、少ない修正で動かすなら、冒頭を

python

1import os, sys 2while os.getcwd().split('/')[-1] != 'deep_dialog_tutorial': 3 os.chdir('..') 4sys.path.append(os.getcwd())

にするとかでしょうか。(実際試してはいませんが)

投稿2021/06/03 07:12

編集2021/06/03 07:24
quickquip

総合スコア11235

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

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

Sh1nn

2021/06/03 09:56

回答ありがとうございます。 確かに上のディレクトリを把握できてしまうのは問題がありますね。 回答いただいた修正で試すと動きました。 ありがとうございました。__m
guest

0

もし、示されたエラーメッセージが間違いない(つまりコピペ)だとすると、ソースとの整合性がとれません。
ソースは、

from deepdialog.transformer.transformer import Transformer

エラーメッセージは、

Traceback (most recent call last):
File "training.py", line 44, in <module>
from deepdialog.transformer.tsformer import Transformer

transformerではなく、tsformerですね。

一見すると、動かしているつもりのソースコードと実際に動いているソースコードが合っていないように見えます。
コピペの間違いなら質問を編集してください。

投稿2021/06/03 06:56

ppaul

総合スコア24670

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

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

Sh1nn

2021/06/03 07:00

回答ありがとうございます。 transformerをtsformerとしたのは別件でファイル名がtransformerだとcolabで動かないエラーが出たためです。 ややこしく書いてしまい申し訳ありません。
Sh1nn

2021/06/03 07:02

current dir: /home/user/deep_dialog_tutorial Traceback (most recent call last): File "test.py", line 9, in <module> from deepdialog.transformer.transformer import Transformer ModuleNotFoundError: No module named 'deepdialog' もとのファイル名で試してみましたが、うまくいきません;;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問