我正在使用jupyter实验室,我无法添加conda环境.我的想法是从我的基础环境中启动jupyter实验室,然后能够选择我的其他conda envs作为内核.
我安装了nb_conda_kernels软件包,这应该是这样做的,但它不能按我的意愿工作.实际上,让我们假设我创建了一个新的conda环境,然后我从基础启动jupyter实验室,我无法将新环境视为可用内核.
我找到了一个"修复",它每次都有效,但根本不方便.如果我在我的新环境中安装jupyter笔记本,那么从这个新环境启动一个jupyter笔记本,关闭它,返回基础环境,然后从基础环境启动jupyter lab,我的新环境可以作为jupyter实验室的内核使用.
如果你知道如何在没有这个"修复"的情况下使它工作,我将非常感激.
假设我有一个字典:
d = {'a': 3, 'b':4}
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数f,该函数执行的功能与此函数完全相同:
def f(x, a=d['a'], b=d['b']):
print(x, a, b)
Run Code Online (Sandbox Code Playgroud)
(不一定要打印,但是可以对变量进行一些操作并直接从其名称中调用)。
但是我想直接从字典创建此函数,也就是说,我想拥有一个看起来像的东西
def f(x, **d=d):
print(x, a, b)
Run Code Online (Sandbox Code Playgroud)
并且其行为类似于先前定义的功能。我的想法是,我有一个很大的字典,其中包含函数参数的默认值,并且我不想这样做
def f(a= d['a'], b = d['b'] ...)
Run Code Online (Sandbox Code Playgroud)
我不知道在python中是否有可能。任何见识表示赞赏!
编辑:想法是能够打电话f(5, a=3)。Edit2:问题不在于将字典中存储的参数传递给函数,而是要定义一个函数,其参数名称和默认值存储在字典中。
我想FileUpload在 jupyter 实验室中使用小部件。我的笔记本单元中有以下几行代码:
uploader = widgets.FileUpload()
uploader
Run Code Online (Sandbox Code Playgroud)
在 jupyter notebook 中,单元格的输出是一个可点击的按钮,我可以用它来上传文件。在 jupyter 实验室中,输出如下:
FileUpload(value={}, description='Upload')
Run Code Online (Sandbox Code Playgroud)
这是有关uploader对象的信息:
Type: FileUpload
String form: FileUpload(value={}, description='Upload')
File: ~/miniconda3/envs/fastai2/lib/python3.7/site-packages/ipywidgets/widgets/widget_upload.py
Run Code Online (Sandbox Code Playgroud)
是否可以让这个小部件在 jupyter 实验室上工作?如果是这样,我应该如何进行?
使用以下代码:
import types
class Foo():
def __getitem__(self, x):
return x
def new_get(self, x):
return x + 1
x = Foo()
x.__getitem__ = types.MethodType(new_get, x)
Run Code Online (Sandbox Code Playgroud)
x.__getitem__(42)将返回43,但x[42]将返回42。
有没有一种方法可以__getitem__在Python实例级别进行覆盖?
在大多数情况下,使用jupyter实验室/笔记本时,我将这两行放在笔记本的第一个单元格中:
%reload_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)
这些通常使我可以修改导入的脚本并使用它们,而不必重新导入它们或重新启动内核。昨天,我遇到了一个问题:我修改了脚本,在笔记本上执行一个单元格给了我一个错误。重新启动内核并重做导入可修复它。我调查了此问题,并尝试创建一个最小的示例。
假设您有以下工作目录:
+-- nb.ipynb
+-- scripts
| +-- __init__.py
| +-- script1.py
Run Code Online (Sandbox Code Playgroud)
笔记本由三个单元组成:
%reload_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)
\
from scripts.script1 import Foo
Run Code Online (Sandbox Code Playgroud)
\
a = Foo(42)
Run Code Online (Sandbox Code Playgroud)
在实验开始时,script1包含以下内容:
class Foo():
def __init__(self, x):
self.x = x
Run Code Online (Sandbox Code Playgroud)
现在,我们执行笔记本的3个单元,一切正常。然后,我们转到script1.py并将其代码替换为:
class Bar():
def __init__(self, x):
self.x = x
class Foo(Bar):
def __init__(self, x):
super().__init__(x)
Run Code Online (Sandbox Code Playgroud)
我们保存文件,回到笔记本,然后执行包含单元格,a = Foo(42)
这将产生以下错误:
[autoreload of script.script failed: Traceback (most recent call last):
File "/home/user/miniconda3/lib/python3.6/site-packages/IPython/extensions/autoreload.py", line 245, in check
superreload(m, reload, self.old_objects)
File "/home/user/miniconda3/lib/python3.6/site-packages/IPython/extensions/autoreload.py", …Run Code Online (Sandbox Code Playgroud) 我有一个多标签分类问题。我有11个课程,大约4k个示例。每个示例可以具有1到4-5的标签。目前,我正在为每个类别分别使用log_loss训练分类器。如您所料,训练11个分类器需要花费很多时间,我想尝试另一种方法,只训练1个分类器。这个想法是,该分类器的最后一层将有11个节点,并将按类输出实数,然后将其通过S型转换为Proba。我要优化的损失是所有类上log_loss的平均值。
不幸的是,我是pytorch的菜鸟,即使通过阅读损失的源代码,我也无法弄清楚是否已经存在的损失之一确实满足我的要求,或者我是否应该创造新的损失,如果是这样,我真的不知道该怎么做。
具体来说,我想为批次中的每个元素提供一个大小为11的向量(其中每个标签均包含一个实数(越接近无穷大,则该类别的预测值越接近1),以及1的向量大小为11(每个真实标签均包含1),并能够计算所有11个标签的均值log_loss,并基于该损失优化分类器。
任何帮助将不胜感激 :)
Python 3.7 文档os.symlink(src, dst)是Create a symbolic link pointing to src named dst.
让我们想象一下这个工作目录:
+-- nb.ipynb
+-- dir1
| +-- file1
+-- dir2
Run Code Online (Sandbox Code Playgroud)
假设我想在我的 notebook 中创建一个dir2名为filed2指向的符号链接。dir1/file1nb.ipynb
在笔记本的一个单元格中,我会放:
import os
os.symlink('dir1/file1', 'dir2/file2')
Run Code Online (Sandbox Code Playgroud)
但是,这行不通,这将在 dir2 中创建一个 file2,但是当您查看此文件的属性时,它的TypeisLink(broken) (inode/symlink)和Link targetis dir1/file1。链接目标是您在 os.symlink 中作为 src 放置的内容。要获得正确的符号链接,需要执行以下操作
os.symlink('../dir1/file1', 'dir2/file2')
Run Code Online (Sandbox Code Playgroud)
这意味着os.symlink(src, dest),src应该包含源相对于目标的路径。
由于我不得不多次创建这样的符号链接,我创建了这个函数:
def symlink_rel(src, dst):
rel_path_src = os.path.relpath(src, os.path.dirname(dst))
os.symlink(rel_path_src, dst)
Run Code Online (Sandbox Code Playgroud)
打电话
symlink_rel('dir1/file1', 'dir2/file2')
Run Code Online (Sandbox Code Playgroud)
将创建正确的符号链接。在我看来 os.symlink …
我正在使用 cudas 运行一些代码,我需要在 CPU 上测试相同的代码来比较运行时间。为了在常规 pytorch 张量和 cuda float 张量之间做出决定,我使用的库调用 torch.cuda.is_available()。有没有简单的方法可以让这个函数返回 false?我尝试更改 Cuda 可见设备
os.environ["CUDA_VISIBLE_DEVICES"]=""
Run Code Online (Sandbox Code Playgroud)
但 torch.cuda.is_available() 仍然返回 True。我进入了 pytorch 源代码,就我而言, torch.cuda.is_avaible 返回
torch._C._cuda_getDeviceCount() > 0
Run Code Online (Sandbox Code Playgroud)
我认为我应该能够在笔记本开始时“隐藏”我的 GPU,因此设备计数等于零,但到目前为止我没有取得任何成功。如有任何帮助,我们将不胜感激:)
我正在处理多标签数据,我想使用分层抽样。假设我有 10 个类,我们称它们为“ABCDEFGHIJ”。我有一个包含 10 列的数据框,对应于每个标签,其中包含有关条目的其余信息。我可以在 n_entry*10 矩阵中提取这 10 列,我将其称为 label_values
例如,一行 label_values 看起来像 [0,0,1,1,0,0,0,0,0,0] 并且这个特定的行意味着条目具有标签 C 和标签 D。
我想在训练和验证集中对我的数据进行拆分,并且我希望在训练和验证中每个标签的比例相同。为了执行我的拆分,我使用了 Sklearn train_test_split 函数(在我需要分层之前),它恰好有一个参数分层。目前的行为是将multi_label行为变成multiclass one(我们认为[A,B]是一个全新的类,与A类和B类完全不同)。因此,有些类只有 1 个元素,这会引发错误:
ValueError("The least populated class in y has only 1"
" member, which is too few. The minimum"
" number of groups for any class cannot"
" be less than 2.")
Run Code Online (Sandbox Code Playgroud)
来自 StratifiedShuffleSplit 类的 _iter_indices 的 sklearn/model_selection/_split.py :
if np.min(class_counts) < 2:
raise ValueError("The least populated class in y has only 1"
" member, which is …Run Code Online (Sandbox Code Playgroud) 我目前在使用 jupyter notebook 和系统 shell 命令时遇到了一些问题。我使用 nb_conda_kernels 能够从在基本环境中启动的 jupyter notebook 访问我的所有 conda 环境,这在我的大多数用例中都非常有效。为简单起见,让我们假设我有 2 个环境,一个基础环境和一个名为 work_env 的环境。我在基本环境中启动 jupyter notebook,并在打开我正在处理的 notebook 时选择 work_env 内核。
今天我遇到了这条线:
! pip install kaggle --upgrade
Run Code Online (Sandbox Code Playgroud)
执行单元后(正确激活 work_env 内核),pip 在我的基本环境中安装了 kaggle 包。预期的结果是在我的 work_env 中安装这个包。关于如何在 jupyter notebook 的“正确”环境中执行 shell 命令的任何想法?
假设我要创建一个将列表的每个元素乘以2的函数。创建该函数后,我想通过验证[1, 2]变为来检查一切正常[2, 4]。如果我的函数创建了一个新列表,则可以通过以下方式进行操作:
def double(l):
new_l = []
for j in l:
new_l.append(j * 2)
return new_l
Run Code Online (Sandbox Code Playgroud)
和
assert double([1, 2]) == [2, 4]
Run Code Online (Sandbox Code Playgroud)
现在,如果我的函数将列表修改为:
def double(l):
for i, j in enumerate(l):
l[i] = j * 2
Run Code Online (Sandbox Code Playgroud)
我可以
l = [1, 2]
double(l)
assert l == [2, 4]
Run Code Online (Sandbox Code Playgroud)
我发现此解决方案不是很好。有没有一种方法可以做到这一点,还是有更好的方法呢?