web-dev-qa-db-ja.com

TensorFlowで大量のデータを処理する方法は?

私のプロジェクトでは、大量のデータがあり、約60GBがnpyファイルに分散されており、それぞれが約1GBを保持し、それぞれに約75万のレコードとラベルが含まれています。

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

テンソルフローデータセットのドキュメントとキュー/スレッドのドキュメントも読みましたが、トレーニング用の入力を最適に処理する方法と、将来の予測のためにモデルと重みを保存する方法がわかりません。

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

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)

ニューラルネットをトレーニングする方法は、ランダムな順序で一度に1つずつファイルを読み取り、シャッフルされたnumpy配列を使用して各ファイルにインデックスを付け、train_opを使用してfeed_dictにフィードする各バッチを手動で作成することでした。私が読んだすべてのことから、これは非常に非効率的であり、どういうわけかそれをデータセットまたはキューとスレッドに置き換える必要がありますが、私が言ったように、ドキュメントは役に立ちませんでした。

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

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

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

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()

画像を扱う完全な例は ここにあります です。

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)

データマニュアルは ここにあります にすることができます。

5
Maxim