2017-02-11 21 views
8

Zrobiłem co w mojej mocy, aby śledzić przewodniki online dotyczące struktury sieci neuronowych, ale brakuje mi czegoś fundamentalnego. Biorąc pod uwagę zestaw wyszkolonych wag wraz z ich stronniczością, chciałbym po prostu przewidzieć dane wejściowe ręcznie z tymi wagami bez użycia metody przewidywania.Jak używać wag do ręcznego przewidywania danych w sieci neuronowej za pomocą karasa

Używanie obrazów MNIST z aparatami Próbowałem ręcznie edytować moje dane w celu dodania dodatkowej funkcji do stronniczości, jednak ten wysiłek wydaje się nie zapewniać lepszej dokładności obrazu, niż w przypadku braku stronniczości i zdecydowanie mniejszej dokładności niż za pomocą metody przewidywania keras. Mój kod jest poniżej wraz z moją próbą.

Należy zwrócić uwagę na dwa komentarze w pobliżu dna, aby przewidzieć metodę keras w celu uzyskania dokładnej reprezentacji obrazu, a następnie moją słabą próbę ręcznego pobrania wag i dodania odchylenia.

from keras.datasets import mnist 
import numpy as np 
import time 
from keras.models import Sequential 
from keras.layers import Dense 
import tensorflow as tf 
from matplotlib import pyplot as plt 

comptime=time.time() 
with tf.device('/cpu:0'): 
    tf.placeholder(tf.float32, shape=(None, 20, 64)) 

    seed = 7 
    np.random.seed(seed) 
    model = Sequential() 
    (x_train, _), (x_test, _) = mnist.load_data() 
    x_train = x_train.astype('float32')/255. 
    priorShape_x_train=x_train.shape #prior shape of training set 
    x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:]))) 
    x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:]))) 
    x_train_shaped=x_train 
    model.add(Dense(32, input_dim=784, init='uniform', activation='relu')) 
    model.add(Dense(784, init='uniform', activation='sigmoid')) 
    model.compile(loss='binary_crossentropy', optimizer='adadelta', metrics=['accuracy']) 
    model.fit(x_train[1:2500], x_train[1:2500], nb_epoch=10) 

#proper keras prediction 
prediction_real=model.predict(x_train[57:58]) 
prediction_real=prediction_real.reshape((28,28)) 

#manual weight prediction attempt 
x_train=np.hstack([x_train,np.zeros(x_train.shape[0]).reshape(x_train.shape[0],1)]) #add extra column for bias 
x_train[:,-1]=1 #add placeholder as 1 
weights=np.vstack([model.get_weights()[0],model.get_weights()[1]]) #add trained weights as extra row vector 
prediction=np.dot(x_train,weights) #now take dot product.. repeat pattern for next layer 
prediction=np.hstack([prediction,np.zeros(prediction.shape[0]).reshape(prediction.shape[0],1)]) 
prediction[:,-1]=1 
weights=np.vstack([model.get_weights()[2],model.get_weights()[3]]) 
prediction=np.dot(prediction,weights) 
prediction=prediction.reshape(priorShape_x_train) 

plt.imshow(prediction[57], interpolation='nearest',cmap='gray') 
plt.savefig('myprediction.png') #my prediction, not accurate 
plt.imshow(prediction_real,interpolation='nearest',cmap='gray') 
plt.savefig('realprediction.png') #in-built keras method, accurate 

Odpowiedz

5

Instrukcja obliczenia predykcji wydaje się być prawidłowa, inne niż brakującej funkcji aktywacji, jak activation='relu' po pierwszej warstwie i activation='sigmoid' w ostatniej warstwie.

Wykonaj następujące zmiany do ręcznego kodu przewidywania i prognozowania powinny działać prawidłowo:

from scipy.stats import logistic 

weights=np.vstack([model.get_weights()[0],model.get_weights()[1]]) 
prediction=np.dot(x_train,weights) 

prediction[prediction<0]=0    ### RELU after 1st layer 

prediction=np.hstack([prediction,np.zeros(prediction.shape[0]).reshape(prediction.shape[0],1)]) 
prediction[:,-1]=1 
weights=np.vstack([model.get_weights()[2],model.get_weights()[3]]) 
prediction=np.dot(prediction,weights) 

prediction=logistic.cdf(prediction)  ### Sigmoid after 2nd layer 

prediction=prediction.reshape(priorShape_x_train)