发新帖

关于tensorflow如何将自己的数据导入

[复制链接]
2867 21

快来加入 TensorFlowers 大家庭!

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
通过学习书籍我使用过了minst数据集,现在我想用自己的数据跑一下神经网络,老师给的数据是在csv文件中的,请问各位大神如何导入和使用自己的数据呀,minst数据包是TFRecord数据类型的吗?我可以把自己的数据封装成类似minst包类型的吗,因为我觉得使用minst.train.nextbatch等api特别的方便。神经网络基本搭好了,就差把数据放进去了,求大神帮帮忙(手机码字如果有错误请见谅)


yunhai_luo已获得悬赏 10 金币+10 金币

最佳答案

tf中的minst数据集用的是单独的导入脚本,所以不一定适用于你的数据。导入CSV的具体做法取决于你模型需要的输入格式,常见的一个想法是把数据导入成numpy array,好处是你不需要安装学习pandas,而numpy是tf必需的。 ...
本楼点评(0) 收起

精彩评论21

Loner  TF荚荚  发表于 2018-4-18 19:25:55 | 显示全部楼层
很多方式啊   我觉得目前来说你去学习下pandas是挺不错的
本楼点评(0) 收起
Oreo.  TF豆豆  发表于 2018-4-18 19:33:42 来自手机  | 显示全部楼层
Loner 发表于 2018-4-18 19:25
很多方式啊   我觉得目前来说你去学习下pandas是挺不错的

今天老师给了一篇全英论文
PANDA:Facilitating Usable AI Development
是这个东西吗
本楼点评(0) 收起
Oreo.  TF豆豆  发表于 2018-4-19 00:15:33 来自手机  | 显示全部楼层
大佬们求帮忙呀,做不出来周五就要被老师怼了
本楼点评(0) 收起
yunhai_luo  TF豆豆  发表于 2018-4-19 06:55:13 | 显示全部楼层
本帖最后由 yunhai_luo 于 2018-4-19 12:37 编辑

tf中的minst数据集用的是单独的导入脚本,所以不一定适用于你的数据。导入CSV的具体做法取决于你模型需要的输入格式,常见的一个想法是把数据导入成numpy array,好处是你不需要安装学习pandas,而numpy是tf必需的。当然pandas是很强大的,学会是有好处的。举例说明CSV导入成两个numpy array:
  1. import numpy as np
  2. import pandas as pd

  3. # 这段是做一个测试CSV,没有实际意义。
  4. df = pd.DataFrame(np.arange(15).reshape(5,3), columns=['x1', 'x2', 'y'])
  5. df.to_csv('test.csv', index=False)

  6. # 读入所有数据,去掉表头(一行)
  7. data = np.genfromtxt('test.csv', delimiter=",", skip_header=1)
  8. # 除去最后一列,其余都是features
  9. features = data[:, 0:-1]
  10. # 最后一列是targets
  11. targets = data[:, -1]

  12. # 输出确认
  13. print(features, targets)
复制代码
使用tf.data的想法也是很好的,冒昧借用这个思路更新一下代码:
  1. import tensorflow as tf
  2. # 读入所有文本数据,去掉表头(一行)
  3. dataset = tf.data.TextLineDataset('test.csv').skip(1)

  4. def _parse_function(line):
  5.     # 默认空缺数据
  6.     default_val = 0
  7.     # 总列数
  8.     num_cols = 3
  9.     data = tf.decode_csv(line, [[default_val] for i in range(num_cols)])
  10.     # 除去最后一列,其余都是features
  11.     features = tf.stack(data[0:-1])
  12.     # 最后一列是targets
  13.     targets = data[-1]
  14.     return features, targets

  15. dataset = dataset.map(_parse_function)
  16. batched_dataset = dataset.batch(2)
  17. # 以下迭代器可以用来输入模型数据
  18. iterator = batched_dataset.make_one_shot_iterator()

  19. # 以下代码为检验迭代器结果
  20. next_element = iterator.get_next()
  21. with tf.Session() as sess:
  22.     print(sess.run(next_element))
  23.     print(sess.run(next_element))
  24.     print(sess.run(next_element))
