Tensorflow,用Dataset.from_generator替换feed_dict

时间:2018-03-26 00:27:16

标签: tensorflow

我有一个现有的模型,它在循环中读取文本文件,结果输入和输出如下所示:

    self.X = tf.placeholder('float32', shape=[None, None, max_word_length, ALPHABET_SIZE], name='X')
    self.Y = tf.placeholder('float32', shape=[None, 2], name='Y')
    ...
    _, c, a = sess.run([optimizer, cost, acc], feed_dict={self.X: batch_x, self.Y: batch_y})

但是现在我想转换为使用Dataset.from_generator方法,为了开始我在我的文本阅读器周围创​​建了一个包装类来实现生成器函数,这一切都运行良好,并按预期返回输入数据:

    dsr = DatasetReader(TRAIN_SET, BATCH_SIZE, max_word_length)
    ds = tf.data.Dataset.from_generator(dsr.generator, (tf.float32, tf.float32))
    ds = ds.prefetch(2)
    dsi = ds.make_one_shot_iterator()
    self.X, self.Y = dsi.get_next()
    _, c, a = sess.run([optimizer, cost, acc])

但是我收到了错误

InvalidArgumentError: You must feed a value for placeholder tensor 'X' with dtype float and shape [?,?,16,70]

我认为这是因为我已将X / Y输入声明为占位符,文档说明必须通过feed_dict提供值。

所以我有几个问题:

  1. 如何从feed_dict和占位符转换为正确使用from_generator?我想保留张量X和Y的命名,以便我能够在推理过程中用这个名称输入它们

  2. 更一般地说,我没有看到数据集及其迭代器如何链接到会话,它是否纯粹通过迭代器输出作为图形中其他操作的输入来链接?

    < / LI>

1 个答案:

答案 0 :(得分:2)

你可以放弃占位符。如果您定义了占位符,那么您做错了。应该就是这样,就像你拥有它一样:

//Process to upload and Preview Images being uploaded   
if (window.File && window.FileList && window.FileReader) {
    $("#files").on("change", function(a) {
        var files = a.target.files,
        filesLength = files.length;
        var imgPath = $(this)[0].value;
        var extn = imgPath.substring(imgPath.lastIndexOf('.') + 1).toLowerCase();
        if (extn == "gif" || extn == "png" || extn == "jpg" || extn == "jpeg") {
             if (typeof (FileReader) != "undefined") {                  
                for (var i = 0; i < filesLength; i++) {

                    var f = files[i];
                    var fileReader = new FileReader();
                    fileReader.fileName = files[i].name;
                    fileReader.onload = (function(e) {
                        var file = e.target;

                            $("<div class=\"pip\">" +
                            "<img class=\"imageThumb\" src=\"" + e.target.result + "\" title=\"" + file.name + "\"/>" + 
                            "<br />" + "<span class=\"fontImage\">" + file.fileName + "</span><span class=\"remove\">X</span>" + "</div>").insertAfter("#files");
                            $('#files').val('');

                        /*Increment/Decrement Count of files loaded*/
                        var c = $(".pip").length;

                        if (c == 1)
                            $("#replaceText").text(c + " image file uploaded");
                        if (c > 1)
                            $("#replaceText").text(c + " image files uploaded");

                        $(".remove").on('click', function(){
                            $(this).parent(".pip").remove();
                                if($(".pip").length > 1){   
                                    c--;
                                    $("#replaceText").text(c + " image files uploaded");
                                }
                                else if($(".pip").length == 1){
                                    c--;
                                    $("#replaceText").text(c + " image file uploaded");
                                }
                                else{
                                    $("#replaceText").text("No file chosen");
                                }

                        });
                        /********************************/
                        if($(".pip").length > 1){
                            $("#delete_all").show();
                            $("#delete_all").css('margin-top',"10px");
                        }
                        else
                            $("#delete_all").hide();
                    });         
                    fileReader.readAsDataURL(f);
                }
            }
        }
        else {
            //alert("WARNING: Invalid image extension(s)");
            document.getElementById("modal-title").innerHTML = "<h4>WARNING: Invalid image extension(s).</h4>";
            document.getElementById("modal-body").innerHTML = "<p>Upload a image that has a valid extension(s).</p>";
            document.getElementById("myform").focus();
            $('#files').val('');
            $("#invalidModal").modal();

            return false        
        }
   });
} 
else {
    //alert("Your browser doesn't support to File API.");
    document.getElementById("modal-title").innerHTML = "<h4>ERROR: Does not support API</h4>";
    document.getElementById("modal-body").innerHTML = "<p>Your browser doesn't support to File API. Update your current browser.</p>";
    document.getElementById("myform").focus();
    $("#invalidModal").modal();

    return false
}

代码中的某些内容似乎是在尝试使用self.X, self.Y = dsi.get_next() # continue your network

中的self.X时尝试使用占位符
  

如何从feed_dict和占位符转换为使用   from_generator正确吗?我想保留张量X的命名   和Y所以我能够在推理期间用这个名字喂它们

您可以使用dsi.get_next()

命名您的发电机输出
  

更一般地说,我没看到数据集及其迭代器是如何链接的   到会话,它是否完全依靠迭代器输出链接   被用作图表中其他操作的输入?

迭代器是图中的一个元素,它就像tensorflow中的每个其他操作一样,当它是计算结果所需的依赖项的一部分时,它执行其定义的操作。