2016-07-28 18 views
1

私の問題を再現性を持たせるために、iris flowerデータセット(任意の10行、すべての列標準を正規化したもの)と最小神経ネットワークモデルを使用して以下の.csvファイルを生成しました。私はインターネット上で見つけたMNISTの例を修正することによって、花弁の幅を花弁の長さ、花弁の幅と花弁の長さを使って予測します。スクロールして私の質問を見てください!ここでTensorFlow:目的関数としてスピアマン距離を実装する

iris.csv

"Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Species" 
0.0551224773430978,-0.380319414627833,-0.335895230408602,-0.548226210538025,"versicolor" 
1.48830688826362,-1.01418510567422,1.37931445678426,0.614677872421422,"virginica" 
0.606347250774068,0.887411967464943,0.450242542888127,0.780807027129915,"virginica" 
-0.606347250774067,-1.64805079672061,0.235841331989019,0.44854871771293,"virginica" 
1.15757202420504,-1.01418510567422,0.950512034986045,0.44854871771293,"virginica" 
-1.92928670700839,0.887411967464943,-2.33697319880027,-2.37564691233144,"setosa" 
0.38585734140168,0.253546276418555,0.307308402288722,1.1130653365469,"virginica" 
-0.826837160146455,0.253546276418555,-0.478829371008007,-0.548226210538025,"versicolor" 
0.0551224773430978,1.52127765851133,-0.192961089809197,-0.21596790112104,"versicolor" 
-0.385857341401679,0.253546276418555,0.021440121089911,0.282419563004437,"virginica" 

nn.py

import pandas as pd 
import numpy as np 
import tensorflow as tf 
import scipy.stats 

# Import iris data 
data = pd.read_csv("iris.csv") 
input = data[["Sepal.Length", "Sepal.Width", "Petal.Length"]] 
target = data[["Petal.Width"]] 

# Parameters 
learning_rate = 0.001 
training_epochs = 6000 

# Network Parameters 
n_hidden_1 = 5 # 1st layer number of features 
n_hidden_2 = 5 # 2nd layer number of features 
n_input = 3 # data input 
n_output = 1 # data output 

# tf Graph input 
x = tf.placeholder("float", [None, n_input]) 
y = tf.placeholder("float", [None, n_output]) 

# Create model 
def multilayer_network(x, weights, biases): 
    # Hidden layer with TanH activation 
    layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1']) 
    layer_1 = tf.tanh(layer_1) 
    # Hidden layer with TanH activation 
    layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2']) 
    layer_2 = tf.tanh(layer_2) 
    # Output layer with linear activation 
    out_layer = tf.matmul(layer_2, weights['out']) + biases['out'] 
    return out_layer 

# Store layers weight & bias 
weights = { 
    'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1])), 
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_hidden_2, n_output])) 
} 
biases = { 
    'b1': tf.Variable(tf.random_normal([n_hidden_1])), 
    'b2': tf.Variable(tf.random_normal([n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_output])) 
} 

# Construct model 
pred = multilayer_network(x, weights, biases) 

# Define loss and optimizer 
cost = tf.reduce_mean(tf.square(pred-y)) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

# Initializing the variables 
init = tf.initialize_all_variables() 

# Launch the graph 
with tf.Session() as sess: 
    sess.run(init) 

    # Training cycle 
    for epoch in range(training_epochs): 
    # Run optimization op (backprop) and cost op (to get loss value) 
    _, c = sess.run([optimizer, cost], feed_dict={x: input, y: target}) 

    # Display logs per epoch step 
    if epoch % 1000 == 0: 
     print "Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c) 

print "Optimization Finished!" 

例のトレーニングセッションの結果である:

$ python nn.py 
Epoch: 0001 cost= 3.000185966 
Epoch: 1001 cost= 0.031734336 
Epoch: 2001 cost= 0.000614795 
Epoch: 3001 cost= 0.000008422 
Epoch: 4001 cost= 0.000000057 
Epoch: 5001 cost= 0.000000000 
Optimization Finished! 

私の考えは、私が最近学んだスピアマン距離を目的関数として置き換えることでした。定義以下の:

FORMULA

私はベクトルのランキングを返す関数書きました:次のようにTensorFlowの方法py_funcを使用して

import scipy.stats 

def rank(vector): 
    return scipy.stats.rankdata(vector, method="min") 

を、私は私のコストテンソルを定義しました。

pred = tf.to_float(tf.py_func(rank, [pred], [tf.int64])[0]) 
y = tf.to_float(tf.py_func(rank, [y], [tf.int64])[0]) 

cost = tf.reduce_mean(tf.square(y-pred)) 

しかし、これは私にエラー

ValueError: No gradients provided for any variable: ((None, <tensorflow.python.ops.variables.Variable object at 0x7f67ffe4ee90>), (None, <tensorflow.python.ops.variables.Variable object at 0x7f66ed3c4990>), (None, <tensorflow.python.ops.variables.Variable object at 0x7f66ed357310>), (None, <tensorflow.python.ops.variables.Variable object at 0x7f66ed357190>), (None, <tensorflow.python.ops.variables.Variable object at 0x7f66ed380350>), (None, <tensorflow.python.ops.variables.Variable object at 0x7f66ed3801d0>)) 

私は、根本的な問題が何であるかを理解していないを与えました。あなたが私に与えることができるどんな方向性も大いに評価されるでしょう!

+0

これは実装の問題のように見えるので、私はあなたがStackOverflowでもっとうまくいくと思っています。私はそれがあなたの損失機能を通してすべての方法を行く "パス"を見つけるのが難しいと思う。 –

+0

テンソルフロー変数から 'tf.to_float'を使って浮動小数点数に' y'と 'pred'をキャストしているように見えます。コストも数値に過ぎません。しかし、あなたがその問題を解決しても、ランク変換は微分可能ではないので、グラジエントベースの方法で訓練しようとすると問題に遭遇します。私は見る。 – user20160

答えて

2

tf.py_funcにはグラデーションが定義されていません。

とにかく@ user20160はコメント内では、操作rankのグラデーションも存在しないので、アルゴリズムを直接トレーニングすることはできません。

+0

しかし、私は "損失関数の一般的な選択は[...]であり、ランク距離の平方和の合計です"と読んでいます。機械学習の本に掲載されています。これはどのようにして可能ですか? –

+1

あなたはあなたのモデルがどれほど悪いか良いかを見るために喪失として使うことができますが、(勾配がないので)訓練できません。強化学習では微分不可能な喪失を訓練する方法がありますが、これはかなり複雑です –

+0

それは理にかなっています!あなたが知っている場合は、強化学習に関する自己学習のためのいくつかのリソースを提供できますか? –

関連する問題