我正在寻找像std :: list这样的std容器,它可以有效地将元素移动到前面:
a-b-c-d-e
Run Code Online (Sandbox Code Playgroud)
将"b"移到前面:
a-c-d-e-b
Run Code Online (Sandbox Code Playgroud)
std容器中没有这样的功能.因此,我认为我必须结合使用remove和push_front函数,但任何人都可以找到更好的主意吗?
预先感谢.
我正在我的计算机上构建我的程序libtiff.so -> libtiff.so.5.然后将构建推送到另一台机器上libtiff.so -> libtiff.so.4.
在运行时,我的程序存在:«加载共享库时出错libtiff.so.5::无法打开共享对象文件:没有这样的文件或目录».
我无法升级其他机器,我想避免在虚拟机上编译(使用与执行机器相同的linux版本).因此,我想强制编译器使用libtiff.so.4而不是libtiff.so.5.
我已经libtiff.so.4安装在我的电脑上(以及libtiff.so.5).如何强制与此版本的链接而不是新版本.我想要移动它libtiff.so -> libtiff.so.4,但是如果它需要最新版本我会害怕破坏我的系统(apt-get purge libtiff5因为其他一些软件包需要它而给出错误).
是否可以链接到较旧(已安装)的库版本?如果有,怎么样?改变libtiff.so旧版本的符号链接是否有害?如果没有,它会解决我的问题吗?
如以下代码所示,tensorflowtf.nn.dilation2D函数的行为不像传统的扩张运算符。
import tensorflow as tf
tf.InteractiveSession()
A = [[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 1, 1, 1, 0],
[0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0]]
kernel = tf.ones((3,3,1))
input4D = tf.cast(tf.expand_dims(tf.expand_dims(A, -1), 0), tf.float32)
output4D = tf.nn.dilation2d(input4D, filter=kernel, strides=(1,1,1,1), rates=(1,1,1,1), padding="SAME")
print(tf.cast(output4D[0,:,:,0], tf.int32).eval())
Run Code Online (Sandbox Code Playgroud)
返回以下张量:
array([[1, 1, 1, 2, 2, …Run Code Online (Sandbox Code Playgroud) python image-processing mathematical-morphology image-morphology tensorflow
“显然!”,你可能会说……但是有一个显着的差异,我很难通过随机初始化的差异来解释。
采用两个预先训练的基网(在平均池化层之前)并为它们提供相同的图像,您会注意到输出特征不遵循相同的分布。具体来说,与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)
注意:它与任何图像相似。
背景:我正在使用完全卷积网络来执行图像分割.通常,输入是RGB图像shape = [512, 256],并且目标是定义注释区域的2通道二元掩模(第二通道与第一通道相反).
问:我使用Tensorflow和Keras实现了相同的CNN实现.但Tensorflow模型并没有开始学习.实际上,loss甚至随着时代的数量而增长!这个Tensorflow实现有什么问题阻止它学习?
设置:数据集分为3个子集:训练(78%),测试(8%)和验证(14%)集合,这些集合由8个图像批量馈送到网络.图表显示了loss每个子集的演变.图像显示了prediction两个不同图像的10个时期之后.
Tensorflow实施和结果
import tensorflow as tf
tf.reset_default_graph()
x = inputs = tf.placeholder(tf.float32, shape=[None, shape[1], shape[0], 3])
targets = tf.placeholder(tf.float32, shape=[None, shape[1], shape[0], 2])
for d in range(4):
x = tf.layers.conv2d(x, filters=np.exp2(d+4), kernel_size=[3,3], strides=[1,1], padding="SAME", activation=tf.nn.relu)
x = tf.layers.max_pooling2d(x, strides=[2,2], pool_size=[2,2], padding="SAME")
x = tf.layers.conv2d(x, filters=2, kernel_size=[1,1])
logits = tf.image.resize_images(x, [shape[1], shape[0]], align_corners=True)
prediction = tf.nn.softmax(logits)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=targets, logits=logits))
optimizer = tf.train.RMSPropOptimizer(learning_rate=0.001).minimize(loss)
sess …Run Code Online (Sandbox Code Playgroud) 嵌套 NamedTuples 的 JSON 序列化非常简单:
\nimport json\nfrom typing import NamedTuple\n\nclass A(NamedTuple):\n a: int\nclass B(NamedTuple):\n a: A\n b: str\ns = json.dumps(B(A(42), "auie"))\nprint(s) # outputs the following string: "[[42], 'auie']"\nRun Code Online (Sandbox Code Playgroud)\n另一方面,JSON 反序列化需要一些工作\xe2\x80\xa6 最好的方法是什么?我想过使用递归函数,但我希望有一个更干净的实现\xe2\x80\xa6
\ndef deserialize(T,l):\n for i, k in enumerate(T._field_types):\n if hasattr(T._field_types[k], "_field_types"): # I'm open to a more robust check\n l[i] = deserialize(T._field_types[k], l[i])\n return T(*l)\n \nprint(deserialize(B, json.loads(s))) # prints B(a=A(a=42), b='auie')\nRun Code Online (Sandbox Code Playgroud)\n 当我循环浏览所有文件时,foo我会这样做
for f in foo* ; do echo "result = $f" ; done
Run Code Online (Sandbox Code Playgroud)
问题是当我没有文件开始时foo:
result = foo*
Run Code Online (Sandbox Code Playgroud)
意味着循环执行一次,即使没有文件开始foo.
这怎么可能?如何循环遍历所有文件(如果没有文件则不循环)?
使用 AWS,我正在构建一个定义以下内容的云形成堆栈:
MyPolicy允许使用这些资源的策略(为简单起见,未在下面转录)MyRole提交给该策略的角色堆栈将由管理员创建;一旦创建,目标是允许(从堆栈外)一些用户假设MyRole以使用多个资源。
我的问题:应该如何定义角色才能由用户承担(特定用户将被允许来自堆栈外)?
在AWS帮助页面,他们给的例子在那里"Service": [ "ec2.amazonaws.com" ],这意味着一个 ec2实例被允许承担该角色......但我不明白它是如何转化为用户,并给出关于该方案中没有例子。
以下是我使用JSON格式的堆栈定义:
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Resources" : {
"MyRole" : {
"Type": "AWS::IAM::Role",
"RoleName": "MyRole",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": [ "??" ] },
"Action": [ "sts:AssumeRole" ]
}
]
},
"ManagedPolicyArns": [ { "Fn::GetAtt" : [ "MyPolicy", "Arn" ] } ],
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个自定义训练循环,可以简化如下
inputs = tf.keras.Input(dtype=tf.float32, shape=(None, None, 3))
model = tf.keras.Model({"inputs": inputs}, {"loss": f(inputs)})
optimizer = tf.keras.optimizers.SGD(learning_rate=0.1, momentum=0.9, nesterov=True)
for inputs in batches:
with tf.GradientTape() as tape:
results = model(inputs, training=True)
grads = tape.gradient(results["loss"], model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))
Run Code Online (Sandbox Code Playgroud)
ExponentialMovingAverage 的 TensorFlow 文档并不清楚如何在从头开始的训练循环中使用它。有人用过这个吗?
此外,如果影子变量仍然在内存中,应该如何将影子变量恢复到模型中,以及如何检查训练变量是否已正确更新?
我想返回一个,uint64_t但结果似乎被截断:
在lib.c:
uint64_t function()
{
uint64_t timestamp = 1422028920000;
return timestamp;
}
Run Code Online (Sandbox Code Playgroud)
在main.c:
uint64_t result = function();
printf("%llu = %llu\n", result, function());
Run Code Online (Sandbox Code Playgroud)
结果:
394745024 = 394745024
Run Code Online (Sandbox Code Playgroud)
在编译时,我收到一个警告:
warning: format '%llu' expects argument of type 'long long unsigned int', but argument 2 has type 'uint64_t' [-Wformat]
warning: format '%llu' expects argument of type 'long long unsigned int', but argument 3 has type 'int' [-Wformat]
Run Code Online (Sandbox Code Playgroud)
为什么编译器认为我的函数的返回类型是int?我们怎样才能解释打印的reslut与函数发送的值不同function()?
我对编译器如何通过如下指令进行float转换感兴趣int:
float x_f = 3.1415
int x = (int)x_f;
Run Code Online (Sandbox Code Playgroud)
特别是谈论速度.它是否像内置处理器指令一样超快?还是需要计算?
如果它float总是包含一个精确的整数(ex :),它也会改变x_f = 3.0000.
编辑:这个问题是针对intel x86处理器使用的gcc编译器.
EDIT2:如果有变化x_f = 3.0吗?
在Intel(R)Core(TM)i7-4790上运行这段代码,我得到了奇怪的结果:
#include <stdio.h>
#define CALCULUS 2052 - 1.0 - margin
void main(void)
{
float margin = 1.0001;
float a = CALCULUS;
printf("%2.6f\t%2.6f\n", a, CALCULUS);
}
Run Code Online (Sandbox Code Playgroud)
我有
$ gcc test2.c && ./a.out
2050.000000 2049.999900
Run Code Online (Sandbox Code Playgroud)
有人可以解释这种行为吗?我知道,当我使用它不会发生double,而不是float,但我觉得奇怪的舍入发生在这样一个小数目.
c ×4
tensorflow ×4
python ×3
c++ ×2
64-bit ×1
amazon-iam ×1
bash ×1
casting ×1
for-loop ×1
keras ×1
linux ×1
list ×1
namedtuple ×1
optimization ×1
pytorch ×1
resnet ×1
return-type ×1
shopt ×1
stl ×1
swap ×1
uint64 ×1
vector ×1
wildcard ×1