Tensorflowの最終的な出力が、分類ではなく何らかの連続値であってほしい場合がある。世間ではDeep Learning = 画像分類みたいなイメージが定着しているためか、サンプルを探してもそのようなものばかりであるが、連続値推定も可能である。例えば素粒子実験において、ある粒子の情報を入力してそのエネルギーを推定させたりできる。
方法は難しくない。通常、最終的な出力はsigmoid関数やsoftmax関数などの活性化関数を通し、交差エントロピー関数を最小化するようにフィッティングさせるが、活性化関数は結果を0か1に選り分けてしまうのでよろしくない。したがって、活性化関数を通さなければよい。そして交差エントロピー関数ではなくよくある最小二乗法のように、真の値に対する誤差のRMSを最小化させれば良い。
極めてシンプルな例を書くと、次のような感じだ。
x = tf.placeholder(tf.float32, shape = (None, n_in)) t = tf.placeholder(tf.float32, shape = (None, n_out)) w = tf.Variable(tf.random.truncated_normal([n_in, n_hidden])) b = tf.Variable(tf.random.truncated_normal([n_hidden])) h = tf.nn.sigmoid(tf.matmul(x, w) + b) v = tf.Variable(tf.random.truncated_normal([n_hidden, 1])) c = tf.Variable(tf.random.truncated_normal([1])) y = tf.matmul(h, v) + c loss = tf.reduce_mean(tf.square(t - y)) train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
真の値tに対して、推定値yのずれの二乗値を最小化させているだけである。もちろんRMSが望ましくない場合もあるだろうから、ユーザーが望むようにlossの式の形を変えること。