我正在 tensorflow(2.3) 中学习 keras API。在tensorflow 网站上的本指南中,我找到了一个自定义损失函数的示例:
def custom_mean_squared_error(y_true, y_pred):
return tf.math.reduce_mean(tf.square(y_true - y_pred))
Run Code Online (Sandbox Code Playgroud)
在reduce_mean这个自定义损失函数函数会返回一个标量。
这样定义损失函数合适吗?据我所知,y_true和形状的第一维y_pred是批量大小。我认为损失函数应该为批次中的每个样本返回损失值。所以损失函数应该给出一个形状数组(batch_size,)。但是上面的函数为整个批次提供了一个值。
也许上面的例子是错误的?任何人都可以在这个问题上给我一些帮助吗?
ps为什么我认为损失函数应该返回一个数组而不是单个值?
我阅读了Model类的源代码。当您向方法提供损失函数(请注意它是一个函数,而不是损失类)时Model.compile(),该损失函数用于构造一个LossesContainer对象,该对象存储在Model.compiled_loss. 传递给LossesContainer类的构造函数的这个损失函数再次用于构造一个LossFunctionWrapper对象,该对象存储在LossesContainer._losses.
根据LossFunctionWrapper类的源代码,训练批次的整体损失值是通过LossFunctionWrapper.__call__()方法(继承自Loss类)计算的,即它返回整个批次的单个损失值。但是第LossFunctionWrapper.__call__()一个调用该LossFunctionWrapper.call()方法以获得训练批次中每个样本的损失数组。然后将这些损失最后平均以获得整批的单个损失值。这是在LossFunctionWrapper.call()方法的损失函数提供给Model.compile()方法被调用。
这就是为什么我认为自定义损失函数应该返回一系列损失,而不是单个标量值。此外,如果我们Loss为Model.compile()方法编写自定义类call(),我们自定义Loss类的方法也应该返回一个数组,而不是一个信号值。
我在github上打开了一个问题。已确认需要自定义损失函数来为每个样本返回一个损失值。该示例将需要更新以反映这一点。
machine-learning keras tensorflow loss-function tensorflow2.0
我知道System类的System.in是InputStream的具体子类的实例,因为InputStream的read()方法是抽象的,System.in必须覆盖此方法.根据有关InputStream的read()方法的文档:
public abstract int read()抛出IOException
从输入流中读取下一个数据字节.值字节作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1.此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常.
子类必须提供此方法的实现.返回:
数据的下一个字节,如果到达流的末尾,则返回-1.抛出:
IOException - 如果发生I/O错误.
如果到达流的末尾,则read()方法应返回-1.我的问题是,System.in.read()何时返回-1?
以下是示例代码:
import java.io.*;
class SystemInTest{
public static void main(String[] args) throws IOException{
InputStream in = System.in;
//InputStream in = new FileInputStream("h.txt");
int ch = 0;
while((ch = in.read()) != -1){
System.out.println(ch);
}
}
}
Run Code Online (Sandbox Code Playgroud)
运行此代码,然后键入"abc"后跟"Enter",结果是(在Linux下):
97
98
99
10
Run Code Online (Sandbox Code Playgroud)
然后应用程序被阻止并等待另一个输入.但我认为while循环"ch = in.read()"中的语句应继续运行并在读取行终止字符并在控制台上打印10后返回-1.如果是这样,应该终止申请.但它被封锁了.
作为比较,如果我取消注释注释行,使用内容为"abc \n"的文件作为字节输入流,则应用程序将作为期望终止,因为返回-1.
System.in.read()永远不会返回-1,这是真的吗?如果是这样,为什么System.in中的read()方法的实现与InputStream的其他子类(如FileInputStream)不同?
两天前,我在 Windows 计算机上卸载了“Anaconda3 5.2.0”并重新安装了“Anaconda3 2020.07”。按照安装者的建议,我去年安装Anaconda3 5.2.0或者前两天重新安装Anaconda3 2020.07时,系统path环境变量中没有添加Anaconda路径。当我从 Anaconda Prompt 使用 python 时一切顺利,因为 Prompt 已将 Anaconda 目录添加到path变量中。
但是,在 Anaconda Prompt 之外使用时,我发现 Anaconda3 5.2.0 和 Anaconda3 2020.07 之间存在奇怪的不同行为。我有一个bat包含一行的文件C:\Anaconda3\python xxx.py,并在xxx.py其中导入了几个 python 包,包括numpy. 我在使用Anaconda 5.2.0的时候,bat双击这个文件就可以成功执行(相当于C:\Anaconda3\python xxx.py在普通CMD中运行,不知道Anaconda路径)。但是,在我重新安装Anaconda3 2020.07后,DLL load failed运行该bat文件时出现错误,因为numpy无法成功导入该包。
我确定错误是由path变量引起的,我意识到在普通 CMD 中DLL load failed运行时出现错误应该是一个合理的结果,C:\Anaconda3\python xxx.py因为DLL如果没有将 Anaconda 目录添加到pathCMD 中的变量中,就无法找到该错误。
我的问题是为什么它可以在Anaconda 5.2.0下成功执行。Anaconda 5.2.0 有什么特别之处?为什么命令可以 …
我使用的是Ubuntu系统,默认安装了python 3.5。
当我使用venv模块创建虚拟环境时,我在虚拟环境中找不到标准库,只能找到python解释器的二进制文件。但是,当我切换到使用此虚拟环境时,我可以在 python 脚本中导入标准库模块。
那么如何venv运作呢?新创建的虚拟环境只是使用系统python的标准库吗?如果是这样,如果我想创建一个完全独立的虚拟环境怎么办?可以通过venv模块来实现吗?顺便说一句,我conda以前用过。conda可以使用与系统版本不同的python创建虚拟环境。能venv胜任这份工作吗?