2017-02-11 9 views
8

ニューラルネットワークの構造に関するオンラインガイドを守るために最善を尽くしましたが、何か根本的なものが欠けているはずです。彼らの偏見と一緒に訓練された重みのセットが与えられたら、私は単に予測方法を使わずにそれらの重みを使って手作業で入力を予測したいと思います。カーラを使ってウェイトを使ってニューラルネットワークのデータを手動で予測する方法

ケラスを使用してMNIST画像を使用すると、データを手作業で編集してバイアスの特別な機能を追加しようとしましたが、このような努力は、バイアスをまったく使用しない場合よりもはるかに正確ではありませんkeras predictメソッドを使用します。私のコードは、私の試みに沿って以下にあります。

正確な画像表現のためにケラスメソッド予測を使用し、次に手動でウェイトを取得してバイアスを追加するという貧弱な試みのために、ボトム付近の2つのコメントに注意してください。

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 

答えて

5

手動予測演算が第1層と最終層でactivation='sigmoid'activation='relu'ような欠落活性化機能以外の正しいと思われます。

正常に動作する必要があります手動予測コードおよび予測に以下の変更を行います:

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) 
関連する問題