我有一个现有的模型,它在循环中读取文本文件,结果输入和输出如下所示:
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提供值。
所以我有几个问题:
如何从feed_dict和占位符转换为正确使用from_generator?我想保留张量X和Y的命名,以便我能够在推理过程中用这个名称输入它们
更一般地说,我没有看到数据集及其迭代器如何链接到会话,它是否纯粹通过迭代器输出作为图形中其他操作的输入来链接?
< / LI> 醇>答案 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中的每个其他操作一样,当它是计算结果所需的依赖项的一部分时,它执行其定义的操作。