2017-10-18 9 views
4

私のプロジェクトでは、大量のデータがあり、約60GBがnpyファイルに広がり、それぞれ約1GBを持ち、それぞれに約750kのレコードとラベルが含まれています。テンソルフローで大量のデータを扱うにはどうすればよいですか?

各レコードは345 float32で、ラベルは5 float32です。

テンソルフローのデータセットとキュー/スレッドのドキュメントも読みましたが、トレーニングの入力をどのように処理するのか、将来の予測のためにモデルとウェイトを保存する方法を理解できません。

私のモデルは非常に簡単です、それは次のようになります。

x = tf.placeholder(tf.float32, [None, 345], name='x') 
y = tf.placeholder(tf.float32, [None, 5], name='y') 
wi, bi = weight_and_bias(345, 2048) 
hidden_fc = tf.nn.sigmoid(tf.matmul(x, wi) + bi) 
wo, bo = weight_and_bias(2048, 5) 
out_fc = tf.nn.sigmoid(tf.matmul(hidden_fc, wo) + bo) 
loss = tf.reduce_mean(tf.squared_difference(y, out_fc)) 
train_op = tf.train.AdamOptimizer().minimize(loss) 

私は私のニューラルネットはにシャッフルnumpyのアレイを使用して、その後、ランダムな順序で一度にファイル1を読んでいた訓練された方法各ファイルのインデックスを作成し、feed_dictを使用してtrain_opをフィードする各バッチを手動で作成します。私はこれを読んだすべてのものは非常に非効率的で、何とかデータセットやキューやスレッドで置き換える必要がありますが、ドキュメントは役に立たないと言っていました。

したがって、テンソルフローで大量のデータを処理する最良の方法は何ですか?

また、参考のために、私のデータは、2の操作ステップでnumpyのファイルに保存されました:

with open('datafile1.npy', 'wb') as fp: 
    np.save(data, fp) 
    np.save(labels, fp) 
+0

これはおそらく正確にあなたが探しているものです:[データセット(データセットAPI付き)](https://www.tensorflow.org/programmers_guide/datasets) –

+0

大きなデータセットでは、それはすぐに。ミニバッチを使ってそれを克服してください。しかし、それを超えて、すべてのものを最初の場所に持ってこないでください。ミニバッチを使用してください。 –

+0

Karhy、私はデータセットのドキュメントを読んだが、そのほとんどはデータがメモリにプリロードされていると思われるようだ。 Paramdeep、私はミニバッチを使用しています。これはnumpyファイルからデータをロードした後、後でデータをシャッフルして、手動でミニバッチを実行してxとyのプレースホルダに送ります。これが私がより効率的なやり方でやり遂げる方法を見つけようとしているところです。 –

答えて

0

ユーティリティnpy用のファイルが実際にメモリに配列全体を割り当てます。あなたのnumpyの配列をすべてTFRecords formatに変換し、これらのファイルをトレーニングに使用することをお勧めします。これは、テンソルフローで大きなデータセットを読み取る最も効率的な方法の1つです。

TFRecords

def array_to_tfrecords(X, y, output_file): 
    feature = { 
    'X': tf.train.Feature(float_list=tf.train.FloatList(value=X.flatten())), 
    'y': tf.train.Feature(float_list=tf.train.FloatList(value=y.flatten())) 
    } 
    example = tf.train.Example(features=tf.train.Features(feature=feature)) 
    serialized = example.SerializeToString() 

    writer = tf.python_io.TFRecordWriter(output_file) 
    writer.write(serialized) 
    writer.close() 

found hereすることができ、画像を扱う完全な例を変換します。

読むTFRecordDataset

def parse_proto(example_proto): 
    features = { 
    'X': tf.FixedLenFeature((345,), tf.float32), 
    'y': tf.FixedLenFeature((5,), tf.float32), 
    } 
    parsed_features = tf.parse_single_example(example_proto, features) 
    return parsed_features['X'], parsed_features['y'] 

def read_tfrecords(file_names=("file1.tfrecord", "file2.tfrecord", "file3.tfrecord"), 
        buffer_size=10000, 
        batch_size=100): 
    dataset = tf.contrib.data.TFRecordDataset(file_names) 
    dataset = dataset.map(parse_proto) 
    dataset = dataset.shuffle(buffer_size) 
    dataset = dataset.repeat() 
    dataset = dataset.batch(batch_size) 
    return tf.contrib.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes) 

データマニュアルがfound hereすることができます。

関連する問題