Come esempio di un esempio, sto cercando di installare una funzione f(x) = 1/x
da 100 punti dati non rumorosi. L'implementazione di default matlab ha un successo fenomenale con una differenza quadratica media ~ 10^-10, e interpola perfettamente.Perché questa implementazione di TensorFlow ha meno successo rispetto all'NN di Matlab?
Implemento una rete neurale con uno strato nascosto di 10 neuroni sigmoidali. Sono un principiante alle reti neurali quindi stai in guardia contro il codice stupido.
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)
differenza media quadrato termina a ~ 2 * 10^-3, così circa 7 ordini di grandezza peggio di MATLAB. Visualizzazione con
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()
possiamo vedere la forma è sistematicamente imperfetta: mentre il MATLAB uno sembra perfetto a occhio nudo con le differenze in modo uniforme < 10^-5:
ho cercato di replicare con tensorflow il diagramma della rete Matlab:
per inciso, il diagramma sembra implicare un tanh anziché sigma activa funzione di Non riesco a trovarlo da nessuna parte nella documentazione per essere sicuro. Tuttavia, quando provo a usare un neurone tanh in TensorFlow, il fitting fallisce rapidamente con nan
per le variabili. Non so perché.
Matlab utilizza l'algoritmo di allenamento Levenberg-Marquardt. La regolarizzazione bayesiana ha ancora più successo con i quadrati medi a 10^-12 (probabilmente siamo nell'area dei vapori dell'aritmetica fluttuante).
Perché l'implementazione di TensorFlow è molto peggiore e cosa posso fare per migliorarla?
Non ho ancora esaminato il flusso del tensore, mi spiace tanto, ma stai facendo alcune cose bizzarre con Numpy lì con quella funzione 'toNd'. 'Np.linspace' restituisce già un narray, non una lista, se vuoi convertire una lista in un narray, tutto ciò che devi fare è 'np.array (mia_elenco)', e se hai solo bisogno dell'asse extra, puoi fare 'new_array = my_array [np.newaxis,:]'. Potrebbe semplicemente fermarsi a causa di errore zero perché dovrebbe farlo. La maggior parte dei dati ha rumore e non si desidera necessariamente un errore di allenamento pari a zero. A giudicare da 'reduce_mean', può essere utilizzata la convalida incrociata. –
@AdamAcosta 'toNd' è sicuramente uno stop-gap per la mia mancanza di esperienza. Ho provato 'np.array' prima e il problema sembra essere che' np.array ([5,7]). Shape' è '(2,)' e non '(2,1)'. 'my_array [np.newaxis,:]' sembra correggere questo, grazie! Non uso python ma piuttosto F # giorno per giorno. – Arbil
@AdamAcostaI Non penso che 'reduce_mean' abbia una convalida incrociata. Dai documenti: "Calcola la media degli elementi tra le dimensioni di un tensore". Matlab fa una convalida incrociata che a mio avviso dovrebbe ridurre l'adattamento del campione di allenamento rispetto a nessuna convalida incrociata, giusto? – Arbil