43の重み
これまでに投稿された2つのソリューションは非常に巧妙ですが、それらのアプローチは機械学習のより伝統的なタスク(OCRなど)では機能しない可能性があります。したがって、私は他の人々がそれを改善して機械学習の世界に吸い込まれることを願って、このタスクに「汎用」(巧妙なトリックなし)ソリューションを提出したいと思います:
私のモデルは、TensorFlow 2.0に組み込まれた2つの隠されたレイヤーを持つ非常に単純なニューラルネットワークです(ただし、他のフレームワークも同様に機能します)。
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(6, activation='tanh', input_shape=(2,)),
tf.keras.layers.Dense(3, activation='tanh'),
tf.keras.layers.Dense(1, activation='linear')
])
ご覧のとおり、すべてのレイヤーは密集しており(これは最適ではありません)、アクティベーション関数はtanhです(このタスクでは実際に問題ないかもしれません)。ただし、このタスクの性質上、線形活性化機能があります。
43の重みがあります。
- (2+1)⋅6=18
- (6+1)⋅3=21
- (3+1)⋅1=4
−1010
次に、私はそれらを微調整しました-整数乗算タスクのいずれかの最大偏差を最適化します。残念ながら、私のノートには最終的に行った細かいチューニングは表示されませんが、非常に小さなものでした。441個のバッチサイズで、これらの441個のトレーニングサンプルの100エポック付近。
これらは私が最終的に得た重みです:
[<tf.Variable 'dense/kernel:0' shape=(2, 6) dtype=float32, numpy=
array([[ 0.10697944, 0.05394982, 0.05479664, -0.04538541, 0.05369904,
-0.0728976 ],
[ 0.10571832, 0.05576797, -0.04670485, -0.04466859, -0.05855528,
-0.07390639]], dtype=float32)>,
<tf.Variable 'dense/bias:0' shape=(6,) dtype=float32, numpy=
array([-3.4242163, -0.8875816, -1.7694025, -1.9409281, 1.7825342,
1.1364107], dtype=float32)>,
<tf.Variable 'dense_1/kernel:0' shape=(6, 3) dtype=float32, numpy=
array([[-3.0665843 , 0.64912266, 3.7107112 ],
[ 0.4914808 , 2.1569328 , 0.65417236],
[ 3.461693 , 1.2072319 , -4.181983 ],
[-2.8746269 , -4.9959164 , 4.505049 ],
[-2.920127 , -0.0665407 , 4.1409926 ],
[ 1.3777553 , -3.3750365 , -0.10507642]], dtype=float32)>,
<tf.Variable 'dense_1/bias:0' shape=(3,) dtype=float32, numpy=array([-1.376577 , 2.8885336 , 0.19852689], dtype=float32)>,
<tf.Variable 'dense_2/kernel:0' shape=(3, 1) dtype=float32, numpy=
array([[-78.7569 ],
[-23.602606],
[ 84.29587 ]], dtype=float32)>,
<tf.Variable 'dense_2/bias:0' shape=(1,) dtype=float32, numpy=array([8.521169], dtype=float32)>]
0.443504339⋅10=90.443504
私のモデルはここで見つけることができ、オンラインで試すこともできます!Google Colab環境で。