TensorFlow多维感知器

时间:2017-11-03 21:34:04

标签: tensorflow

我有一个csv文件,其中包含4行输出(前缀为_)和225行输入。其余的都很正常:

_y1,_y2,_y3,_y4,x1,x1,...,x225
[some assortment of 4 1s or 0s],[some random assortment of 1s or 0s]

使用下面的代码,我试图让它学习(不是真正的分类器),在给定输入的情况下y为1和0,并评估输入与预测以与训练集进行比较。我此刻并不担心过度训练。是的,我有1作为迭代计数,我知道需要更大,但直到我得到结果我期望(4维输出)我不在乎。

with open(filename, 'rU') as fin:
    reader = csv.DictReader(fin)
    reader.next()
    features = [name for name in reader.fieldnames if not name.startswith('_')]
    outputs  = [name for name in reader.fieldnames if     name.startswith('_')]
    lines = []
    for line in reader:
        lines.append(line)
x_true = [ [float(line[feature]) for feature in features] for line in lines]
y_true = [ [float(line[output]) for output in outputs] for line in lines ]
w_true = np.random.rand(len(features), 1) # init weights
b_true = np.random.rand(1) # init bias

x_in = tf.placeholder(tf.float32, [None, len(features)], "x_in")
w = tf.Variable(tf.random_normal((len(features), 1)), name="w")
b = tf.Variable(tf.constant(0.1, shape=[]), name="b")
h = tf.add(tf.matmul(x_in, w), b, name="h")
y_in = tf.placeholder(tf.float32, [None, len(outputs)], "y_in")
loss_op = tf.reduce_mean(tf.square(tf.subtract(y_in, h)), name="loss")
train_op = tf.train.GradientDescentOptimizer(0.3).minimize(loss_op)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for step in range(1):
        sess.run(train_op, feed_dict={
          x_in: x_true,
          y_in: y_true
        })

    w_computed = sess.run(w)
    b_computed = sess.run(b)

    pred = tf.add(tf.matmul(x_in, w), b)
    results = sess.run(pred, feed_dict={x_in: x_true})
    print "predictions", pred.eval({x_in: x_true})
    print len(x_true), len( results), [len(x) for x in results]

但是我有一些问题。第一个是我期望[225,4]输出,但我只从eval()调用获得[255,1]输出。

接下来是我不确定如何评估单行? 我应该使用估算器吗? 如果我需要其他级别,如何将其转换为DNN? 非常感谢提前。

1 个答案:

答案 0 :(得分:2)

你确实遇到了一些问题,我会尝试尽可能多地列出这里并提出一些可能的解决方案

输出数量错误

您将权重定义为(len(features), 1)矩阵,即行数组。当您将此与样本相乘时,您将获得1个值,而不是4。 要获得4,您需要定义w形状(len(features), 4)b形状(4)

评估单行

为此,您将批量大小设置为1.这意味着,假设row是一个包含您要处理的行的numpy数组,则需要传递feed_dict={x_in: row[None,:]}

估算器非常强大,但理解起来相当复杂。

如何添加其他级别?

手动,这是添加所有缺失的部分(激活功能,下一层的权重,偏见,激活等)的问题。 这样做很无聊。 幸运的是,存在tf.layers module,它具有密集,转换和更多等层的实现(请查看链接)。 层是天生的模块,所以制作一个dnn只是堆叠tf.layer.dense()个对象的问题。