这是我的代码:
main.cpp中
#include "foo.h"
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
foo.h中
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
Foo();
int bar;
}
#endif
Run Code Online (Sandbox Code Playgroud)
Foo.cpp中
#include "foo.h"
Foo::Foo()
{
bar = 3;
}
Run Code Online (Sandbox Code Playgroud)
编译这会给我以下错误:
multiple definition of 'bar'
但是我在头文件中包含了保护,它定义了bar,因此如何定义多次呢?
我想使用 MatPlotLib 绘制图形,其中的图形随时间变化。在每个时间步,一个额外的数据点将被添加到图中。但是,应该只显示一个图形,其外观会随着时间的推移而演变。
在我的测试示例中,该图是一个简单的线性图 (y = x)。这是我尝试过的:
for i in range(100):
x = range(i)
y = range(i)
plt.plot(x, y)
plt.ion()
plt.show()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
但是,这里发生的是创建了多个窗口,因此在循环结束时我有 100 个窗口。另外,我注意到对于最近的窗口,它只是一个白色的窗口,并且情节只出现在下一步中。
所以,我的两个问题是:
1) 如何更改我的代码,以便只显示一个窗口,其内容会随着时间而变化?
2)如何更改我的代码,以便在最近的时间步长中,绘图实际显示在窗口上,而不是只显示一个白色窗口?
谢谢!
我正在使用 TensorFlow 1.9 来训练图像数据集,该数据集太大而无法从我的硬盘驱动器加载到 RAM 中。因此,我在我的硬盘驱动器上将数据集分成两半。我想知道在整个数据集上训练的最有效方法是什么。
我的 GPU 有 3 GB 的内存,我的 RAM 有 32 GB 的内存。每个半数据集的大小为 20 GB。我的硬盘有足够的可用空间(超过 1 TB)。
我的尝试如下。我创建了一个可初始化的tf.Dataset,然后在每个时期,我将它初始化两次:对数据集的每一半进行一次。通过这种方式,每个 epoch 都会看到整个数据集,但在任何时候只需要将其中的一半加载到 RAM 中。
但是,这很慢,因为从我的硬盘驱动器加载数据需要很长时间,并且每次使用这些数据初始化数据集也需要很长时间。
有没有更有效的方法来做到这一点?
在加载数据集的另一半之前,我尝试对数据集的每一半进行多个时期的训练,这要快得多,但这在验证数据上的性能要差得多。据推测,这是因为模型在每一半上都过度拟合,然后没有泛化到另一半的数据。
在下面的代码中,我创建并保存了一些测试数据,然后按上述方式加载这些数据。加载每个半数据集的时间约为 5 秒,使用此数据初始化数据集的时间约为 1 秒。这可能看起来只是很小的一部分,但它在多个时期内加起来。事实上,我的计算机在加载数据上花费的时间几乎与它实际训练数据所花费的时间一样多。
import tensorflow as tf
import numpy as np
import time
# Create and save 2 datasets of test NumPy data
dataset_num_elements = 100000
element_dim = 10000
batch_size = 50
test_data = np.zeros([2, int(dataset_num_elements * 0.5), element_dim], dtype=np.float32)
np.savez('test_data_1.npz', x=test_data[0])
np.savez('test_data_2.npz', x=test_data[1])
# Create the …Run Code Online (Sandbox Code Playgroud) 我有一个很大的NumPy数组,我希望在循环的每次迭代中填充新数据.该数组填充了沿轴0重复的数据,例如:
[[1, 5],
[1, 5],
[1, 5],
[1, 5]]
Run Code Online (Sandbox Code Playgroud)
我知道如何在每次迭代中从头开始创建这个数组:
x = np.repeat([[1, 5]], 4, axis=0)
Run Code Online (Sandbox Code Playgroud)
但是,我不想每次都创建一个新数组,因为它是一个非常大的数组(远大于4x2).相反,我想使用上面的代码预先创建数组,然后在每次迭代时用新数据填充数组.
但np.repeat()返回一个新数组,而不是作用于现有数组.是否有相当于np.repeat()填充现有阵列?
当我用PyTorch创建神经网络时,使用torch.nn.Sequential定义层的方法,似乎参数requires_grad = False是默认的。然而,当我训练这个网络时,损失减少了。如果层没有通过渐变更新,这怎么可能?
例如,这是定义我的网络的代码:
class Network(torch.nn.Module):
def __init__(self):
super(Network, self).__init__()
self.layers = torch.nn.Sequential(
torch.nn.Linear(10, 5),
torch.nn.Linear(5, 2)
)
print('Network Parameters:')
model_dict = self.state_dict()
for param_name in model_dict:
param = model_dict[param_name]
print('Name: ' + str(param_name))
print('\tRequires Grad: ' + str(param.requires_grad))
def forward(self, input):
prediction = self.layers(input)
return prediction
Run Code Online (Sandbox Code Playgroud)
这打印出来:
Network Parameters:
Name: layers.0.weight
Requires Grad: False
Name: layers.0.bias
Requires Grad: False
Name: layers.1.weight
Requires Grad: False
Name: layers.1.bias
Requires Grad: False
Run Code Online (Sandbox Code Playgroud)
然后这是训练我的网络的代码:
network = Network()
network.train()
optimiser …Run Code Online (Sandbox Code Playgroud) 我有一个二进制文件,我想读取数据,一次一个字节,打印每个字节运行.
我到目前为止的代码是:
f = open("test.dat", "rb")
try:
byte = f.read(1)
while byte != "":
print byte
raw_input("Press Enter to continue...")
byte = f.read(1)
finally:
f.close()
Run Code Online (Sandbox Code Playgroud)
但是,这并没有给我预期的结果.基本上,我想为每个字节打印一个0到127之间的数字.但是,第一次打印给了我一个笑脸符号,我知道它不在ASCII的前128个条目中.因此,我似乎打印的不仅仅是一个字节 - 即使我只指定在f.read中读取1个字节.
这里发生了什么?
谢谢.
我有一个模型:
class User(models.Model):
user_id = models.IntegerField(default=0)
user_name = models.CharField(max_length=20)
user_age = models.IntegerField(default=0)
def __init__(self, user_id, user_name, user_age):
self.user_id = user_id
self.user_name = user_name
self.user_age = user_age
Run Code Online (Sandbox Code Playgroud)
然后我尝试创建这个模型的一个实例:
new_user = User(0, 'Andrew', 25)
new_user.save()
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
'User' object has no attribute '_state'
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
我有两个整数的Python列表:x和y.所有元素都x出现在某处y,而且只出现过一次.对于每个元素x,我想知道相应值的索引y.然后我想将这些索引设置为列表z.
下面的代码就像我刚才描述的那样工作.但是,对于一项我怀疑可能只需要几行左右就能提供更优雅解决方案的任务,这似乎有点笨拙.因此,我的问题是,可以重写以下代码的行数最少?
z = [0 for i in range(len(x))]
for i, j in enumerate(x):
for k, l in enumerate(y):
if j==l:
z[i] = k
break
Run Code Online (Sandbox Code Playgroud) 我想找到两个变量的绝对值的最大值,并返回该变量的实际值,而不是该变量的绝对值。
例如:
int x = 3;
int y = -5;
int z = max(abs(x), abs(y))
Run Code Online (Sandbox Code Playgroud)
将只是设置z为5,而我希望它返回-5。有 C++ 函数可以执行此操作吗?
我正在使用QT Creator在Ubuntu上制作C++程序.我编写的程序编译得很好,直到我决定开始使用C++ 11而不是C++ 98(这是QT Creator中的默认设置).我使用自己的cmake文件,而不是qmake,所以为了做到这一点,我在我的网站中包含以下内容CMakeLists.txt file:
set(CMAKE_CXX_FLAGS "-std=c++0x")
Run Code Online (Sandbox Code Playgroud)
现在,我的部分代码有以下内容(不是我编写的):
#if (linux && (i386 || __x86_64__))
# include "Linux-x86/OniPlatformLinux-x86.h"
#elif (linux && __arm__)
# include "Linux-Arm/OniPlatformLinux-Arm.h"
#else
# error Unsupported Platform!
#endif
Run Code Online (Sandbox Code Playgroud)
转移到C++ 11后,我在该行收到错误error Unsupported Platform!.这是因为,从我所看到的,变量linux没有在任何地方定义,尽管__x86_64__定义了变量.
因此,我有两个问题:
1)为什么变量linux没有定义,即使我使用的是Linux?
2)如何告诉C++ 11忽略此错误?
谢谢.
python ×5
c++ ×3
c++11 ×1
cmake ×1
django ×1
matplotlib ×1
numpy ×1
pytorch ×1
qt ×1
tensorflow ×1