Tensorflow:权重不变,费用设置为1.0

时间:2017-07-18 16:01:02

标签: python tensorflow neural-network conv-neural-network gradient-descent

我试图建立一个卷积神经网络,但我偶然发现了一些非常奇怪的问题。

首先是第一件事,这是我的代码:

import tensorflow as tf
import numpy as np
import matplotlib.image as mpimg
import glob

x = []
y = 1

for filename in glob.glob('trainig_data/*.jpg'):
    im = mpimg.imread(filename)
    x.append(im)
    if len(x) == 10:
        break
epochs = 5

weights = [tf.Variable(tf.random_normal([5,5,3,32],0.1)),
           tf.Variable(tf.random_normal([5,5,32,64],0.1)),
           tf.Variable(tf.random_normal([5,5,64,128],0.1)),
           tf.Variable(tf.random_normal([75*75*128,1064],0.1)),
           tf.Variable(tf.random_normal([1064,1],0.1))]

def CNN(x, weights):
    output = tf.nn.conv2d([x], weights[0], [1,1,1,1], 'SAME')
    output = tf.nn.relu(output)
    output = tf.nn.conv2d(output, weights[1], [1,2,2,1], 'SAME')
    output = tf.nn.relu(output)
    output = tf.nn.conv2d(output, weights[2], [1,2,2,1], 'SAME')
    output = tf.nn.relu(output)
    output = tf.reshape(output, [-1,75*75*128])
    output = tf.matmul(output, weights[3])
    output = tf.nn.relu(output)
    output = tf.matmul(output, weights[4])
    output = tf.reduce_sum(output)
    return output


sess = tf.Session()
prediction = CNN(tf.cast(x[0],tf.float32), weights)
cost = tf.reduce_mean(tf.square(prediction-y))
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
init = tf.global_variables_initializer()

sess.run(init)
for e in range(epochs):
    print('epoch:',e+1)
    for x_i in x:
        prediction = CNN(tf.cast(x_i,tf.float32), weights)
        sess.run([cost, train])
        print(sess.run(cost))
print('optimization finished!')
print(sess.run(prediction))

现在我的问题出现了:

  1. 权重和过滤器的值不会更改
  2. 变量'cost'始终为1.0
  3. 预测总是输出0
  4. 在做了一些调试之后我发现问题必须来自优化器,因为在我通过优化器加权之前,成本和预测都不是1.0和0。

    我希望这是足够的信息,你可以帮我解决我的问题。

2 个答案:

答案 0 :(得分:0)

尝试更改初始化权重的方式,使用tf.truncated_normal初始化权重。请参阅answer,其中说明了tf.truncated_normal之间的差异。

tf.truncted_normal:从截断的正态分布输出随机值。生成的值遵循具有指定平均值和标准偏差的正态分布,除了丢弃并重新选择幅度超过平均值2个标准偏差的值。

tf.random_normal:从正态分布中输出随机值。

答案 1 :(得分:0)

代码似乎很奇怪。在CNN函数的最后一行中,您使用了tf.reduce_mean作为输出来获取单个值,该值将为正数(最有可能大于1)(0,inf),因为relu激活函数输出a仅在x轴正方向上的输入为正值。因此,我认为您应该使用tf.nn.softmax_with_logits()而不是tf.reduce_mean。也可以尝试使用S型激活功能。