मैं 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
जोड़ना होगा =) मैं अब 'tf.truncated_normal उपयोग कर रहा हूँ()' और आपके वजन और पूर्वाग्रहों के लिए 'tf.constant()' आपके और उनके [ट्यूटोरियल] (http://tensorflow.org/tutorials/mnist/pros/index.html#weight-initialization) द्वारा सुझाए गए अनुसार। लेकिन अभी भी कोई बदलाव नहीं: अनुमान लगाया y यादृच्छिक रूप से। :( –
क्या आप सुनिश्चित हैं कि आपके डेटा के साथ कोई बग नहीं है? क्या डीएस [0] 100 आइटम हैं? डीएस = data_generator.generate_data (10000) xs = ds [0] xs = xs.reshape (100, 100, 28 * 28) यदि आपके पास दोबारा सही होने से पहले एक्सएस सही नंबर था तो मैं अधिक आरामदायक होगा ... – dga
हाय। Nparray xs आकार (10000, 784) के रूप में शुरू होता है, फिर इसका आकार बदलता है (100, 100, 784)। मेरी पोस्ट को उस क्लास को शामिल करने के लिए बदल दिया गया है जो डेटा बनाता है ताकि आप इसे आज़मा सकें। धन्यवाद! –