复制代码

本楼点评(0) 收起
周军  TF荚荚  发表于 2018-4-19 07:17:10 来自手机  | 显示全部楼层
可以使用最新的tf.data来进行数据的导入
本楼点评(2) 收起
  • yunhai_luo很好的想法!冒昧借用您的想法更新了一下我的答案代码。
    2018-4-19 12:37 回复
  • J.F.Liu回复 yunhai_luo :厉害了 这种回复最有价值
    2018-4-30 17:37 回复
Oreo.  TF豆豆  发表于 2018-4-19 07:52:29 来自手机  | 显示全部楼层
yunhai_luo 发表于 2018-4-19 06:55
tf中的minst数据集用的是单独的导入脚本,所以不一定适用于你的数据。导入CSV的具体做法取决于你模型需要的 ...

学习到了,谢谢啦!我好好看看np和pd
本楼点评(0) 收起
yesseecity  TF荚荚  发表于 2018-4-19 08:43:27 | 显示全部楼层
我是用pandas  包成dataset
再丟給 tf.estimator

可以參考官方教學
https://www.tensorflow.org/get_started/premade_estimators
本楼点评(0) 收起
Oreo.  TF豆豆  发表于 2018-4-19 23:23:57 | 显示全部楼层
本帖最后由 Oreo. 于 2018-4-20 01:08 编辑
yunhai_luo 发表于 2018-4-19 06:55
tf中的minst数据集用的是单独的导入脚本,所以不一定适用于你的数据。导入CSV的具体做法取决于你模型需要的 ...

用第二个代码成功实现了!!!csv文件内容为:
姓名学号 年龄
1
1
1
2
2
2
3
3
3
4
4
4
5
5
5
6
6
6
7
7
7
8
8
8
最后测试输出为:
  1. #bacth = 2
  2. (array([[1, 1],
  3.        [2, 2]]), array([1, 2]))
  4. (array([[3, 3],
  5.        [4, 4]]), array([3, 4]))
  6. (array([[5, 5],
  7.        [6, 6]]), array([5, 6]))
  8. (array([[7, 7],
  9.        [8, 8]]), array([7, 8]))
复制代码

谢谢指点!!!{:tongue:}

------------------------------------------------
2018年4月20日00:49:19

还有一个小点想问一下
我用的还是上面的那个csv文件内容

  1. x, y = iterator.get_next()
  2. with tf.Session() as sess:
  3.     print(sess.run(y))
  4.     print(sess.run(x))
复制代码


之后的输出是
  1. [1 2]
  2. [[3 3]
  3. [4 4]]
复制代码


如果我更换x,y的输出顺序的话输出结果是
  1. [[1 1]
  2. [2 2]]
  3. [3 4]
复制代码


这样就表明我的x和y不是同一组数据的failure和target,请问要怎么解决这种情况呀{:sweat:}
-----------------------------------------------

2018年4月20日01:07:47

暂时想了一个小想法就是把特征值和标签分开两个csv文件中
但这样算上train validation 和 test 就要 6个 csv文件了。。
本楼点评(0) 收起
yunhai_luo  TF豆豆  发表于 2018-4-20 01:32:20 | 显示全部楼层
本帖最后由 yunhai_luo 于 2018-4-20 01:34 编辑
Oreo. 发表于 2018-4-19 23:23
用第二个代码成功实现了!!!csv文件内容为:
最后测试输出为:

你得到的结果是正确的。你每执行一次sess.run(x)sess.run(y)都是执行了一次iterator.get_next()。下面解释你的第一段代码,第二段同理。x, y = iterator.get_next()
  1. with tf.Session() as sess:
  2.     print(sess.run(y)) # 执行了iterator.get_next()相关的一次计算,取出了[[1, 1], [2, 2]]和[1, 2],[1, 2]是y的结果并从sess.run返回,x你没要
  3.     print(sess.run(x)) # 第二次执行了iterator.get_next()相关的一次计算,取出了第二组[[3, 3], [4, 4]]和[3, 4],[[3, 3], [4, 4]]是x的结果并从sess.run返回,y你没要
