2015-11-24 9 views
6

मैं TensorFlow के साथ बड़ी काम करने के लिए लक्ष्य कर रहा हूँ, लेकिन मैं छोटे शुरू करने के लिए कोशिश कर रहा हूँ।TensorFlow - क्यों इस sofmax प्रतिगमन कुछ भी जानने नहीं करता है?

मैं छोटे ग्रेस्केल वर्गों (एक छोटे से शोर के साथ) है और मैं (जैसे 3 विभाग:, काले, भूरे, सफेद) उनके रंग के अनुसार उन्हें वर्गीकृत करने के लिए चाहते हैं। मैं वर्गों 1-गर्म वैक्टर उत्पन्न करने के लिए, और एक छोटे से अजगर वर्ग ने लिखा है, और उन में खिलाने के लिए उनके बुनियादी MNIST उदाहरण संशोधित

लेकिन यह कुछ भी नहीं सीख जाएगा -। उदा 3 श्रेणियों के लिए यह हमेशा ≈33% सही अनुमान लगाता है।

import tensorflow as tf 
import generate_data.generate_greyscale 

data_generator = generate_data.generate_greyscale.GenerateGreyScale(28, 28, 3, 0.05) 
ds = data_generator.generate_data(10000) 
ds_validation = data_generator.generate_data(500) 
xs = ds[0] 
ys = ds[1] 
num_categories = data_generator.num_categories 

x = tf.placeholder("float", [None, 28*28]) 
W = tf.Variable(tf.zeros([28*28, num_categories])) 
b = tf.Variable(tf.zeros([num_categories])) 
y = tf.nn.softmax(tf.matmul(x,W) + b) 
y_ = tf.placeholder("float", [None,num_categories]) 
cross_entropy = -tf.reduce_sum(y_*tf.log(y)) 
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) 
init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 

# let batch_size = 100 --> therefore there are 100 batches of training data 
xs = xs.reshape(100, 100, 28*28) # reshape into 100 minibatches of size 100 
ys = ys.reshape((100, 100, num_categories)) # reshape into 100 minibatches of size 100 

for i in range(100): 
    batch_xs = xs[i] 
    batch_ys = ys[i] 
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) 

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 

xs_validation = ds_validation[0] 
ys_validation = ds_validation[1] 
print sess.run(accuracy, feed_dict={x: xs_validation, y_: ys_validation}) 

मेरे डेटा जनरेटर इस तरह दिखता है:

import numpy as np 
import random 

class GenerateGreyScale(): 
    def __init__(self, num_rows, num_cols, num_categories, noise): 
     self.num_rows = num_rows 
     self.num_cols = num_cols 
     self.num_categories = num_categories 
     # set a level of noisiness for the data 
     self.noise = noise 

    def generate_label(self): 
     lab = np.zeros(self.num_categories) 
     lab[random.randint(0, self.num_categories-1)] = 1 
     return lab 

    def generate_datum(self, lab): 
     i = np.where(lab==1)[0][0] 
     frac = float(1)/(self.num_categories-1) * i 
     arr = np.random.uniform(max(0, frac-self.noise), min(1, frac+self.noise), self.num_rows*self.num_cols) 
     return arr 

    def generate_data(self, num): 
     data_arr = np.zeros((num, self.num_rows*self.num_cols)) 
     label_arr = np.zeros((num, self.num_categories)) 
     for i in range(0, num): 
      label = self.generate_label() 
      datum = self.generate_datum(label) 
      data_arr[i] = datum 
      label_arr[i] = label 
     #data_arr = data_arr.astype(np.float32) 
     #label_arr = label_arr.astype(np.float32) 
     return data_arr, label_arr 

उत्तर

2

जबकि डीजीए और सिंकड के जवाब उपयोगी थे, मैंने गैर-शून्य वजन प्रारंभिकरण और बड़े डेटासेट का उपयोग करने की कोशिश की लेकिन इसका कोई फायदा नहीं हुआ। अंततः काम करने वाली चीज एक अलग अनुकूलन एल्गोरिदम का उपयोग कर रही थी।

मैं बदले गए:

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

साथ

train_step = tf.train.AdamOptimizer(0.0005).minimize(cross_entropy)

मैं भी पाश के लिए किसी अन्य रूप में पाश के लिए प्रशिक्षण एम्बेडेड कई अवधियों के लिए प्रशिक्षित करने के लिए, इस तरह अभिसरण में जिसके परिणामस्वरूप:

===# EPOCH 0 #=== 
Error: 0.370000004768 
===# EPOCH 1 #=== 
Error: 0.333999991417 
===# EPOCH 2 #=== 
Error: 0.282000005245 
===# EPOCH 3 #=== 
Error: 0.222000002861 
===# EPOCH 4 #=== 
Error: 0.152000010014 
===# EPOCH 5 #=== 
Error: 0.111999988556 
===# EPOCH 6 #=== 
Error: 0.0680000185966 
===# EPOCH 7 #=== 
Error: 0.0239999890327 
===# EPOCH 8 #=== 
Error: 0.00999999046326 
===# EPOCH 9 #=== 
Error: 0.00400000810623 

