Tensorflow简单字符注册:仅生成Nan或0的代码;

时间:2017-05-30 14:50:43

标签: python tensorflow machine-learning neural-network

我试图学习使用Tensorflow。在听完tensorflow演示之后,我尝试使用tensorflow来识别具有1层神经网络模型的角色(在MartinGörner给出的张量流谈话中演示了相同的模型)。我的数据集只有773个62个字符的图像,包括0到9,A到Z和a到z。

我所做的是将每个图像的大小减小到32 * 32(每个图像1024个像素),然后我就像讲话中的第一个例子一样将其展平。并使用以下代码估算我的模型的权重:

我的数据集:
火车是我的形状训练图像(773,1024):773张图像,32 * 32展平为1024像素;
label_train_m 是以下形式的'矩阵'或2D形状(773,62),773图像和62个字符(0到9,A到Z和a到z):

array([[ 1.,  0.,  0., ...,  0.,  0.,  0.],
   [ 1.,  0.,  0., ...,  0.,  0.,  0.],
   [ 1.,  0.,  0., ...,  0.,  0.,  0.],
   ..., 
   [ 0.,  0.,  0., ...,  0.,  0.,  1.],
   [ 0.,  0.,  0., ...,  0.,  0.,  1.],
   [ 0.,  0.,  0., ...,  0.,  0.,  1.]])

显然,它就像一个虚拟矩阵:例如,第一行(或扁平形式的第一个图像)的对应值为0,然后将1放在矩阵中的该位置,表示这是一个0.

这几乎就是我的数据集的设置。 就模型而言,它只是非常简单的矩阵运算: L = X.W + b如讲话中所示; L是概率矩阵; X是像素值矩阵,W是权重矩阵,b是偏差或常数,对于任何图像都是相同的。

在tensorflow中,我的代码是:

XX = tf.placeholder(tf.float32, [773, 32 * 32])
Y_ = tf.placeholder(tf.float32, [773,62]) # 62 characters;
W = tf.Variable(tf.zeros([32*32, 62]))
b = tf.Variable(tf.zeros([62]))

Y = tf.nn.softmax(tf.matmul(XX, W) + b)
cross_entropy = -tf.reduce_mean(Y_ * tf.log(Y)) * 1000.0
train_step = 
tf.train.GradientDescentOptimizer(0.0005).minimize(cross_entropy)
# init
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for i in range(0,1000):
        ce, w, bias, y = sess.run([cross_entropy, W, b, Y], feed_dict={XX: 
        train, Y_:label_train_m})

它没有给出任何错误,我想我的尺寸正确。但是上面代码的结果只给出了偏差,w,y和交叉熵中所有条目的0。

如果我将train_step添加到迭代中,如下所示:

    for i in range(0,1000):
    ce, tr, w, bias, y = sess.run([cross_entropy, train_step, W, b, Y], 
    feed_dict={XX: train, Y_:label_train_m})

我只为偏见,w,y和交叉熵中的所有条目获得nan。

我想知道出了什么问题,考虑到大部分代码都是从演示中复制下来的,只需稍加修改即可更改为维度。

0 个答案:

没有答案