我想在张量流中运行神经网络。我正在尝试进行电子邮件分类,所以我的训练数据是由计数矢量化文档组成的数组。
我试图了解如何将数据输入到tensorflow的维度。我正在创建这样的占位符:
X = tf.placeholder(tf.int64,[无,#功能]
Y = tf.placeholder(tf.int64,[None,#labels])
然后,我必须将实际的y_train转换为具有维数(1,#observations),因为在运行代码时遇到一些维数错误。
占位符和变量应具有相同的维数吗?有什么对应关系?我摆脱了内存错误,因此担心输入尺寸有问题。
答案 0 :(得分:1)
有点不确定您的“#”符号是指什么。如果经常用来表示“数字”,那么您写的内容将是错误的。为了清楚起见,您想将X和Y的占位符定义为
X = tf.placeholder(tf.int64, [None, input_dimensions])
Y = tf.placeholder(tf.int64, [None, 1])
这里的None
值可容纳您传入的训练数据中的样本数;如果您输入10封电子邮件,则None
将为10。input_dimensions
表示“代表单个训练示例的向量多长时间”。对于灰度图像,它等于像素数,对于电子邮件输入,这应该是最长的矢量化电子邮件的长度。
所有电子邮件输入都需要以相同的长度输入,对于所有短于最长电子邮件的电子邮件,通常的做法是将矢量填充到最大长度为零的位置。
将Y
与训练标签(y_train
)进行比较时,它们都应为相同形状的张量。因此,Y
的形状为(number_of_emails,1),y_train
也应这样。您可以使用
(1, number_of_emails)
转换为(number_of_emails, 1)
y_train = tf.reshape(y_train, [-1,1])
最后,内存不足错误不太可能与任何尺寸不匹配有关,但是更有可能您一次将太多电子邮件发送到网络中。每次您以X
的形式发送某些电子邮件时,它们都必须保留在内存中。如果有很多电子邮件,一次将它们全部送入将耗尽内存资源(尤其是在GPU上训练时)。由于这个原因,通常的做法是将您的输入按顺序分批放入较小的组中。 Tensorflow提供了importing data的指南以及有关batching的特定帮助。