我需要更改张量的某些元素的值。我知道什么元素-它们已经在布尔张量中了。
我看不到如何在keras代码中执行此操作。但是如果我使用TensorFlow代码,我会做这样的事情:
在python numpy中,代码如下所示:
x = np.zeros_like(sometensor)
x[sometensor>0.5] = 1.0
Run Code Online (Sandbox Code Playgroud)
在Keras代码中(并且我正在使用TF后端),这是我的最佳尝试(不起作用):
encoder_outputs_bin = k.backend.zeros_like(encoder_outputs, name="encoder_outputs_bin")
point_five = k.backend.constant(0.5, shape=k.backend.shape(encoder_outputs), name="point_five")
positives = k.backend.greater_equal(encoder_outputs, point_five)
encoder_outputs_bin[positives].assign(tf.ones(1)) # TF syntax -- might not work in keras
Run Code Online (Sandbox Code Playgroud) 看起来很简单,但到目前为止还不是这样。尝试了很多事情。我最好的:
echo "low quality not gonna apologize" | jq -r 'gsub("[\\s+]"; " "; "g")'
parse error: Invalid numeric literal at line 1, column 4
Run Code Online (Sandbox Code Playgroud)
目标是用 1 个空格替换任何出现的任何类型的多个空格。请注意,我已经从此流中删除了制表符和换行符。这是 bash shell。在我正在构建的较大应用程序的上下文中,我也没有收到此错误,代码只是简单而安静地没有将多个空格更改为单个空格,不知道为什么。
也许xargs可以这样做也许它不能,但似乎可能.该解决方案根本不需要使用xargs.宁愿所有的bash命令,但没有python.它必须处理大量的输入文件(此处仅显示玩具大小的示例),因此不会尝试将所有文件的内容预先加载到内存中.
起始输入是文本文件'docs.txt'中的5个文件名,所有这些都在一列中:
[ga@sam ~]$ cat docs.txt
a.1.txt
a.2.txt
b.1.txt
c.1.txt
c.2.txt
Run Code Online (Sandbox Code Playgroud)
所需的输出正好是3个文件:输出文件a.doc将按此顺序包含a.1.txt和a.2.txt的内容.输出文件b.doc:b.1.txt的内容.输出文件c.doc:此顺序的文件c.1.txt和c.2.txt的内容.
我目前正在做的是xargs正在接收3行输入,并且gnu paste连接每行上列出的文件的内容.我希望xargs能输出正好3个文本文件,每个xargs输入行一个,如上所示基于每个group-by值进行命名,如上所述,但我没有找到诀窍.
这是迄今为止的代码:
[ga@sam ~]$ cat docs.txt | awk -F. '{ORS=" "}NR==1 {prev=$1; print; next} prev!=$1{print "\n";}{prev=$1}1' | xargs -L 1 paste -s
my cat
has fleas
my dog is clean
the bat
ate a rat
[ga@sam ~]$ cat docs.txt | awk -F. '{ORS=" "}NR==1 {prev=$1; print; next} prev!=$1{print "\n";}{prev=$1}1' # | xargs -L 1 paste -s
a.1.txt a.2.txt
b.1.txt
c.1.txt c.2.txt [ga@sam ~]$
[ga@sam ~]$ cat docs.txt …
Run Code Online (Sandbox Code Playgroud) (这不是调查TDD优点的问题.还有其他地方可以进行此类讨论.提前致谢.)
我一直在遇到太多开发人员,他们都是技术新手,他们也报告了对测试驱动开发和NUnit的不满.
我听到负面评论,如:
" 我不喜欢NUnit. 我在一年前尝试过它,但是我忘记了如何使用它.让我们只使用这个Windows Form应用程序,我刚刚将其作为测试工具编写而成.测试代码无论如何都是一次性代码,什么是差异?无论如何,过去我的方式运作良好."
" 我对TDD保留.在我们最后的项目(这是与TDD我的第一个也是唯一的项目经验,顺便说一下),我们甚至不知道设计是什么了."
"更多的代码评论很糟糕?你疯了吗?如果你不介意,我真的有一些工作要做." (从旧学校的更多评论是更好的评论,你永远不会有太多的评论.)
当一个新手抱怨TDD在他们有史以来第一个使用TDD的项目中"不起作用"时,它真的是TDD失败了,还是开发者自己的技能还不足以取得好成绩?
我怎么能在没有他们讨厌我的情况下沟通呢?
问题的关键在于,可以通过外交方式向开发人员传达什么,以鼓励他们用新的开发技术对他们自己新生和不足的能力进行更诚实的评估,而不会危及我们重要的工作关系?
通常情况下,许多开发人员显然还没有完全掌握TDD的许多重要元素,以便在他们的第一个项目上完成它.
例如,我与之交谈的开发社区中的抱怨通常是:
从来没有尝试过查看或记住代码气味列表.
从来没有尝试过研究重构目录,也没有在实际项目或玩具项目中进行过任何学习.对于那些人来说,可能需要学习更多的OOP,以便能够很好地进行重构.重构远远不仅仅是"重命名方法"和"重命名变量",它们在Visual Studio 2005重构菜单中显示为项目.
从来没有尝试过研究或参与使用紧急设计(通过重构)实现的实际项目,而不是提前使用设计完成整个项目,而不是仅在编写代码后编写单元测试的整个项目,并且知道差异和任何一个之间的权衡和适用性.
他们似乎都已经使用NUnit的,一次,所以无论他们用它做,这是TDD,天哪,他们似乎认为.NUnit或单元测试的存在,并不意味着TDD,但他们甚至不知道甚至不知道.
这些都是聪明人.开发人员是聪明人,因为这是进入整个职业的障碍.你不能在职业中待太久.当然,他们可以理解它,如果他们自己应用一段时间来研究这些材料.
当人们的经验和知识总和显然太弱而无法对方法论或其结果进行评估时,人们如何能够诚实地告诉自己一种方法论是薄弱的?
然而他们确实......我相信这是自我保护行为.或者是懒惰.如果你甚至不能从Fowler重构书的目录中命名三个重构,或者如果你不能说出几个代码气味,你就是重构的新手,也可能是整个TDD方法,你所谓的1或者2个项目经验显然是不够的.
我可以对人们说什么或者我可以引导人们注意哪些材料,让他们做更多关于TDD成功所依赖的技能的知识,例如:
每个主题都有完整的书籍,有些非常好.也许有一些更易于学习的技巧?我可以通过榜样教导人们,但我给自己的时间是有限的,而且,我在所有这些技术中也不是黑带.
而且,他们在一起.没有彼此,他们的工作效果不佳.单元测试和重构像花生酱和果冻一样.如果你不能进行grep单元测试,那么你的重构肯定不会有很好的结果!(问我为什么如果你还不知道,我很乐意向新人解释.)
无论我做什么或说什么,它都不会适得其反:
我不能疏远我的同事们的TDD概念 ; 而且,我不能疏远我的同事. 我将不得不每周与他们一起工作多年.
特别难以让其他长期高级开发人员感到不安,他们已经确立了自己在编程的其他方面非常精通.他们理所当然地为自己过去的成就感到自豪,但他们的自负或他们在编程中掌握所有事物的自我概念,几乎无法克服,不会伤害他们的感情.一些高级开发人员尚未准备好面对他们不了解一些他们应该向别人学习的新技术.在编程时,高级开发人员可以更加习惯和舒适地成为会议室中的专家,有时他们要求被视为这样,即使在涉及TDD及相关技术和技术时完全不切实际.
我很高兴地报告说,在编写结构化自动化单元测试时,我已经取得了相当不错的成功,通过使用配对编程,一对一.我认为,结对编程为受训者提供了一些真实生活的例子和经验,以及对更有经验和知识渊博的从业者的直接指导.
但结对编程还不够.他们需要学习更多的重构,代码气味,OOP概念和OOD&A概念,而且我不能在一个项目中教授所有这些,甚至不是很接近.
我理解在没有制作整个字典的新副本的情况下有效地迭代字典:
for k,v in iter(d.items()):
print("k={} v={}".format(k,v)) # or do whatever. This is just placeholder code.
Run Code Online (Sandbox Code Playgroud)
问:python3.5.4是否有某种方法可以直接给我v值,作为指向它或引用的指针,而不是在我的for循环中将值复制到局部变量v?如果v是一个大数组,这可以帮助我,因为每个v是一个numpy数组,在我的应用程序中有10 ^ 5或10 ^ 6个元素甚至更多,而我的迭代器循环有数百万次迭代.在其他语言中,我使用了引用和指针,但我没有在python3.5.4中使用它们(据我所知).
感谢您分享您的专业知识.
更新:
这是一些numpy python代码,我曾经证明v不是本地副本,而是对numpy数组的引用.这对我来说是个好消息.这证实了获胜的回答者所说的话.感谢获胜的回答者和所有其他声称相同的评论者.我很高兴!! 再次感谢所有参与者.
import numpy as np
x = np.array([8,6,7,5,3,0,9])
d = {}
d["mouse"] = x
for k,v in iter(d.items()):
v[1] = 2
print(d)
Run Code Online (Sandbox Code Playgroud)
字典现在在一个数组位置包含一个新值.这意味着v [1] = 2行在原始数组上运行,而不是数组的本地副本.
python ×2
awk ×1
bash ×1
jq ×1
keras ×1
linux ×1
methodology ×1
nunit ×1
python-3.x ×1
regex ×1
tdd ×1
tensorflow ×1
xargs ×1