小编Dav*_*rks的帖子

如何从pytorch中从纪元增长到纪元的高IO数据集读取

我使用 Tensorflow,但我正在为用户编写文档,这些文档通常会因深度学习框架而异

当处理不适合本地文件系统 (TB+) 的数据集时,我从远程数据存储中采样数据并将样本在本地写入 Tensorflow 标准tfrecords格式。

在训练的第一个 epoch 期间,我将只采样几个值,因此本地数据的epoch非常小,我对其进行训练。在epoch 2 上,我重新检查我的采样子流程(现在更多)生成了哪些数据文件,并在下一个 epoch 的本地数据文件的扩展集上进行训练。每个时期重复该过程。通过这种方式,我建立了一个本地样本缓存,并可以在我填满本地存储时驱逐旧样本。本地样本缓存大约在模型最需要方差的时间增长(朝向训练的后期)。

在 Python/Tensorflow 中,重要的是我不要在 Python 训练循环过程中反序列化数据,因为 Python GIL 无法支持数据传输速率(300-600 MB/秒,数据是原始科学不可压缩的),因此 GPU 性能当 Python GIL 无法快速为训练循环提供服务时,就会受到影响。

将样本tfrecords从子进程(python 多处理)写入文件允许 tensorflow 的本机TFRecordsDataset在 Python 之外进行反序列化,因此我们避开了 Python GIL 问题,并且我可以使 GPU 达到高 IO 数据速率。

我想知道我将如何在 Pytorch 中解决这个问题。我正在撰写有关正在使用的采样策略的文章,并希望向 Tensorflow 和 PyTorch 的用户提供具体的建议,但我对 PyTorch 预处理生态系统的了解不够深入,无法写出足够详细的内容。

旁注:支持这些数据传输率的唯一基于 Python 的解决方案可能来自 Python 3.8,它带有 System V 共享内存和多处理,但我还没有尝试过,因为对它的支持还不够(很快就会)。现有的多处理解决方案是不够的,因为它们需要在训练循环过程中进行反序列化,因此在反序列化期间以高 IO 速率锁定 GIL。

python pytorch

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

使用 pickle 对大型 numpy 数组进行反序列化比使用 numpy 慢一个数量级

我正在反序列化大型 numpy 数组(本例中为 500MB),我发现结果在方法之间存在数量级差异。以下是我计时的 3 种方法。

我正在从multiprocessing.shared_memory包中接收数据,因此数据作为memoryview对象出现在我面前。但在这些简单的例子中,我只是预先创建了一个字节数组来运行测试。

我想知道这些方法是否有任何错误,或者是否有我没有尝试过的其他技术。如果您想快速移动数据而不是仅为 IO 锁定 GIL,那么 Python 中的反序列化是一个真正的问题。关于为什么这些方法变化如此之大的一个很好的解释也是一个很好的答案。

""" Deserialization speed test """
import numpy as np
import pickle
import time
import io


sz = 524288000
sample = np.random.randint(0, 255, size=sz, dtype=np.uint8)  # 500 MB data
serialized_sample = pickle.dumps(sample)
serialized_bytes = sample.tobytes()
serialized_bytesio = io.BytesIO()
np.save(serialized_bytesio, sample, allow_pickle=False)
serialized_bytesio.seek(0)

result = None

print('Deserialize using pickle...')
t0 = time.time()
result = pickle.loads(serialized_sample)
print('Time: {:.10f} sec'.format(time.time() - t0))

print('Deserialize from bytes...')
t0 = …
Run Code Online (Sandbox Code Playgroud)

python numpy deserialization python-3.8

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

Java:当其他类已经扩展基类时,如何扩展基类?

我想在apache commons电子邮件中扩展一个基类,基类是Email.我只是想为.send()方法添加一些限制

其他3个类扩展Email:HtmlEmail,SimpleEmail和MultiPartEmail

没有工厂方法来创建这3个派生类.

