ネストされたジェネレーターで次のコードを使用して、テキスト ドキュメントを反復処理し、get_train_minibatch()
. テキスト ドキュメントの同じ場所に戻ることができるように、ジェネレーターを永続化 (ピクル) したいと考えています。ただし、ジェネレーターをピクルすることはできません。
簡単な回避策はありますか? ポジションを保存して停止したところから再開できますか? おそらく
get_train_example()
、シングルトンを作成できるので、いくつかのジェネレーターが横たわっていません。次に、このモジュールで、進行状況を追跡するグローバル変数を作成できますget_train_example()
。このジェネレーターを永続化できるようにするための、より良い (よりクリーンな) 提案はありますか?
[編集: さらに 2 つのアイデア:
ジェネレーターにメンバー変数/メソッドを追加して、generator.tell() を呼び出してファイルの場所を見つけることはできますか? そうすれば、次回ジェネレーターを作成するときに、その場所をシークするように要求できるからです。このアイデアは、すべての中で最も単純に聞こえます。
クラスを作成し、ファイルの場所をメンバー変数にしてから、ジェネレーターをクラス内に作成し、生成されるたびにファイルの場所のメンバー変数を更新することはできますか? そうすれば、それがファイルのどこまで進んでいるかを知ることができるからです。
]
コードは次のとおりです。
def get_train_example():
for l in open(HYPERPARAMETERS["TRAIN_SENTENCES"]):
prevwords = []
for w in string.split(l):
w = string.strip(w)
id = None
prevwords.append(wordmap.id(w))
if len(prevwords) >= HYPERPARAMETERS["WINDOW_SIZE"]:
yield prevwords[-HYPERPARAMETERS["WINDOW_SIZE"]:]
def get_train_minibatch():
minibatch = []
for e in get_train_example():
minibatch.append(e)
if len(minibatch) >= HYPERPARAMETERS["MINIBATCH SIZE"]:
assert len(minibatch) == HYPERPARAMETERS["MINIBATCH SIZE"]
yield minibatch
minibatch = []