Tensorflow参数值在简单Softmax模型中无变化

我试图使用Tensorflow在我的图像数据上构建一个Softmax模型,灵感来自MNIST示例。当我尝试训练模型时,我发现损失没有减少。我还发现,在第一次迭代后,参数(W,b)的值没有变化。我需要在每次迭代后显式更新我的参数值吗?

代码如下:

######### 模型图 ###################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])########### 每个Softmax sigmoid函数的权重##############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") #向控制台打印TensorFlow的成本#train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)train_step = tf.train.AdamOptimizer(0.1).minimize(cross_entropy)#### 模型评估 ######### 评估模型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();### 运行图 ###### 初始化变量 ####config = tf.ConfigProto()config.log_device_placement=Truesess = tf.Session(config=config)sess.run(ops)###训练####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;

回答:

我最终解决了我的问题。问题在于我的特征和权重的乘积很大(数万级别),导致Softmax中指数的值膨胀(想象一下e^30000)。

因此,我的梯度总是为零,因此参数没有更新。

我尝试了以下方法来解决这个问题:

- 归一化我的图像数据(像素值从0到255变为0到1)- 用非常小的值(约10e-3)初始化参数向量- 降低优化算法的学习率。

这使得指数变小且梯度值不为零。最终能够训练模型。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注