Tensorflowのモデルの入力データを正規化する方法 質問する

Tensorflowのモデルの入力データを正規化する方法 質問する

トレーニング データは 3 つのファイルに保存されていますが、各ファイルは大きすぎてメモリに収まりません。各トレーニング サンプルのデータは 2 次元 (2805 行と 222 列、222 番目の列はラベル用) で、数値です。トレーニング用にモデルに取り込む前にデータを正規化したいと思います。以下は input_pipeline のコードですが、データセットを作成する前にデータは正規化されていません。私のケースで正規化を実行できる tensorflow の関数はありますか?

dataset = tf.data.TextLineDataset([file1, file2, file3])
# combine 2805 lines into a single example
dataset = dataset.batch(2805)

def parse_example(line_batch):
    record_defaults = [[1.0] for col in range(0, 221)]
    record_defaults.append([1])
    content = tf.decode_csv(line_batch, record_defaults = record_defaults, field_delim = '\t')
    features = tf.stack(content[0:221])
    features = tf.transpose(features)
    label = content[-1][-1]
    label = tf.one_hot(indices = tf.cast(label, tf.int32), depth = 2)
    return features, label

dataset = dataset.map(parse_example)
dataset = dataset.shuffle(1000)
# batch multiple examples
dataset = dataset.batch(batch_size)
dataset = dataset.repeat(num_epochs)
iterator = dataset.make_one_shot_iterator()
data_batch, label_batch = iterator.get_next() 

ベストアンサー1

「データを正規化」する方法はいくつかあります。どの方法を考えているかによって、実装が簡単かどうかが変わります。

1. 固定正規化

値の固定範囲がわかっている場合(例:特徴 #1 は の値を持ち[-5, 5]、特徴 #2 は の値を持つなど)、 のテンソルを[0, 100]簡単に前処理できます。例:featureparse_example()

def normalize_fixed(x, current_range, normed_range):
    current_min, current_max = tf.expand_dims(current_range[:, 0], 1), tf.expand_dims(current_range[:, 1], 1)
    normed_min, normed_max = tf.expand_dims(normed_range[:, 0], 1), tf.expand_dims(normed_range[:, 1], 1)
    x_normed = (x - current_min) / (current_max - current_min)
    x_normed = x_normed * (normed_max - normed_min) + normed_min
    return x_normed

def parse_example(line_batch, 
                  fixed_range=[[-5, 5], [0, 100], ...],
                  normed_range=[[0, 1]]):
    # ...
    features = tf.transpose(features)
    features = normalize_fixed(features, fixed_range, normed_range)
    # ...

2. サンプルごとの正規化

特徴がほぼ同じ範囲の値を持つと想定される場合は、サンプルごとの正規化、つまり各サンプルの特徴モーメント (平均、分散) を考慮して正規化を適用することも検討できます。

def normalize_with_moments(x, axes=[0, 1], epsilon=1e-8):
    mean, variance = tf.nn.moments(x, axes=axes)
    x_normed = (x - mean) / tf.sqrt(variance + epsilon) # epsilon to avoid dividing by zero
    return x_normed

def parse_example(line_batch):
    # ...
    features = tf.transpose(features)
    features = normalize_with_moments(features)
    # ...

3. バッチ正規化

サンプルごとではなく、バッチ全体に同じ手順を適用することもできます。これにより、プロセスがより安定する可能性があります。

data_batch = normalize_with_moments(data_batch, axis=[1, 2])

同様に、tf.nn.batch_normalization

4. データセットの正規化

データセット全体にわたって計算された平均/分散を使用して正規化することは、あなたが述べたように、大規模で分割されたデータセットであるため、最も難しいでしょう。

tf.data.Dataset実際には、このようなグローバル計算には適していません。解決策としては、データセットのモーメントを事前に計算できるツールをすべて使用し、この情報を TF の前処理に使用することが挙げられます。


@MiniQuarkが述べたように、Tensorflowには変身データの前処理に使用できるライブラリです。始める、または例えばtft.scale_to_z_score()サンプル正規化の方法。

おすすめ記事