2016-08-05 12 views
0

私は、MNISTの例を参考に、私の画像データにtensorflowを使ってsoftmaxモデルを構築しようとしています。私がモデルを訓練しようとしているとき、私は損失の減少がないことがわかります。私はまた、最初の反復後にパラメータ(W、b)の値に変化がないことを見る。各反復後にパラメータ値を明示的に更新する必要がありますか?Tensorflow単純なsoftmaxモデルのパラメータ値の変更はありません

コード: -

######### 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) 

コストは常に同様のまま:

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] 

更新:コードバッチサイズ

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

私はこの[質問]の答えで提案されたすべてのことを試してみたことを追加したい(http://stackoverflow.com/questions/36127436/tensorflow-predicts-always-the-same-result?noredirect= 1&lq = 1)。その後も問題が存在する – user5911374

+0

変数 'd'の出所がわかりません。データが正しくフェッチされていますか? – Prophecies

+0

返事をありがとう。私はデータを列挙していません。私は、2つの貧弱なマトリックス1サイズ(バッチサイズ、ラベル)とサイズ(バッチサイズ、画像サイズ)のものを取得していることを確認しました。 – user5911374

答えて

1

ためには、私はようやく私の問題を解決することができました。問題は、私の製品の特徴と重量が大きかったため(10万分の1)、soft-maxで指数(e^30000を想像してみてください)の値が膨らんでしまいました。

このため、私の勾配は常にゼロだったため、パラメータの更新はありませんでした。

私はこの問題を解決するには、次を試してみました: -

- 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. 

これは、指数が小さいと、非ゼロの勾配の値になります。最後にモデルを訓練することができました。

関連する問題