小编paf*_*afi的帖子

带有自定义对象的 Keras load_model 无法正常工作

环境

正如标题中已经提到的,在尝试加载保存的模型时,我的自定义损失函数出现了问题。我的损失如下:

def weighted_cross_entropy(weights):

    weights = K.variable(weights)

    def loss(y_true, y_pred):
        y_pred = K.clip(y_pred, K.epsilon(), 1-K.epsilon())

        loss = y_true * K.log(y_pred) * weights
        loss = -K.sum(loss, -1)
        return loss

    return loss

weighted_loss = weighted_cross_entropy([0.1,0.9])
Run Code Online (Sandbox Code Playgroud)

所以在训练过程中,我将该weighted_loss函数用作损失函数,一切运行良好。训练完成后,我.h5使用model.save来自 keras API的标准函数将模型保存为文件。

问题

当我尝试通过加载模型时

model = load_model(path,custom_objects={"weighted_loss":weighted_loss})
Run Code Online (Sandbox Code Playgroud)

我得到一个ValueError告诉我损失未知的消息。

错误

错误消息如下所示:

File "...\predict.py", line 29, in my_script
"weighted_loss": weighted_loss})
File "...\Continuum\anaconda3\envs\processing\lib\site-packages\keras\engine\saving.py", line 419, in load_model
model = _deserialize_model(f, custom_objects, compile)
File "...\Continuum\anaconda3\envs\processing\lib\site-packages\keras\engine\saving.py", line 312, in _deserialize_model
sample_weight_mode=sample_weight_mode)
File "...\Continuum\anaconda3\envs\processing\lib\site-packages\keras\engine\training.py", …
Run Code Online (Sandbox Code Playgroud)

python machine-learning keras loss-function

9
推荐指数
1
解决办法
1万
查看次数

启动VSCode时自动激活conda环境

环境

假设我有一个名为 的项目my_project,它使用来自名为 的特定 conda 环境的 python 解释器my_env.vscode 当我设置项目的解释器时,我将在目录中获得以下 settings.json 文件my_project

{
    "python.pythonPath": "<path to conda>/envs/my_env/bin/python"
}
Run Code Online (Sandbox Code Playgroud)

问题

通过此配置,我希望my_env每次打开 VSCode 时都会在终端中自动激活my_project。但通常当我打开时,终端中my_project仅激活 anaconda 环境。base为了激活my_env我有不同的选项,这些选项都是手动的。

  1. conda activate my_env
  2. 按下strg+shift+p并执行create new integrated terminal
  3. 启动调试会话

可能还有更多的方法可以做到这一点。

问题

我怎样才能避免这些东西,这样my_env当我打开my_project.

更多信息

  • 操作系统:Linux
  • VS代码:1.36
  • 康达:2010年7月4日

python anaconda visual-studio-code

5
推荐指数
1
解决办法
8432
查看次数

scipy 和 numpy sobel 梯度计算的区别

环境

我目前正在尝试使用索贝尔滤波器计算图像梯度。起初我scipy.ndimage.sobel通过以下方式使用函数

sx = ndimage.sobel(im, axis=0,mode="constant")
sy = ndimage.sobel(im, axis=1,mode="constant")
sobel = np.hypot(sx,sy)
sobel *= 255 / np.max(sobel)
Run Code Online (Sandbox Code Playgroud)

然而,这仅将 (3x3) 索贝尔滤镜应用于我的图像,但我想尝试更大的滤镜。numpy因此我尝试用和计算图像梯度scipy.signal。首先我再次尝试了(3x3)过滤器。

filter_x = np.array([[-1,0,1],[-2,0,2],[-1,0,1]], dtype=np.float)
filter_y = np.array([[1,2,1], [0,0,0], [-1,-2,-1]], dtype = np.float)
sx = signal.convolve2d(im,filter_x,mode="same",boundary="symm", fillvalue=0)
sy = signal.convolve2d(im,filter_y,mode="same",boundary="symm", fillvalue=0)
sobel = np.hypot(sx,sy)
sobel *= 255 / np.max(sobel)
Run Code Online (Sandbox Code Playgroud)

正如这篇文章中的建议。

问题

不幸的是,这两种方法会导致完全不同的结果,这在这个问题中已经提到过。所以我更深入地挖掘了一下,发现scipy.ndimage.sobel使用该correlate1d函数而不是convolve2d或类似的东西(源代码)。不幸的是,无法查看该函数的源代码correlate1d,因为它的功能隐藏在_nd_image.pyd我的 conda 环境的 site-packages 文件夹中已编译的文件内。所以我的问题来了:

问题

有谁明确知道,到底是由什么计算的correlate1d …

python numpy scipy

4
推荐指数
1
解决办法
5654
查看次数

“conda clean --all”会影响我已经存在的 conda 环境吗?

我创建了一个新的 conda 环境,但是当我尝试通过以下方式安装 gdal 时

conda install -c anaconda gdal
Run Code Online (Sandbox Code Playgroud)

我收到了 CondaVerificationError。在这篇文章之后,我应该做类似的事情

conda clean --all
Run Code Online (Sandbox Code Playgroud)

据我所知,这将删除存储在 tarball 中的所有缓存包。这对我已经存在的其他环境有什么影响吗?或者这些球的唯一目的是您不必多次下载相同的软件包,并且当新环境想要安装一个已经作为 tarball 存在的软件包时,它会使用 tarball 解压缩软件包?

anaconda

2
推荐指数
1
解决办法
4082
查看次数

如何在协程中制作Toast消息?

环境

假设我有一个创建 toast 消息的函数

fun makeToast(success: Boolean){
    if (success){
        Toast.makeText(someContext, "Success", Toast.LENGHT_SHORT).show()
    }
}
Run Code Online (Sandbox Code Playgroud)

该函数用于另一个被挂起的函数,例如

suspend fun makeRequest(){
    success = doSomeHTTPRequest()
    makeToast(success)
}
Run Code Online (Sandbox Code Playgroud)

当我使用这个函数来执行请求时,我将在 IO 协程中执行它,例如 ie

CoroutineScope(IO).launch{
    makeRequest()
}
Run Code Online (Sandbox Code Playgroud)

问题

像上面建议的那样做会导致:

java.lang.NullPointerException: Can't toast on a thread that has not called Looper.prepare()

问题

解决此问题的最佳做法是什么?直接的方法是更改makeToast​​为

fun makeToast(success: Boolean){
    if (success){
        Looper.prepare()
        Toast.makeText(someContext, "Success", Toast.LENGHT_SHORT).show()
        Looper.loop()
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这感觉很尴尬,因为这意味着该函数makeToast已经知道它可能不会在主线程中调用,在我看来,这会产生奇怪的耦合。

android kotlin kotlin-coroutines

0
推荐指数
1
解决办法
6544
查看次数