我有一个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? 非常感谢提前。
答案 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()
个对象的问题。