web-dev-qa-db-ja.com

Tensorflow:Estimatorでジェネレーターからのデータセットを使用する方法

tf.data.Dataset.from_generatorの扱い方を理解するためだけに単純なモデルを構築しようとしています。 output_shapes引数の設定方法がわかりません。指定しないなど、いくつかの組み合わせを試しましたが、テンソルの形状の不一致が原因でエラーが発生します。アイデアは、SIZE = 10を使用して2つの乱暴な配列を生成し、それらを使用して線形回帰を実行することです。これがコードです:

SIZE = 10


def _generator():
    feats = np.random.normal(0, 1, SIZE)
    labels = np.random.normal(0, 1, SIZE)
    yield feats, labels


def input_func_gen():
    shapes = (SIZE, SIZE)
    dataset = tf.data.Dataset.from_generator(generator=_generator,
                                             output_types=(tf.float32, tf.float32),
                                             output_shapes=shapes)
    dataset = dataset.batch(10)
    dataset = dataset.repeat(20)
    iterator = dataset.make_one_shot_iterator()
    features_tensors, labels = iterator.get_next()
    features = {'x': features_tensors}
    return features, labels


def train():
    x_col = tf.feature_column.numeric_column(key='x', )
    es = tf.estimator.LinearRegressor(feature_columns=[x_col])
    es = es.train(input_fn=input_func_gen)

もう1つの質問は、この機能を使用してtf.feature_column.crossed_columnの機能列にデータを提供できるかどうかです。全体的な目標は、データがメモリに収まらない場合にデータベースからチャンクにデータをロードするバッチトレーニングでDataset.from_generator機能を使用することです。すべての意見や例は高く評価されています。

ありがとう!

8
Y. Boshev

tf.data.Dataset.from_generator() のオプションの_output_shapes_引数を使用すると、ジェネレータから生成される値の形状を指定できます。タイプには2つの制約があり、指定方法を定義しています。

  • _output_shapes_引数は、「ネストされた構造」(タプル、タプルのタプル、タプルのディクトなど)であり、ジェネレーターによって生成された値の構造と一致する必要があります。

    プログラムでは、_generator()にステートメント_yield feats, labels_が含まれています。したがって、「ネストされた構造」は2つの要素のタプル(各配列に1つ)です。

  • _output_shapes_構造体の各コンポーネントは、対応するテンソルの形状と一致する必要があります。配列の形状は常に次元のTupleです。 (_tf.Tensor_の形状はより一般的です:ディスカッションについては このスタックオーバーフローの質問 を参照してください。)featsの実際の形状を見てみましょう。

    _>>> SIZE = 10
    >>> feats = np.random.normal(0, 1, SIZE)
    >>> print feats.shape
    (10,)
    _

したがって、_output_shapes_引数は2要素のタプルである必要があり、各要素は_(SIZE,)_です。

_shapes = ((SIZE,), (SIZE,))
dataset = tf.data.Dataset.from_generator(generator=_generator,
                                         output_types=(tf.float32, tf.float32),
                                         output_shapes=shapes)
_

最後に、形状についてもう少し情報を tf.feature_column.numeric_column() および tf.estimator.LinearRegressor() APIに提供する必要があります。

_x_col = tf.feature_column.numeric_column(key='x', shape=(SIZE,))
es = tf.estimator.LinearRegressor(feature_columns=[x_col],
                                  label_dimension=10)
_
12
mrry

@crafetはい、この方法で行うことはできません。あなたはそれが速くなるためにバッチサイズで遊ぶことができます

0
Julio CamPlaz