おもちゃの例として、私は100の無ノイズデータポイントからの関数f(x) = 1/x
を適合させようとしています。 matlabのデフォルトの実装は、平均平方差〜10^-10で劇的に成功し、完全に補間します。なぜこのTensorFlowの実装はMatlabのNNよりもあまり成功していませんか?
私は10個のシグモイドニューロンの1つの隠れた層を持つニューラルネットワークを実装します。私はニューラルネットワークの初心者ですので、愚かなコードに対して慎重にしてください。
import tensorflow as tf
import numpy as np
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
#Can't make tensorflow consume ordinary lists unless they're parsed to ndarray
def toNd(lst):
lgt = len(lst)
x = np.zeros((1, lgt), dtype='float32')
for i in range(0, lgt):
x[0,i] = lst[i]
return x
xBasic = np.linspace(0.2, 0.8, 101)
xTrain = toNd(xBasic)
yTrain = toNd(map(lambda x: 1/x, xBasic))
x = tf.placeholder("float", [1,None])
hiddenDim = 10
b = bias_variable([hiddenDim,1])
W = weight_variable([hiddenDim, 1])
b2 = bias_variable([1])
W2 = weight_variable([1, hiddenDim])
hidden = tf.nn.sigmoid(tf.matmul(W, x) + b)
y = tf.matmul(W2, hidden) + b2
# Minimize the squared errors.
loss = tf.reduce_mean(tf.square(y - yTrain))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
# For initializing the variables.
init = tf.initialize_all_variables()
# Launch the graph
sess = tf.Session()
sess.run(init)
for step in xrange(0, 4001):
train.run({x: xTrain}, sess)
if step % 500 == 0:
print loss.eval({x: xTrain}, sess)
平均二乗差は〜2 * 10^-3で終わります。したがって、約7桁はmatlabよりも悪化します。
xTest = np.linspace(0.2, 0.8, 1001)
yTest = y.eval({x:toNd(xTest)}, sess)
import matplotlib.pyplot as plt
plt.plot(xTest,yTest.transpose().tolist())
plt.plot(xTest,map(lambda x: 1/x, xTest))
plt.show()
で可視化我々はフィット感が体系的に不完全である見ることができます: MATLAB 1は違い均一< 10^-5と肉眼では完璧に見えるながら:私は複製しようとしている Matlabのネットワークの図はTensorFlow:
尚、図はシグモイドACTIVAではなく、双曲線正接を暗示するようです機能を備えています。私はドキュメントのどこにいてもそれを見つけることはできません。しかし、TensorFlowでtanhニューロンを使用しようとすると、フィッティングがすぐに変数のnan
で失敗します。何故かはわからない。
MatlabはLevenberg-Marquardtトレーニングアルゴリズムを使用します。ベイジアンの正則化は、10^-12の平均正方形でさらに成功しています(おそらく浮動小数点演算の蒸気の領域にあります)。
TensorFlowの実装がそれほど悪くなっているのはなぜですか?さらに改善するためには何ができますか?
私はまだテンソルの流れを調べていません。それは残念ですが、あなたはその 'toNd'関数を使っていくつかの奇妙なことをしています。 'np。リストをndarrayに変換したい場合は、 'np.array(my_list)'だけが必要です。余分な軸が必要な場合は、 'new_array = my_array [np.newaxis、:]'それはそれをすると思われるのでゼロ誤差が足りないのを止めることができます。ほとんどのデータにはノイズがあり、必ずしもトレーニングの誤差がゼロになる必要はありません。 'reduce_mean'で判断すると、相互検証を使用している可能性があります。 –
@AdamAcosta 'toNd'は間違いなく私の経験不足のためのストップギャップです。私は以前に 'np.array'を試しました。問題は' np.array([5,7])。shape'は '(2,1)'ではなく '(2)'です。 'my_array [np.newaxis、:]'はこれを修正するようですが、ありがとう!私はPythonを使用せず、むしろ日常的にF#を使用します。 – Arbil
@AdamAcostaI 'reduce_mean'はクロスバリデーションをしないと思います。ドキュメントから: 'テンソルの次元間の要素の平均を計算する '。 Matlabはクロス検証を行っていますが、これは私の心にはクロスサンプルなしと比較してトレーニングサンプルのフィット感を下げるべきでしょうか? – Arbil