2016-08-05 26 views
0

Ich versuche ein Softmax-Modell mit Tensorflow auf meinen Bilddaten zu erstellen, inspiriert vom MNIST-Beispiel. Wenn ich versuche, das Modell zu trainieren, sehe ich, dass es keine Verringerung des Verlustes gibt. Ich sehe auch, dass es keine Änderung der Parameterwerte (W, b) nach der ersten Iteration gibt. Muss ich meine Parameterwerte nach jeder Iteration explizit aktualisieren?Tensorflow keine Änderung des Parameterwerts für ein einfaches Softmax-Modell

Code: -

######### Model Graph ################### 
with tf.device('/cpu:0'): 

x = tf.placeholder(tf.float32,shape = [None, IMAGE_HEIGHT, IMAGE_WIDTH, 3]) 
y_ = tf.placeholder(tf.float32,shape = [None,35]) 

########### Weight for each softmax sigmod function############## 
initialW = tf.truncated_normal([IMAGE_HEIGHT*IMAGE_WIDTH*3, 35], stddev=0.1) 
W = tf.Variable(initialW,trainable=True); 
b = tf.Variable(tf.zeros([35]),trainable=True) 


x_flat = tf.reshape(x, [-1,IMAGE_HEIGHT*IMAGE_WIDTH*3]) 
y=tf.nn.softmax(tf.matmul(x_flat,W)+b) 

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y+1e-10),reduction_indices=[1])) 
cross_entropy = tf.Print(cross_entropy, [cross_entropy], "cost") #print to the console tensorflow 

#train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 
train_step = tf.train.AdamOptimizer(0.1).minimize(cross_entropy) 

#### Model evaluation ######### Evaluating model 
is_predicted_correctly = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 
accuracy = tf.reduce_mean(tf.cast(is_predicted_correctly,tf.float32)) 
ops = tf.initialize_all_variables(); 


### Running graph ### 
### Initialzing variable #### 
config = tf.ConfigProto() 
config.log_device_placement=True 
sess = tf.Session(config=config) 
sess.run(ops) 
###Training#### 
for it in range(nIterations): 
    labels, images = d.getNextBatch(nBatchSize) 
    while(images is not None): 
    sess.run(train_step, feed_dict = {x: images, y_ : labels}) 
    labels, images = d.getNextBatch(nBatchSize) 

Kosten bleibt immer ähnlich:

I tensorflow/core/kernels/logging_ops.cc:79] cost[22.211819] 
I tensorflow/core/kernels/logging_ops.cc:79] cost[22.095526] 
I tensorflow/core/kernels/logging_ops.cc:79] cost[22.676987] 
I tensorflow/core/kernels/logging_ops.cc:79] cost[22.563032] 

-Update: Code für Losgröße

def getNextBatch(self,cnt): 
    if(self.dataSet is None): 
     return None, None; 

    if(self.curr>=len(self.dataSet)): 
     return None, None 

    end = self.curr+cnt; 

    if(end>len(self.dataSet)): 
     end = len(self.dataSet) 

    batchData = self.dataSet[self.curr:end] 
    labelRaw = []; 
    images = []; 
    for dataPoint in batchData: 
     try: 
      image = self.getImageFromPath(dataPoint['image']); 
      if(not self.isSizeCorrect(image)): 
       print("Wrong image shape:"+str(image.shape)); 
       raise ValueError("Wrong image shape"); 

      labelRaw.append(dataPoint['label']); 
      images.append(image); 
     except (OSError, ValueError): 
      k=0; 

    labels = self.onEnc.transform((self.lEnc.transform(labelRaw)).reshape(-1,1)) 
    self.curr = end 

    return labels, np.array(images) 

def getImageFromPath(self,imageFile): 
    img = misc.imread(imageFile) 
    resizedImg = misc.imresize(img,(IMAGE_HEIGHT,IMAGE_WIDTH)) 
    return resizedImg; 
+0

Ich möchte hinzufügen, dass ich alle Dinge in der Antwort dieser [Frage] vorgeschlagen versucht haben (http://stackoverflow.com/questions/36127436/tensorflow-predicts-always-the-same-result?noredirect= 1 & lq = 1). Das Problem existiert auch danach – user5911374

+0

Ich sehe nicht, wo die Variable "d" herkommt. Sind Sie sicher, dass die Daten korrekt abgerufen werden? – Prophecies

+0

Danke für die Antwort. Ich gebe Daten als ein numpy Array. Ich habe überprüft, dass ich zwei numpy Matrix 1-Size (Batchgröße, Etiketten) und andere der Größe (Batchgröße, Bildgröße) bekomme. – user5911374

Antwort

1

konnte ich endlich mein Problem lösen. Das Problem war, dass mein Produkt aus Merkmalen und Gewichten groß war (in 10s von tausend), was dazu führte, dass die Werte von Exponenten aufgebläht wurden (imagine e^30000) in soft-max.

Aus diesem Grund waren meine Gradienten immer Null, daher keine Aktualisierung für Parameter.

ich folgendes versucht, dieses Problem zu beheben: -

- Normalized my image data(pixel values from 0-to-255 to 0-to-1) 
- Initialized parameter vectors with very small values around 10e-3 
- Reduced the learning rate of my optimization algorithm. 

Dies ist der Exponent verursacht kleine und nicht-Null-Gradienten Wert. Endlich war es möglich, das Modell zu trainieren.