2017-04-19 4 views
0

次のコードを実行すると、すべてのトレーニングステップで一定の損失が表示されます。私はまた、変更しないパラメータを印刷しようとしました。 GradientDescentOptimizerを使用するtrain_stepが、W_fc1、b_fc1、W_fc2、およびb_fc2の重みを変更しない理由がわかりません。 私は機械学習の初心者なので、何かが明らかに欠けているかもしれません。 (同様の質問に対する答えは、ゼロで初期化されるべきではないが、ここでの重みは、問題ではないように、切り捨てられた法線で初期化される)。TensorFlow:GradientDescentOptimizer列車ステップを実行すると、パラメータが更新されないのはなぜですか?

import tensorflow as tf 
import numpy as np 
import csv 
import random 
with open('wine_data.csv', 'rb') as csvfile: 
    input_arr = list(csv.reader(csvfile, delimiter=',')) 
for i in range(len(input_arr)): 
    input_arr[i][0] = int(input_arr[i][0]) - 1 # 0 index for one hot 
    for j in range(1, len(input_arr[i])): 
    input_arr[i][j] = float(input_arr[i][j]) 

random.shuffle(input_arr) 
training_data = np.array(input_arr[:2*len(input_arr)/3]) # train on first two thirds of data 
testing_data = np.array(input_arr[2*len(input_arr)/3:]) # test on last third of data 

x_train = training_data[0:, 1:] 
y_train = training_data[0:, 0] 

x_test = testing_data[0:, 1:] 
y_test = testing_data[0:, 0] 

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) 

x = tf.placeholder(tf.float32, shape=[None, 13], name='x') 
y_ = tf.placeholder(tf.float32, shape=[None], name='y_') 
y_one_hot = tf.one_hot(tf.cast(y_, tf.int32), 3) # actual y values 
W_fc1 = weight_variable([13, 128]) 
b_fc1 = bias_variable([128]) 
fc1 = tf.matmul(x, W_fc1)+b_fc1 

W_fc2 = weight_variable([128, 3]) 
b_fc2 = bias_variable([3]) 
y = tf.nn.softmax(tf.matmul(fc1, W_fc2)+b_fc2) 


cross_entropy = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(labels=y_one_hot, logits=y)) 
train_step = tf.train.GradientDescentOptimizer(1e-17).minimize(cross_entropy) 
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_one_hot,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

sess = tf.InteractiveSession() 
tf.global_variables_initializer().run() 
for _ in range(1000): 
    train_step.run(feed_dict={x: x_train, y_: y_train}) 
    if _%10 == 0: 
    loss = cross_entropy.eval(feed_dict={x: x_train, y_: y_train}) 
    print('step', _, 'loss', loss) 

ありがとうございます。

+0

(3E-4のような)高いものにあなたの学習率を設定します。 1e-4を使用するとどうなりますか? – RobR

+0

これは問題の一部であると思われます。学習率を1e-4に減らすと、時間の経過と共に損失がわずかに減少することがありますが、ほとんどのランダムウェイトの初期化では、損失は変わりません。 –

答えて

0

公式tensorflow documentationから:

WARNING:それは効率のために内部logits上のソフトマックスを行っているため、このオペアンプは、スケーリングされていないlogitsを期待しています。 softmaxの出力でこのopを呼び出さないでください。誤った結果が生成されるためです。

tf.nn.softmax_cross_entropy_with_logits

にそれを供給する前にYのソフトマックスを削除するには、また、あなたの学習率が本当に小さいです

関連する問題