我试图学习使用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。
我想知道出了什么问题,考虑到大部分代码都是从演示中复制下来的,只需稍加修改即可更改为维度。