2017-01-30 9 views
2

私はTensorflowで深い学習回帰結果を再現しようとしています。 sklearnのMLPRegressorクラスを使ってニューラルネットワークをトレーニングすると、98%の検証結果が得られます。SklearnのTensorflowコピーMLPRegressorは他の結果を生成します

MLPRegressor:

http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPRegressor.html#sklearn.neural_network.MLPRegressor

私はTensorflowでモデルを再現しようとしていますが。 TensorflowモデルでMLPRegressorクラスのデフォルト値をコピーする。しかし、私は同じ結果を得ることはできません。私は時間のほとんど75%を得るだけです。

マイTFモデル:

tf.reset_default_graph() 
graph = tf.Graph() 
n_input = 3 # n variables 
n_hidden_1 = 100 
n_hidden_2 = 1 
n_output = 1 
beta = 0.001 

learning_rate = 0.001 

with graph.as_default(): 
    tf_train_feat = tf.placeholder(tf.float32, shape=(None, n_input)) 
    tf_train_label = tf.placeholder(tf.float32, shape=(None)) 


    tf_test_feat = tf.constant(test_feat, tf.float32) 


    """ 
    Weights and biases. The weights matix' columns will be the output vector. 

    * ndarray([rows, columns]) 
    * ndarray([in, out]) 

    tf.placeholder(None) and tf.placeholder([None, 3]) means that the row's size is not set. In the second 
    placeholder the columns are prefixed at 3. 
    """ 
    W = { 
     "layer_1": tf.Variable(tf.truncated_normal([n_input, n_hidden_1])), 
     "layer_2": tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2])), 
     "layer_3": tf.Variable(tf.truncated_normal([n_hidden_2, n_output])), 
    } 


    b = { 
     "layer_1": tf.Variable(tf.zeros([n_hidden_1])), 
     "layer_2": tf.Variable(tf.zeros([n_hidden_2])), 
    } 

    def computation(X): 
     layer_1 = tf.nn.relu(tf.matmul(X, W["layer_1"]) + b["layer_1"]) 
     layer_2 = tf.nn.relu(tf.matmul(layer_1, W["layer_2"]) + b["layer_2"]) 
     return layer_2 

    tf_prediction = computation(tf_train_feat) 
    tf_test_prediction = computation(tf_test_feat) 

    tf_loss = tf.reduce_mean(tf.pow(tf_train_label - tf_prediction, 2)) 
    tf_loss = tf.reduce_mean(tf_loss + beta * tf.nn.l2_loss(W["layer_2"])) 
    tf_optimizer = tf.train.AdamOptimizer(learning_rate).minimize(tf_loss) 
    #tf_optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(tf_loss) 

    init = tf.global_variables_initializer() 

マイTFセッション:

def accuracy(y_pred, y): 
    a = 0 
    for i in range(y.shape[0]): 
     a += abs(1 - y_pred[i][0]/y[i]) 

    return round((1 - a/y.shape[0]) * 100, 3) 

def accuracy_tensor(y_pred, y): 
    a = 0 
    for i in range(y.shape[0]): 
     a += abs(1 - y_pred[i][0]/y[i]) 

    return round((1 - a/y.shape[0]) * 100, 3) 

# Shuffles two arrays. 
def shuffle_in_unison(a, b): 
    assert len(a) == len(b) 
    shuffled_a = np.empty(a.shape, dtype=a.dtype) 
    shuffled_b = np.empty(b.shape, dtype=b.dtype) 
    permutation = np.random.permutation(len(a)) 
    for old_index, new_index in enumerate(permutation): 
     shuffled_a[new_index] = a[old_index] 
     shuffled_b[new_index] = b[old_index] 
    return shuffled_a, shuffled_b 

train_epoch = int(5e4) 
batch = int(200) 

n_batch = int(X.shape[0] // batch) 

prev_acc = 0 
stable_count = 0 

session = tf.InteractiveSession(graph=graph) 
session.run(init) 
print("Initialized.\n No. of epochs: %d.\n No. of batches: %d." % (train_epoch, n_batch)) 

for epoch in range(train_epoch): 
    offset = (epoch * n_batch) % (Y.shape[0] - n_batch) 


    for i in range(n_batch): 
     x = X[offset:(offset + n_batch)] 
     y = Y[offset:(offset + n_batch)] 

     x, y = shuffle_in_unison(x, y) 

     feed_dict = {tf_train_feat: x, tf_train_label: y} 
     _, l, pred, pred_label = session.run([tf_optimizer, tf_loss, tf_prediction, tf_train_label], feed_dict=feed_dict) 

    if epoch % 1 == 0: 
     print("Epoch: %d. Batch' loss: %f" %(epoch, l)) 
     test_pred = tf_test_prediction.eval(session=session) 

     acc_test = accuracy(test_pred, test_label) 
     acc_train = accuracy_tensor(pred, pred_label) 

     print("Accuracy train set %s%%" % acc_train) 
     print("Accuracy test set: %s%%" % acc_test) 

私はTensorflowコードで何かが足りないのですか?ありがとう!

答えて

0

これらを使用しない理由がない限り、回帰にはリニア出力単位が必要です。私は同様の問題を抱えていましたが、私の場合はmlpregressorを映し出すような線形出力と線形隠れユニットを使用してしまいました。

グッドフェローのDeep Learning Bookには、chapter 6に、181ページから始まる、有効化機能を説明するセクションがあります。 `layer_2 = tf.matmul(layer_1、W [ "layer_2"])+ B:あなたが言ったように非常に少なくとも、あなたの出力層のためにこれを試してください

layer_2 = tf.matmul(layer_1, W["layer_2"]) + b["layer_2"] 
+0

マイ層の計算機能で

を返します["layer_2"] ' ' return layer_2' 私の正確さは最大78%に達してから、私が考えているオーバーフィットは72%です。 – ritchie46

+0

レイヤー1のウェイトに12の損失を追加することもあります。 – Nitro

+0

また、100個の隠しユニットを持つ3つの入力は本当に高いようです。最後に、テンソルボードを使って2つのグラフを視覚化し、他の違いを調べます。 – Nitro

関連する問題