我正在尝试使用Keras库Tensorflow后端建模一个完全卷积的神经网络.
我面临的问题是分批饲喂不同大小的图像以实现model.fit()功能.训练集包括不同大小的图像,从768x501到1024x760不等.
不超过5张图像具有相同的尺寸,因此将它们分组成批似乎没有任何帮助.
Numpy允许以列表形式将数据存储在单个变量中.但keras model.fit()函数在接收列表类型训练数组时会引发错误.
我不希望调整大小并丢失数据,因为我已经拥有一个非常小的数据集.
我该如何培训这个网络?
python computer-vision deep-learning conv-neural-network keras
我正在使用Python的multiprocessing.Pool类在进程之间分配任务.
简单的案例按预期工作:
from multiprocessing import Pool
def evaluate:
do_something()
pool = Pool(processes=N)
for task in tasks:
pool.apply_async(evaluate, (data,))
Run Code Online (Sandbox Code Playgroud)
产生了N个进程,它们不断地完成我传递给apply_async的任务.现在,我有另一种情况,我有许多不同的非常复杂的对象,每个对象都需要进行计算量大的活动.我最初让每个对象根据需要创建自己的multiprocessing.Pool 在它完成工作的时间,但我最终还是遇到了OSERROR具有开放的文件太多,即使我会假设池会得到使用后垃圾回收.
无论如何,我认为最好为这些复杂对象中的每一个共享同一个池进行计算:
from multiprocessing import Pool
def evaluate:
do_something()
pool = Pool(processes=N)
class ComplexClass:
def work:
for task in tasks:
self.pool.apply_async(evaluate, (data,))
objects = [ComplexClass() for i in range(50)]
for complex in objects:
complex.pool = pool
while True:
for complex in objects:
complex.work()
Run Code Online (Sandbox Code Playgroud)
现在,当我在我的一台计算机上运行它(OS X,Python = 3.4)时,它就像预期的那样工作.产生了N个进程,每个复杂对象在每个进程中分配它们的任务.但是,当我在另一台计算机上运行它(运行Ubuntu的Google Cloud实例,Python = 3.5)时,会产生大量进程(>> N),整个程序因争用而停止运行.
如果我查看池以获取更多信息:
import random
random_object = random.sample(objects, 1)
print (random_object.pool.processes) …Run Code Online (Sandbox Code Playgroud) “显然!”,你可能会说……但是有一个显着的差异,我很难通过随机初始化的差异来解释。
采用两个预先训练的基网(在平均池化层之前)并为它们提供相同的图像,您会注意到输出特征不遵循相同的分布。具体来说,与Pytorch的主干相比, TensorFlow的主干具有更多受 ReLU 抑制的功能。此外,如第三张图所示,两个框架的动态范围不同。
当然,这种差异被处理分类任务的密集层所吸收,但是:这种差异可以用训练过程中的随机性来解释吗?还是训练时间?或者还有其他什么可以解释这种差异吗?
重现代码:
import imageio
import numpy as np
image = imageio.imread("/tmp/image.png").astype(np.float32)/255
import tensorflow as tf
inputs = image[np.newaxis]
model = tf.keras.applications.ResNet50(include_top=False, input_shape=(None, None, 3))
output = model(inputs).numpy()
print(f"TensorFlow features range: [{np.min(output):.02f};{np.max(output):.02f}]")
import torchvision
import torch
model = torch.nn.Sequential(*list(torchvision.models.resnet50(pretrained=True).children())[0:8])
inputs = torch.tensor(image).permute(2,0,1).unsqueeze(0)
output = model(inputs).detach().permute(0,2,3,1).numpy()
print(f"Pytorch features range: [{np.min(output):.02f};{np.max(output):.02f}]")
Run Code Online (Sandbox Code Playgroud)
输出
TensorFlow features range: [0.00;25.98]
Pytorch features range: [0.00;12.00]
Run Code Online (Sandbox Code Playgroud)
注意:它与任何图像相似。
因此,我正在使用joblib来并行化一些代码,并且我注意到在jupyter笔记本中使用它时无法打印内容。
我尝试在ipython中使用相同的示例,但效果很好。
这是在jupyter笔记本单元中编写的最小(非)工作示例
from joblib import Parallel, delayed
Parallel(n_jobs=8)(delayed(print)(i) for i in range(10))
Run Code Online (Sandbox Code Playgroud)
所以我得到的输出,[None, None, None, None, None, None, None, None, None, None]但什么都没有打印。
实际上,在检查笔记本进程的日志时,我注意到打印在那里进行。我希望打印发生在笔记本中,而不是笔记本过程的日志中。
我已经打开了一个Github问题,但是到目前为止关注的很少。
我想在 TensorFlow 2.x 中的一个模型中为输入张量的切片分配一些值(我使用的是 2.2,但准备接受 2.1 的解决方案)。我正在尝试做的一个非工作模板是:
import tensorflow as tf
from tensorflow.keras.models import Model
class AddToEven(Model):
def call(self, inputs):
outputs = inputs
outputs[:, ::2] += inputs[:, ::2]
return outputs
Run Code Online (Sandbox Code Playgroud)
当然,在构建此 ( AddToEven().build(tf.TensorShape([None, None]))) 时,我收到以下错误:
TypeError: 'Tensor' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式实现这个简单的例子:
TypeError: 'Tensor' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)
(您可以通过以下方式进行完整性检查:
class AddToEvenScatter(Model):
def call(self, inputs):
batch_size = tf.shape(inputs)[0]
n = tf.shape(inputs)[-1]
update_indices = tf.range(0, n, delta=2)[:, None]
scatter_nd_perm = [1, 0]
inputs_reshaped = tf.transpose(inputs, scatter_nd_perm)
outputs …Run Code Online (Sandbox Code Playgroud) ImportError: libcuda.so.1: cannot open shared object file: No such file or directory
Failed to load the native TensorFlow runtime.
Run Code Online (Sandbox Code Playgroud)
导入时出现此错误tensorflow。我需要知道解决这个问题的步骤。
我想运行Hydra multirun,但在配置文件中指定扫描。\n我想知道在请求功能请求之前是否有办法执行此操作。
\n到目前为止,我已经尝试过以下内容:
\n树结构:
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 conf\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 compile\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.yaml\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 grid_search.yaml\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 config.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_app.py\nRun Code Online (Sandbox Code Playgroud)\n内容my_appy.py:
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 conf\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 compile\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.yaml\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 grid_search.yaml\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 config.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_app.py\nRun Code Online (Sandbox Code Playgroud)\n内容conf/config.yaml:
import hydra\nfrom omegaconf import DictConfig, OmegaConf\n\n@hydra.main(config_path="conf", config_name="config")\ndef my_app(cfg : DictConfig) -> None:\n print(OmegaConf.to_yaml(cfg, resolve=True))\n\nif __name__ == "__main__":\n my_app()\nRun Code Online (Sandbox Code Playgroud)\n内容conf/compile/base.yaml:
defaults:\n - compile: base\nRun Code Online (Sandbox Code Playgroud)\n内容conf/compile/grid_search.yaml:
loss: mse\noptimizer: adam\n …Run Code Online (Sandbox Code Playgroud) 由于这是一种非常普遍的做法...我想知道matplotlib是否等效于scikit-image中的此函数?
from skimage import io
im = io.imread(fname, as_grey=True)
Run Code Online (Sandbox Code Playgroud)
要直接读取RGB文件为灰度?
我需要使用等效的matplotlib,因为我正在使用它来绘制结果。正如我所观察到的,似乎io.imread读取的ndarray与plt.imread读取的ndarray不相等。
谢谢!
python ×8
tensorflow ×3
keras ×2
pytorch ×2
fb-hydra ×1
gpu ×1
joblib ×1
jupyter ×1
matplotlib ×1
printing ×1
resnet ×1
scikit-image ×1
scipy ×1