有没有一种最好的方法可以从基础电子邮件类扩展这一方法?我能想到的是扩展3个派生类,在每个派生类中重写.send(),并让它们中的每一个调用一个通用的静态方法来完成.send()限制功能.

java oop

8
推荐指数
1
解决办法
1082
查看次数

Spring-MVC最佳实践:为什么将事务放在服务上而不是DAO上?

我在这里的第一个项目中学习Spring-MVC.

在阅读有关事务的文档之后,我注意到所有示例都将事务放在服务对象/方法周围,而不是DAO(数据访问对象/方法).

我想知道为什么.如果不知道更好,我会考虑在访问数据库的大多数DAO方法周围添加事务(我的想法:数据库=事务).我还没有很多跨越多个DAO的服务方法(但我想这可能是将服务标记为事务的原因).

问题:
我只想知道其他人在这种情况下做了什么.您是否自然地将事务放在最低级别的项目周围(例如,围绕DAO,并且只有当它们以需要事务的方式跨越多个DAO时才围绕服务)?

或者您只关注作为一般主体的服务交易?因此,坚持一层,因为从长远来看,这是更全面的?

java transactions spring-mvc

8
推荐指数
1
解决办法
2066
查看次数

Spring:如何解决验证错误 - >错误代码 - >错误消息

在Spring中,经过验证后我们得到了一个BindingResult对象controller.

很简单,如果我收到验证错误,我想重新显示我的表单,并在每个受影响的字段上方显示错误消息.

因此,要检查领域错误的现场username我的FormObject我的呼叫:

FieldError usernameFieldError = bindingResult.getFieldError("username");
Run Code Online (Sandbox Code Playgroud)

太好了,现在我拿着一个FieldError对象,假设我使用的DefaultMessageCodeResolver现在包含4个可能的错误代码.

我该怎么做FieldError- >一个可供用户使用的字符串?

MessageSource在我的webapplication上下文中定义了,所以我可以将单个错误代码映射到消息.

但有时默认消息是最好的,有时我希望两个错误代码可能有相关的消息,所以我们需要选择最好的消息.

我可以使用什么方法来确定为字段错误提供的最佳错误消息?

  • 我是否需要编写一些算法来检查所有错误代码并从最具体的方法中挑选?
  • Spring是否为帮助确定最具体的错误消息提供了任何支持?
  • 整个过程看起来如此漫长和令人费解,我认为春天应该让这个东西变得容易.也许我不知何故完全偏离了基地?

java validation spring-mvc

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

将messageSource移动到applicationContext会导致默认的messageSource在dispatcher-servlet上下文中不可见

我有一个webapp,我在其中定义dispatcher-servletweb.xml中的基本上下文并加载applicationContext.

我已经messageSource定义dispatcher-servlet并将其注入控制器.

我也定义了我的服务applicationContext,我可以将它们注入我的控制器(在dispatcher-servlet上下文中定义).

但是当我将我的定义移动messageSourceapplicationContext某些服务可以解析消息时,dispatcher-servlet上下文显示它没有找到messageSourcebean并使用默认值,因此控制器会注入错误的bean.

知道为什么messageSource定义applicationContext不会对dispatcher-servlet上下文可见吗?


我看到我的messageSource bean被加载applicationContext到日志部分:

2058 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Creating shared instance of singleton bean 'messageSource'
2058 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory  - Creating instance of bean 'messageSource'
...
2082 [main] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Using MessageSource [mycommons.spring.ResourceBundleMessageSourceWithDefaultResolution: basenames=[messages]]
Run Code Online (Sandbox Code Playgroud)


我在加载时看到这个日志dispatcher-servlet:

3858 [main] DEBUG org.springframework.web.context.support.XmlWebApplicationContext  - Unable to locate MessageSource with name 'messageSource': …
Run Code Online (Sandbox Code Playgroud)

java spring-mvc

8
推荐指数
1
解决办法
4639
查看次数

Spring MVC - 强制控制器生成MappingJacksonJsonView(s)

