2017-04-26 6 views
1

나는 일반적으로 실행할 수 있습니다 Kaggle의 자리-인식기 problem.Program을 처리 할 수 ​​tensorflow으로 프로그램을 작성하지만 훈련 정확도는 다음과 같은 약 10 %, 항상 낮은 :는 TensorFlow - MNIST 데이터에 개선되지 정확성을 훈련

을 나는 내 프로그램 뭐가 잘못 됐는지 모른다

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) 

def conv2d(x, w): 
    return tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    # ksize = [batch, heigh, width, channels], strides=[batch, stride, stride, channels] 
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') 

x = tf.placeholder(tf.float32, [None, 784])  
y_ = tf.placeholder(tf.float32, [None, 10])  
keep_prob = tf.placeholder(tf.float32) 

x_image = tf.placeholder(tf.float32, [None, 28, 28, 1]) 

w_conv1 = weight_variable([5, 5, 1, 32])  
b_conv1 = bias_variable([32]) 
h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1) 
h_pool1 = max_pool_2x2(h_conv1) 

w_conv2 = weight_variable([5, 5, 32, 64])  
b_conv2 = bias_variable([64]) 
h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2) 
h_pool2 = max_pool_2x2(h_conv2) 

w_fc1 = weight_variable([7 * 7 * 64, 1024]) 
b_fc1 = bias_variable([1024]) 
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])  
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1) 
# dropout 
keep_prob = tf.placeholder(tf.float32)  
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 
# softmax 
w_fc2 = weight_variable([1024, 10]) 
b_fc2 = bias_variable([10]) 
y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, w_fc2) + b_fc2) 

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1])) 
train_step = tf.train.AdamOptimizer(10e-4).minimize(cross_entropy) 

correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

def get_batch(i, size, train, label): 
    startIndex = (i * size) % 42000 
    endIndex = startIndex + size 
    batch_X = train[startIndex : endIndex] 
    batch_Y = label[startIndex : endIndex] 
    return batch_X, batch_Y 


data = pd.read_csv('train.csv') 
train_data = data.drop(['label'], axis=1) 
train_data = train_data.values.astype(dtype=np.float32) 
train_data = train_data.reshape(42000, 28, 28, 1) 

label_data = data['label'].tolist() 
label_data = tf.one_hot(label_data, depth=10) 
label_data = tf.Session().run(label_data).astype(dtype=np.float64) 


batch_size = 100        
tf.global_variables_initializer().run() 

for i in range(20000): 
    batch_x, batch_y = get_batch(i, batch_size, train_data, label_data) 
    if i % 100 == 0: 
     train_accuracy = accuracy.eval(feed_dict={x_image: batch_x, y_: batch_y, keep_prob: 1.0}) 
     print("step %d, training accuracy %g" % (i, train_accuracy)) 
    train_step.run(feed_dict={x_image: batch_x, y_: batch_y, keep_prob: 0.9}) 

: 다음

step 0, training accuracy 0.11 
step 100, training accuracy 0.13 
step 200, training accuracy 0.21 
step 300, training accuracy 0.12 
step 400, training accuracy 0.07 
step 500, training accuracy 0.08 
step 600, training accuracy 0.15 
step 700, training accuracy 0.05 
step 800, training accuracy 0.08 
step 900, training accuracy 0.12 
step 1000, training accuracy 0.05 
step 1100, training accuracy 0.09 
step 1200, training accuracy 0.12 
step 1300, training accuracy 0.1 
step 1400, training accuracy 0.08 
step 1500, training accuracy 0.11 
step 1600, training accuracy 0.17 
step 1700, training accuracy 0.13 
step 1800, training accuracy 0.11 
step 1900, training accuracy 0.13 
step 2000, training accuracy 0.07 
…… 

내 코드입니다.

+0

답이 문제를 해결 한 경우 친절하게 받아들입니다. [누군가 내 질문에 대답하면 어떻게해야합니까?] (https://stackoverflow.com/help/someone-answers) - 감사합니다. – desertnaut

답변

0

나는 당신이 당신의 bias_variable 기능을 변경 제안 - tf.Variable(tf.constant) 동작합니다이 플러스 우리가 일반적으로 제로 편견을 초기화하는 것이 아니라 0.1 방법을 잘 :이 방법으로 문제가 해결되지 않으면

def bias_variable(shape): 
    return tf.zeros((shape), dtype = tf.float32) 

, 초기화 시도하여 가중치 stddev=0.01

+0

감사합니다. 아주 많이 대답! 나는 가중치와 바이어스의 표준 편차를 0.01로 변경하고, 프로그램은 대략 3000 단계 전에 정상적으로 실행됩니다. 정확도는 약 0.99입니다. 그러나 3000 단계 후에 정확도는 갑자기 약 0.1이됩니다. 매우 이상합니다. – Lixudong

+0

@Lixudong 이것은 다른 질문입니다. 친절하게이 대답을 수락하고 새 게시물을 엽니 다. – desertnaut

+0

... 업데이트 된 코드 및 결과 – desertnaut

관련 문제