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

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

ただいまの
回答率

88.76%

python コードを変更しても何の反映もない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,394

rarara1028

score 33

第7章の文章生成プログラム、generate_text.pyについての質問です。

これの実行のために、rnnlm_gen.pyや第6章のrnnlm.pyを使用していて、
rnnlm.pyでTimeEmbeddingオブジェクト生成時に、common/time_layer.pyを使用していると思うのですが、
time_layer.pyをいくら変更しても、反映されません。
rnnlm.pyのpredict関数で使われてるforward関数は、time_layer.pyのTimeEmbeddingクラスのものではないのでしょうか?

rnnlm.py

import sys
sys.path.append('..')
import numpy as np
from common.time_layers import TimeLSTM,TimeAffine,TimeSoftmaxWithLoss,TimeEmbedding
#from common.base_model import BaseModel


class Rnnlm:
    def __init__(self, vocab_size=10000, wordvec_size=100, hidden_size=100):

        V, D, H = vocab_size, wordvec_size, hidden_size
        rn = np.random.randn

        # 重みの初期化
        embed_W = (rn(V, D) / 100).astype('f')

        lstm_Wx = (rn(D, 4 * H) / np.sqrt(D)).astype('f')
        lstm_Wh = (rn(H, 4 * H) / np.sqrt(H)).astype('f')
        lstm_b = np.zeros(4 * H).astype('f')
        affine_W = (rn(H, V) / np.sqrt(H)).astype('f')
        affine_b = np.zeros(V).astype('f')

        # レイヤの生成
        self.layers = [
            TimeEmbedding(embed_W),
            TimeLSTM(lstm_Wx, lstm_Wh, lstm_b, stateful=True),
            TimeAffine(affine_W, affine_b)
        ]

        self.loss_layer = TimeSoftmaxWithLoss()
        self.lstm_layer = self.layers[1]

        # すべての重みと勾配をリストにまとめる
        self.params, self.grads = [], []
        for layer in self.layers:
            self.params += layer.params
            self.grads += layer.grads

    def predict(self, xs):
        for layer in self.layers:
            xs = layer.forward(xs)

        return xs

    def forward(self, xs, ts):

        score = self.predict(xs)
        loss = self.loss_layer.forward(score, ts)

        return loss

    def backward(self, dout=1):
        dout = self.loss_layer.backward(dout)
        for layer in reversed(self.layers):
            dout = layer.backward(dout)
        return dout

    def reset_state(self):
        self.lstm_layer.reset_state()

上のコードのself.layersでTimeEmbeddingオブジェクトを生成してると思うのですが、

time_layer.py

class TimeEmbedding:
    def __init__(self, W):

        self.params = [W]
        self.grads = [np.zeros_like(W)]
        self.layers = None
        self.W = W


    def forward(self, xs):
        N, T = xs.shape
        V, D = self.W.shape

        out = np.empty((N, T, D), dtype='f')
        self.layers = []

        for t in range(T):
            layer = Embedding(self.W)
            out[:, t, :] = layer.forward(xs[:, t])
            self.layers.append(layer)

        return out

    def backward(self, dout):
        N, T, D = dout.shape

        grad = 0
        for t in range(T):
            layer = self.layers[t]
            layer.backward(dout[:, t, :])
            grad += layer.grads[0]

        self.grads[0][...] = grad
        return None


上のtime_layer.pyをいくらいじっても、何の反映もありません。

https://github.com/oreilly-japan/deep-learning-from-scratch-2/blob/master/ch07/generate_text.py

time_layer.pyの全体をコメントアウトしても、何の反映もなく、generate_text.pyは実行されます。

Anaconda、jupyter notebook使用。

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

以下の2点を踏まえておいてください。

  • 一度importしたものはキャッシュされ、2回目以降のimportは反映されません
  • jupyterは過去に実行した履歴がすべて残る対話環境です

Kernerl→Restart & Run Allすると反映されるはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/18 09:20

    pycache削除も効きませんでした。

    ch07/generate_text.py←実行
    ch07/rnnlm_gen.py
    ch06/rnnlm.py
    common/time_ layer.py

    commonフォルダにはpycacheフォルダが作成されていませんでした。

    rnnlm.pyの関数predictで使われている関数forwardはTimeEmbeddingクラスのものではないのでしょうか?

    キャンセル

  • 2019/03/18 09:39

    >rnnlm.pyの関数predictで使われている関数forwardはTimeEmbeddingクラスのものではないのでしょうか?
    TimeEmbeddingクラスのものだと思います。

    以下の方法でTimeEmbeddingクラスの所在を確認してみてください。
    import inspect
    print(inspect.getsourcefile(どこのソースで定義されているか知りたいクラス))

    rnnlm.pyの変更が効くなら、その中に入れると良いと思います。

    キャンセル

  • 2019/03/18 10:08

    inspectがあるなんて、知りませんでした。
    inspectで調べてみたところ、全く違う階層のファイルの使用がわかり、解決しました。

    階層が何個か違ったので、その可能性はないと思っていましたが、色んなファイルの、
    sys.append(..)が重なったということだと解釈しました。

    ここでずっとつまってしまっていたので、本当にありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る