这里我们有一个使用JSP的基本webapp,它需要提供一些基于JSON的REST服务URL.

这些网址将全部驻留在网站下/services并由网站生成MyRestServicesController.

我看到的用于设置基于JSON的视图的示例全部使用ContentNegotiatingViewResolver.但这对我来说似乎有点过分,因为这个解析器似乎意味着相同的URL可能产生不同的输出.

我只想让我的人RestServicesController永远生产MappingJacksonJsonView(s).

是否有一种更简洁,更直接的方法来直接控制器执行此操作?

java spring-mvc

8
推荐指数
2
解决办法
7321
查看次数

StratifiedKFold:IndexError:数组的索引太多了

使用sklearn的StratifiedKFold函数,有人可以帮我理解这里的错误吗?

我的猜测是它与我的输入标签数组有关,我注意到当我打印它们时(本例中的前16个)索引从0到15,但是上面打印了一个额外的0我不是期待.也许我只是一个蟒蛇菜鸟,但这看起来很奇怪.

有人在这里看到了搞砸了吗?

文档:http://scikit-learn.org...StratifiedKFold.html

码:

import nltk
import sklearn

print('The nltk version is {}.'.format(nltk.__version__))
print('The scikit-learn version is {}.'.format(sklearn.__version__))

print type(skew_gendata_targets.values), skew_gendata_targets.values.shape
print skew_gendata_targets.head(16)

skew_sfold10 = cross_validation.StratifiedKFold(skew_gendata_targets.values, n_folds=10, shuffle=True, random_state=20160121)
Run Code Online (Sandbox Code Playgroud)

结果

The nltk version is 3.1.
The scikit-learn version is 0.17.
<type 'numpy.ndarray'> (500L, 1L)
    0
0   0
1   0
2   0
3   0
4   0
5   0
6   0
7   0
8   0
9   0
10  0
11  0
12  0
13  0
14  1
15  0
--------------------------------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

python scikit-learn

8
推荐指数
1
解决办法
6401
查看次数

我可以将tf.map_fn(...)应用于多个输入/输出吗?

a = tf.constant([[1,2,3],[4,5,6]])
b = tf.constant([True, False], dtype=tf.bool)

a.eval()
array([[1, 2, 3],
       [4, 5, 6]], dtype=int32)
b.eval()
array([ True, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

我想将函数应用于上面的输入a,并b使用tf.map_fn.它将输入两个[1,2,3],True并输出相似的值.

假设函数只是标识:lambda(x,y): x,y因此,给定输入[1,2,3], True,它将输出相同的张量.

我知道如何使用tf.map_fn(...)一个变量,但不能使用两个变量.在这种情况下,我有混合数据类型(int32和bool)所以我不能简单地连接张量并在调用后拆分它们.

我可以使用tf.map_fn(...)不同数据类型的多个输入/输出吗?

tensorflow

8
推荐指数
1
解决办法
6594
查看次数

Tensorflow`tf.layers.batch_normalization`不会将更新操作添加到`tf.GraphKeys.UPDATE_OPS`

以下代码(复制/粘贴runnable)说明了使用tf.layers.batch_normalization.

import tensorflow as tf
bn = tf.layers.batch_normalization(tf.constant([0.0]))
print(tf.get_collection(tf.GraphKeys.UPDATE_OPS))

> []     # UPDATE_OPS collection is empty
Run Code Online (Sandbox Code Playgroud)

使用TF 1.5,文档(引用如下)明确指出在这种情况下UPDATE_OPS不应为空(https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization):

注意:训练时,需要更新moving_mean和moving_variance.默认情况下,更新操作被放入 tf.GraphKeys.UPDATE_OPS,因此需要将它们作为依赖项添加到train_op.例如:

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
    train_op = optimizer.minimize(loss)
Run Code Online (Sandbox Code Playgroud)

python tensorflow

8
推荐指数
1
解决办法
2085
查看次数