संपादित करें - यह क्यों काम करता है: मुझे लगता है कि समस्या यह थी कि मैंने मैन्युअल रूप से अच्छी शिक्षा दर शेड्यूल नहीं चुना था, और एडम स्वचालित रूप से एक बेहतर उत्पन्न करने में सक्षम था।

3

शुरुआत के लिए, यादृच्छिक मान, शून्य नहीं के साथ अपने डब्ल्यू मैट्रिक्स आरंभ की कोशिश - आप जब उत्पादन के साथ काम करने के लिए अनुकूलक कुछ भी दे नहीं कर रहे हैं सभी इनपुट के लिए सभी शून्य है।

बजाय

:

W = tf.Variable(tf.zeros([28*28, num_categories])) 

प्रयास करें:

W = tf.Variable(tf.truncated_normal([28*28, num_categories], 
            stddev=0.1)) 
+0

जोड़ना होगा =) मैं अब 'tf.truncated_normal उपयोग कर रहा हूँ()' और आपके वजन और पूर्वाग्रहों के लिए 'tf.constant()' आपके और उनके [ट्यूटोरियल] (http://tensorflow.org/tutorials/mnist/pros/index.html#weight-initialization) द्वारा सुझाए गए अनुसार। लेकिन अभी भी कोई बदलाव नहीं: अनुमान लगाया y यादृच्छिक रूप से। :( –

+0

क्या आप सुनिश्चित हैं कि आपके डेटा के साथ कोई बग नहीं है? क्या डीएस [0] 100 आइटम हैं? डीएस = data_generator.generate_data (10000) xs = ds [0] xs = xs.reshape (100, 100, 28 * 28) यदि आपके पास दोबारा सही होने से पहले एक्सएस सही नंबर था तो मैं अधिक आरामदायक होगा ... – dga

+0

हाय। Nparray xs आकार (10000, 784) के रूप में शुरू होता है, फिर इसका आकार बदलता है (100, 100, 784)। मेरी पोस्ट को उस क्लास को शामिल करने के लिए बदल दिया गया है जो डेटा बनाता है ताकि आप इसे आज़मा सकें। धन्यवाद! –

2

आप मुद्दा यह है कि अपने ढ़ाल वृद्धि हो रही है/सीमा के बिना कम हो, नुकसान समारोह के कारण नेन बनने वाली है।

इस सवाल पर एक नज़र डालें: Why does TensorFlow example fail when increasing batch size?

इसके अलावा, यकीन है कि आप कदम के लिए पर्याप्त संख्या में के लिए मॉडल चलाने बनाते हैं। आप केवल अपने ट्रेन डेटासेट (100 बार * 100 उदाहरण) के माध्यम से इसे चला रहे हैं, और यह अभिसरण करने के लिए पर्याप्त नहीं है। इसे कम से कम 2000 की तरह बढ़ाएं (आपके डेटासेट के माध्यम से 20 गुना चल रहा है)।

संपादित करें (टिप्पणी कर सकते हैं नहीं है, इसलिए मैं अपने यहाँ विचार जोड़ देंगे): पद की बात मैं जुड़ा हुआ है कि आप GradientDescentOptimizer उपयोग कर सकते हैं, जब तक कि आप 0,001 जैसे शिक्षण दर कुछ करना है। यही मुद्दा है, आप जिस हानि समारोह का उपयोग कर रहे थे, उसके लिए आपकी सीखने की दर बहुत अधिक थी।

वैकल्पिक रूप से, एक अलग नुकसान समारोह, कि वृद्धि नहीं करता है/के रूप में ज्यादा ढ़ाल कमी का उपयोग करें। crossEntropy की परिभाषा में tf.reduce_mean बजाय tf.reduce_sum का प्रयोग करें।

0

मुझे यह प्रश्न मिला जब मुझे एक समान समस्या थी .. मैंने सुविधाओं को स्केल करके मेरा तय किया।

एक छोटी सी पृष्ठभूमि: मैं tensorflow ट्यूटोरियल पीछा कर रहा था, फिर भी मैं Kaggle (see data here) से डेटा का उपयोग मॉडलिंग करना चाहता था, लेकिन शुरुआत में मैं एक ही समस्या हो रही kepted: मॉडल सिर्फ सीखना नहीं है .. मुसीबत-शूटिंग के दौर के बाद, मुझे एहसास हुआ कि कागल डेटा पूरी तरह से अलग पैमाने पर था। इसलिए, मैंने डेटा को स्केल किया ताकि वह उसी पैमाने (0,1) को टेंसोर्फलो के एमएनआईएसटी डेटासेट के रूप में साझा कर सके।

बस लगा कि मैं अपने दो सेंट here..in मामले की तरह मैंने किया था कुछ शुरुआती जो ट्यूटोरियल की सेटिंग का पालन करने की कोशिश कर रहे अटक

+0

हां - स्थानांतरण सीखने के लिए यह जांचना आवश्यक है कि आपका नया डेटा उसी तरह से प्रीप्रोसेस्ड हो आपके द्वारा स्थानांतरित किए जा रहे मॉडल का मूल प्रशिक्षण डेटा। कृपया ध्यान दें कि मुझे यह समस्या सीखने की दर से करना था, और मैं अंतराल [0, 1] में उत्पन्न कृत्रिम डेटा के साथ स्क्रैच से एक मॉडल को प्रशिक्षण दे रहा था। –

संबंधित मुद्दे