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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

640閲覧

pythonのgeneratorのインスタンスの使用方法について

yu__

総合スコア108

Jupyter

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/12/09 02:14

pythonのgeneratorのインスタンスの使用方法について

Kerasのジェネレーターを使用していてテストのpredictが毎回変化してしまったので、Kerasのジェネレーターでサンプルが列挙される順番についてで勉強をしていました。
結論にはジェネレーターのインスタンスを一度宣言して使い回すとイテレーションの位置が継続されるからインスタンスの使いまわしはしない方がいいとのことでした。
以下、サイトのコードを書いておきます。

python

1def generator(batch_size): 2 X_cache, y_cache = [], [] 3 while True: 4 for i in range(10): 5 X_cache.append(i) 6 y_cache.append(i) 7 if len(X_cache)==batch_size: 8 X_batch = np.asarray(X_cache) 9 y_batch = np.asarray(y_cache) 10 X_cache, y_cache = [], [] 11 yield X_batch, y_batch 12 13from keras.layers import Lambda, Input 14from keras.models import Model 15import numpy as np 16 17input = Input((1,)) 18x = Lambda(lambda x: x)(input) 19model = Model(input, x) 20 21gen = generator(3) 22result1 = model.predict_generator(gen, steps=1, max_queue_size=3) 23result2 = model.predict_generator(gen, steps=1, max_queue_size=3) 24print(result1) 25print(result2)

出力

python

1[[0.] 2 [1.] 3 [2.]] 4[[5.] 5 [6.] 6 [7.]]

そこでたとえインスタンスを使いまわしにしても一回resetすれば最初から始まるようなメソッドなどはないかと探しています。
具体的には、以下のような変換が施せればいいと考えています。

python

1gen = generator(3) 2result1 = model.predict_generator(gen, steps=1, max_queue_size=3) 3 4genをリセットする何か。 5 6result2 = model.predict_generator(gen, steps=1, max_queue_size=3) 7print(result1) 8print(result2)

出力

python

1[[0.] 2 [1.] 3 [2.]] 4[[0.] 5 [1.] 6 [2.]]

具体的な方法が分かる方がいれば教えて頂けると嬉しいです!
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

一回resetすれば最初から始まるようなメソッドなどはないかと探しています。

少なくとも私の知る限りでは、存在しないです。
ただし前以てイテレータを複製することは可能です。

Python

1import itertools 2 3it = iter([1, 2, 3, 4]) 4it, it_ = itertools.tee(it, 2) 5 6print(list(it)) 7print(list(it_))

実行結果 Wandbox

[1, 2, 3, 4] [1, 2, 3, 4]

参考

投稿2019/12/09 02:21

LouiS0616

総合スコア35658

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

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

LouiS0616

2019/12/09 02:37

ベストアンサーを貰ったあとに気付いたのですが、この用途にitertools.teeは不向きです。 > tee() はかなり大きなメモリ領域を使用するかもしれません (使用するメモリ量はiterableの大きさに依存します)。一般には、一つのイテレータが他のイテレータよりも先にほとんどまたは全ての要素を消費するような場合には、 tee() よりも list() を使った方が高速です。 https://docs.python.org/ja/3/library/itertools.html#itertools.tee 冗長なようでも二回イテレータを生成するのが良いでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問