复制代码

显然,如果是print(sess.run((x, y)))和print(sess.run((y, x))),那么结果就是一致的,而且x和y会是对应的。


本楼点评(0) 收起
Oreo.  TF豆豆  发表于 2018-4-20 08:36:34 | 显示全部楼层
yunhai_luo 发表于 2018-4-20 01:32
你得到的结果是正确的。你每执行一次sess.run(x)或sess.run(y)都是执行了一次ite ...

可以啦可以啦,谢谢大牛指点!!!
本楼点评(0) 收起
Oreo.  TF豆豆  发表于 2018-4-20 09:41:42 | 显示全部楼层
本帖最后由 Oreo. 于 2018-4-20 10:25 编辑
yunhai_luo 发表于 2018-4-20 01:32
你得到的结果是正确的。你每执行一次sess.run(x)或sess.run(y)都是执行了一次ite ...

还有一个小问题!

如果在计算正确率的时候要使用到dataset的所有feature和target
  1. validata_feed = {x: dataset_feature, y: dataset_target}
  2. validate_acc = sess.run(accuracy, feed_dict=validate_feed)
复制代码
那么要怎么才能获得'dataset_feature'和'dataset_target'呢?

用mnist来示例,差不多就是这样的
  1. validate_feed = {x: mnist.validation.images,y_: mnist.validation.labels}
  2. test_feed = {x: mnist.test.images, y_: mnist.test.labels}
复制代码


也不知道自己表达的清不清楚,还请大牛指点一下

把这个问题解决了,感觉自己也能拿数据来跑一下了

----------------------------------------------------------------
我看了一下您第一段代码,好像用第一段代码的话就可以获得所有的feature和target,但是用第一段代码的话就不像第二段代码一样可以获得一个迭代器,同时也能有类似mnist.next_batch的功能(只是个人的见解)
那用第二段的方法,可以从dataset中获得所有的feature和target吗?

