TensorFlow が用意している数字を表す型に bfloat16 があります。bfloat16 は sign bittが1、exponent の 部分が 8, fraction が 7と非常に特殊な形をしています。
次の図は PI( π )を bfloat16 で表した図です。ご存じのとおり PI は 3.14159... ですが bfloat16 ではそこまで精度がだせず3.140625 までしか近似できません。通常の 32bit float なら 23bit 分の fraction があるのに対しfraction がわずか 7bit ですから、整数で言えば 0 ~ 127 までしか表せない訳で、その程度しか精度が保てないわけです。
ちょっとした計算も誤差が多くなるレベルと言っても過言ではありません。

TensorFlow で bfloat16
ただし、どうやら NN の世界ではこの精度で十分らしく、TensorFlow で積極的にサポートされています。NumPy でもサポートされている?らしく、NumPy 形式の bfloat16 へも TensorFlow から cast 出来ます。すでに簡単なモデルで MNIST を使って学習したデータがあるのでその値を bfloat16 に変換してみましょう。16bit なので FPGA にモデルを構築した際に利用できればメモリの節約になります。
次に既にある浮動小数点のデータを NumPy で読み、TensorFlow で bfloat16 に変換して、さらにそれを評価させることでNumPy スタイルの bfloat16 に変換してみましょう。
#np.savetxt('b_b_value.txt', b_b_np, delimiter=',')
<class 'numpy.ndarray'> <class 'numpy.float64'> <class 'tensorflow.python.framework.ops.Tensor'> <class 'tensorflow.python.framework.ops.Tensor'> <class 'bfloat16'>
NumPy で バイナリ化
最終的には 16bit の"バイナリ"にしたいので savetxt ではなく save でセーブします。
生成された npy は余計なヘッダがついているので dd でスキップして素の"バイナリ"に変換します。あとは od でテキストにすれば、python の list にまで変換可能です。最終的には w_bin.py と b_bin.py ができあがります。
NumPy で評価してみる
float32 で計算したパラメタを bfloat16 にまで落として同じモデルに再学習無しで使えるでしょうか?試しに、bfloat16 を再度 float に変換して(この時点で精度が落ちる)そのパラメタをもって NumPy で計算させてみます。自家製の bfloat2float という関数を使っています。
結果は勿論、うまくいきました。
おまけ:bfloat2float
Python なんで、この辺の変換は簡単に書けます。この程度の量なら Python で十分通用します。