报错1:NansException: A tensor with all NaNs was produced in Unet. This could be either because there's not enough precision to represent the picture, or because your video card does not support half type. Try setting the "Upcast cross attention layer to float32" option in Settings > Stable Diffusion or using the --no-half commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.

Unet是一种用于图像分割的神经网络架构。它由一个编码器-解码器结构组成,其中相应的层之间有跳跃连接。编码器逐渐降低输入图像的空间分辨率,而解码器上采样特征图并恢复原始分辨率。

一个全是NaN的张量意味着张量中的值不是数字,而是未定义或无效的。这可能有各种原因,比如除以零、溢出、下溢或数据类型错误。

一个可能的解决方案是将交叉注意力层提升为float32,这是一种比half(float16)更高精度的数据类型。这可以防止数值错误并提高计算的准确性。你可以通过在设置>稳定扩散中设置“将交叉注意力层提升为float32”选项或在运行Unet时使用--no-half命令行参数来实现这一点。

另一个可能的解决方案是使用支持half类型的不同显卡,这是一种低精度的数据类型,可以减少内存使用和加速计算。但是,这可能取决于你的硬件和预算,可能不可行或不可取。

你也可以通过使用--disable-nan-check命令行参数来禁用NaN检查。这将忽略任何NaN值并继续执行。但是,这不推荐,因为它可能导致不正确的结果或后续的错误。

交叉注意力层是Unet中的一个模块,它可以在编码器和解码器之间传递信息,从而提高分割性能。交叉注意力层可以根据输入图像的内容自动调整特征图的权重,从而过滤掉不相关的特征。

如果你在设置>稳定扩散中设置了“将交叉注意力层提升为float32”选项或在运行Unet时使用了--no-half命令行参数,但仍然出现NaNs的错误,可能有以下几种原因:

- 你的显卡不支持float32类型,或者显存不足以存储高精度的张量。

- 你的输入图像有异常值,比如负数、无穷大或非数字,导致计算出错。

- 你的网络参数有错误,比如学习率过大、激活函数不合适或损失函数不稳定,导致梯度爆炸或消失。

为了解决这个问题,你可以尝试以下几种方法:

- 检查你的显卡是否支持float32类型,并确保显存足够。如果不支持或不足,你可以考虑更换显卡或降低输入图像的分辨率。

- 检查你的输入图像是否有异常值,并进行预处理,比如归一化、裁剪或填充。

- 检查你的网络参数是否合理,并进行调整,比如降低学习率、更换激活函数或损失函数。


报错2:NansException: A tensor with all NaNs was produced in VAE. This could be because there's not enough precision to represent the picture. Try adding --no-half-vae commandline argument to fix this. Use --disable-nan-check commandline argument to disable this check.

VAE是一种变分自编码器,它是一种生成模型,可以从输入图像中提取隐含的潜在变量,并用它们重建图像。

一个全是NaN的张量意味着张量中的值不是数字,而是未定义或无效的。这可能是因为没有足够的精度来表示图片,导致计算出错。

一个可能的解决方案是添加--no-half-vae命令行参数,这可以关闭半精度模式,使用更高精度的数据类型来运行VAE。这可以防止数值错误并提高计算的准确性。

另一个可能的解决方案是使用--disable-nan-check命令行参数,这可以禁用NaN检查,忽略任何NaN值并继续执行。但是,这不推荐,因为它可能导致不正确的结果或后续的错误。

为了添加命令行参数,你需要找到你的启动文件.bat,把后缀改成.txt后打开编辑它,在最后一行加上你想要的参数。例如,如果你想要添加--no-half-vae参数,你可以在最后一行加上:python main.py --no-half-vae,然后保存文件,并把后缀改回.bat,再运行它。