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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

Q&A

解決済

1回答

11354閲覧

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

rarara1028

総合スコア34

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

0グッド

0クリップ

投稿2019/03/17 06:15

編集2019/03/18 00:38

第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

python

1import sys 2sys.path.append('..') 3import numpy as np 4from common.time_layers import TimeLSTM,TimeAffine,TimeSoftmaxWithLoss,TimeEmbedding 5#from common.base_model import BaseModel 6 7 8class Rnnlm: 9 def __init__(self, vocab_size=10000, wordvec_size=100, hidden_size=100): 10 11 V, D, H = vocab_size, wordvec_size, hidden_size 12 rn = np.random.randn 13 14 # 重みの初期化 15 embed_W = (rn(V, D) / 100).astype('f') 16 17 lstm_Wx = (rn(D, 4 * H) / np.sqrt(D)).astype('f') 18 lstm_Wh = (rn(H, 4 * H) / np.sqrt(H)).astype('f') 19 lstm_b = np.zeros(4 * H).astype('f') 20 affine_W = (rn(H, V) / np.sqrt(H)).astype('f') 21 affine_b = np.zeros(V).astype('f') 22 23 # レイヤの生成 24 self.layers = [ 25 TimeEmbedding(embed_W), 26 TimeLSTM(lstm_Wx, lstm_Wh, lstm_b, stateful=True), 27 TimeAffine(affine_W, affine_b) 28 ] 29 30 self.loss_layer = TimeSoftmaxWithLoss() 31 self.lstm_layer = self.layers[1] 32 33 # すべての重みと勾配をリストにまとめる 34 self.params, self.grads = [], [] 35 for layer in self.layers: 36 self.params += layer.params 37 self.grads += layer.grads 38 39 def predict(self, xs): 40 for layer in self.layers: 41 xs = layer.forward(xs) 42 43 return xs 44 45 def forward(self, xs, ts): 46 47 score = self.predict(xs) 48 loss = self.loss_layer.forward(score, ts) 49 50 return loss 51 52 def backward(self, dout=1): 53 dout = self.loss_layer.backward(dout) 54 for layer in reversed(self.layers): 55 dout = layer.backward(dout) 56 return dout 57 58 def reset_state(self): 59 self.lstm_layer.reset_state()

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

time_layer.py

python

1class TimeEmbedding: 2 def __init__(self, W): 3 4 self.params = [W] 5 self.grads = [np.zeros_like(W)] 6 self.layers = None 7 self.W = W 8 9 10 def forward(self, xs): 11 N, T = xs.shape 12 V, D = self.W.shape 13 14 out = np.empty((N, T, D), dtype='f') 15 self.layers = [] 16 17 for t in range(T): 18 layer = Embedding(self.W) 19 out[:, t, :] = layer.forward(xs[:, t]) 20 self.layers.append(layer) 21 22 return out 23 24 def backward(self, dout): 25 N, T, D = dout.shape 26 27 grad = 0 28 for t in range(T): 29 layer = self.layers[t] 30 layer.backward(dout[:, t, :]) 31 grad += layer.grads[0] 32 33 self.grads[0][...] = grad 34 return None 35

上の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使用。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

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

投稿2019/03/17 10:49

hayataka2049

総合スコア30933

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

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

rarara1028

2019/03/17 16:57

回答ありがとうございます。 KernelでRestartとしても、反映されませんでした。 generate_text.py実行時、importされている、rnnlm_gen.pyやそれにimportされているrnnlm.pyの変更は反映されるのですが、 rnnlm.pyにimportされている、time_layer.pyの変更は反映されません。
hayataka2049

2019/03/17 18:04

変ですね。同名ファイルが他にあったりしませんか? あとはもしかしたら__pycache__ディレクトリの削除が効くかも(python3だとあまりこれが問題になることはない印象ですが・・・)
rarara1028

2019/03/18 00:20

pycache削除も効きませんでした。 ch07/generate_text.py←実行 ch07/rnnlm_gen.py ch06/rnnlm.py common/time_ layer.py commonフォルダにはpycacheフォルダが作成されていませんでした。 rnnlm.pyの関数predictで使われている関数forwardはTimeEmbeddingクラスのものではないのでしょうか?
hayataka2049

2019/03/18 00:39

>rnnlm.pyの関数predictで使われている関数forwardはTimeEmbeddingクラスのものではないのでしょうか? TimeEmbeddingクラスのものだと思います。 以下の方法でTimeEmbeddingクラスの所在を確認してみてください。 import inspect print(inspect.getsourcefile(どこのソースで定義されているか知りたいクラス)) rnnlm.pyの変更が効くなら、その中に入れると良いと思います。
rarara1028

2019/03/18 01:08

inspectがあるなんて、知りませんでした。 inspectで調べてみたところ、全く違う階層のファイルの使用がわかり、解決しました。 階層が何個か違ったので、その可能性はないと思っていましたが、色んなファイルの、 sys.append(..)が重なったということだと解釈しました。 ここでずっとつまってしまっていたので、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問