----------------------------------------------------------------
我看了一下书还有找了一些资料,发现正确率其实不用用到所有的feature和target,只要最后把预测值和label放到加到两个不同数组中去比较就可以啦!!
本楼点评(0) 收起
Tensorflower_攸岚  TF荚荚  发表于 2018-4-20 12:49:11 来自手机  | 显示全部楼层
喂一组数据:
x = tf.placeholder(tf.float32, shape=(1, 2))
sess.run(y, feed_dict={x: [[0.5,0.6]]})
喂多组数据:
x = tf.placeholder(tf.float32, shape=(None, 2))
sess.run(y, feed_dict={x: [[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})
本楼点评(0) 收起
yunhai_luo  TF豆豆  发表于 2018-4-20 13:45:58 | 显示全部楼层
本帖最后由 yunhai_luo 于 2018-4-20 13:50 编辑
Oreo. 发表于 2018-4-20 09:41
还有一个小问题!

如果在计算正确率的时候要使用到dataset的所有feature和target

很高兴能帮到你,可惜我不是什么大牛,所以你也别期望太高。

我不是很确定你想问什么,我猜想你是想问拆分训练集和验证集的问题。关于这一点我个人觉得常见做法之一是先用sklearn.model_selection.train_test_split拆分原始数据,然后再分别封装成tf.data.Dataset。就我所知,好像没有很好的直接拆分tf.data.Dataset的办法。在这个过程中,既需要你会用scikit-learn,同时也可能会用到numpy相关操作,比如我第一段代码中的一些操作。

这也就说到了关于两个方法的问题,我简单说说自己的感受,第一个方法更加低级一些,代码可能会稍稍复杂一些,但操作更灵活。第二个方法更高级,也就是代码更集成、更直观、更容易理解,但如果你有新的需求就比较麻烦了。除此之外,第二个方法可能还有一个好处(细节我不太懂,所以我不是很确定,如果有错请大家不吝赐教),那就是所有操作都放在了计算图中。第一个方法不论数据有多大,都要真正地读入到features和targets中,而第二个方法真正的数据操作发生在计算图中,由tensorflow核心的C++代码实现,效率会更高。

至于正确率的计算,取决于你的模型和计算图。如果你想要在计算图中计算正确率,就要把相应的labels/targets送进去,比如用Estimator.evaluate。

本楼点评(0) 收起
Oreo.  TF豆豆  发表于 2018-4-21 00:08:44 | 显示全部楼层
本帖最后由 Oreo. 于 2018-4-21 02:15 编辑
yunhai_luo 发表于 2018-4-20 13:45
很高兴能帮到你,可惜我不是什么大牛,所以你也别期望太高。

我不是很确定你想问什么,我猜想你是想问拆 ...

--------------------------------------------------------------

这个问题我已经解决了,实验可知train_label_batch和train_feature_batch是同一组的
现在又在解决权重为nan的问题

又有一个问题要麻烦一下大佬了。。。
  1. #定义数据迭代器
  2. train_iteratior = train_dataset.make_one_shot_iterator()
  3. train_feature_batch, train_label_batch = train_iteratior.get_next()

  4. #计算y
  5. y = inference(train_feature_batch, weights1, biases1, weights2, biases2)

  6. # 计算交叉熵及其平均值
  7. cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=train_label_batch)
  8. cross_entropy_mean = tf.reduce_mean(cross_entropy)
复制代码

在我计算交叉熵的时候,调用上述tf.nn.sparse_softmax_cross_entropy_with_logits函数
同时会计算y和train_label_batch
但是y = inference(train_feature_batch, weights1, biases1, weights2, biases2)
这样train_label_batch和train_feature_batch又不是同时调用的,这样的话他们就不是一组batch的feature和labele,这个问题要怎么解决呀。。。




本楼点评(0) 收起
yunhai_luo  TF豆豆  发表于 2018-4-21 02:42:10 | 显示全部楼层
本帖最后由 yunhai_luo 于 2018-4-21 02:43 编辑
Oreo. 发表于 2018-4-21 00:08
--------------------------------------------------------------

这个问题我已经解决了,实验可知train ...

你哪个问题解决了?总之我解释一下吧:
从你现有的部分代码判断,你的计算图中只执行了一次train_feature_batch, train_label_batch = train_iteratior.get_next(),这样图中其他地方用到的train_feature_batch和train_label_batch不论几次都是一样且对应的。你可能跟之前你说的sess.run(y)和sess.run(x)混淆了,那里是算了两次计算图,所以出现了两组x, y,而这里你是同一次对计算图的计算,并且图中只有一次train_iteratior.get_next(),图中train_feature_batch和train_label_batch的引用不是调用计算,我猜应该两者的值应该不变且一致。希望你的实验可以验证我的猜想。

本楼点评(1) 收起
itodayer  TF芽芽  发表于 2018-4-23 09:41:17 | 显示全部楼层
tf.data
本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-23 09:45:10 | 显示全部楼层
yunhai_luo 发表于 2018-4-20 01:32
你得到的结果是正确的。你每执行一次sess.run(x)或sess.run(y)都是执行了一次ite ...

666,大神,学习到了
本楼点评(0) 收起
舟3332  TF芽芽  发表于 2018-4-23 20:33:42 | 显示全部楼层

能详细解释一下吗?
本楼点评(0) 收起
M丶Sulayman  TF豆豆  发表于 2018-4-28 12:13:55 | 显示全部楼层
问题解决了,麻烦设置成已解决,方便大家阅读
本楼点评(0) 收起
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

主题

帖子

58

积分
快速回复 返回顶部 返回列表