关于adam优化器如何在tensorflow中实际工作,我感到很困惑.
我阅读文档的方式是,每次梯度下降迭代都会改变学习速度.
但是当我调用该函数时,我给它一个学习率.我并没有把这个函数称为,做一个时代(隐式地调用#iterations以便进行我的数据训练).我明确地调用每个批次的函数
for epoch in epochs
for batch in data
sess.run(train_adam_step, feed_dict={eta:1e-3})
Run Code Online (Sandbox Code Playgroud)
所以我的eta无法改变.而且我没有传入时间变量.或者这是某种生成器类型的东西,t
每当我调用优化器时,会话创建会增加吗?
假设它是一些生成器类型的东西,并且学习率正在无形地降低:如何在不降低学习速率的情况下运行adam优化器?在我看来,像RMSProp基本上是相同的,我必须做的唯一的事情,以使其等于(学习率无视)是改变超参数momentum
和decay
匹配beta1
,并beta2
分别.那是对的吗?
我正在尝试将输入图层拆分为不同大小的部分.我正在尝试使用tf.slice这样做,但它不起作用.
一些示例代码:
import tensorflow as tf
import numpy as np
ph = tf.placeholder(shape=[None,3], dtype=tf.int32)
x = tf.slice(ph, [0, 0], [3, 2])
input_ = np.array([[1,2,3],
[3,4,5],
[5,6,7]])
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print sess.run(x, feed_dict={ph: input_})
Run Code Online (Sandbox Code Playgroud)
输出:
[[1 2]
[3 4]
[5 6]]
Run Code Online (Sandbox Code Playgroud)
这是有效的,大致是我想要发生的,但我必须指定第一个维度(3
在这种情况下).我不知道,虽然多少矢量我会输入,这就是为什么我使用的是placeholder
与None
摆在首位!
是否有可能以slice
这样一种方式使用它,直到运行时尺寸未知?
我尝试过使用placeholder
它的价值,ph.get_shape()[0]
如下所示:x = tf.slice(ph, [0, 0], [num_input, 2])
.但那也不起作用.
我有一个1D张量,我想堆叠/打包/平铺成2D张量y=[a, a, a]
.如果我知道我想重复多少次,我可以tf.tile
一起使用reshape
.
但我不这样做,因为尺寸取决于批量大小.占位符值None
不是有效输入.我知道tf.slice
一个人可以输入-1
并让tensorflow弄明白,但我不知道tensorflow如何推断出正确的大小.我确实有一个x
形状相同的张量y
,但我没有看到一个tile_like
函数.
有什么建议?
我遵循的做法是拥有一个存储库和一个Dao等。我试图通过具有一个函数来获取数据库存储库中的行数
int getNumFiles() {
List<AFile> lst = files.getValue(); // files is of type LiveData<List<AFile>> files;
if (lst == null) {
return 0;
} else {
return lst.size();
}
}
Run Code Online (Sandbox Code Playgroud)
但lst
总会评估为null
。我想这与不允许我从UI线程查询数据库有关吗?我是否应该像添加或删除元素一样实现它?换句话说,在Dao中是否具有通过数据库存储库中的AsyncTask调用的函数?我对如何做这个非常简单的事情感到困惑。
有这样的回答显示了一个将在道写找出哪些行数,但它并不能解释的仓库应该怎么称呼这一点。
我正在尝试在训练我的图形时计算权重的熵并将其用于正则化.这当然涉及到w*tf.log(w)
,并且随着我的权重的变化,其中一些必然会进入导致NaN返回的区域.
理想情况下,我会在图表设置中包含一行:
w[tf.is_nan(w)] = <number>
Run Code Online (Sandbox Code Playgroud)
但tensorflow不支持这样的分配.我当然可以创建一个操作,但这不起作用,因为我需要在执行整个图形时发生它.我不能等待图表执行然后"修复"我的权重,必须是图执行的一部分.
我无法np.nan_to_num
在文档中找到相应的内容.
有人有想法吗?
(由于显而易见的原因,添加epsilon不起作用)
我正在使用multiprocessing.Pool
并行化我正在运行的程序的某些部分。我正在循环数据,计算一些内容,然后返回结果。
性能不佳的代码:
def likelihood_data(self, data):
func = partial(likelihood, means=self.means, stddevs=self.stddevs, c_ks=self.c_k)
if len(data) > 100:
pool = Pool(10)
try:
likelihoods = pool.map(func, data)
finally:
pool.close()
pool.join()
else:
likelihoods = []
for sample in data:
likelihoods.append(self.likelihood(sample))
return np.mean(likelihoods)
def likelihood(sample, means, stddevs, c_ks): # is outside of class
likel = []
for c_k, m, s in zip(c_ks, means, stddevs):
likel.append(likel_bound(np.log(c_k) + np.sum(logg(sample, m, s))))
return np.sum(np.exp(likel))
Run Code Online (Sandbox Code Playgroud)
从使用 cProfile 来看,性能不佳是因为大部分时间都花在了{method 'acquire' of '_thread.lock' objects}
. 我不明白为什么当每个进程彼此独立时会发生这种情况。这里发生了什么?
编辑:或者它只是花费了最长的时间,因为它正在等待所有进程完成?
编辑:它现在有效,我不知道为什么。不要以为我改变了什么
我想用pybind11传入并修改一个大的numpy数组。因为它很大,我想避免复制它并返回一个新的。
这是代码:
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <pybind11/numpy.h>
#include <vector>
// C++ code
void calc_sum_cost(float* ptr, int N, int M, float* ptr_cost) {
for(int32_t i = 1; i < N; i++) {
for(int32_t j = 1; j < M; j++) {
float upc = ptr[(i-1) * M + j];
float leftc = ptr[i * M + j - 1];
float diagc = ptr[(i-1) * M + j - 1];
float transition_cost = std::min(upc, std::min(leftc, diagc));
if (transition_cost == diagc) …
Run Code Online (Sandbox Code Playgroud) 编辑:仅供参考,现在遇到此问题的任何人只需使用 pybind11,不要在此(cython 内容)上浪费时间
似乎定义vector
变量的唯一方法是
cdef std::vector[int]* vec=new vector[int](<size>)
我的想法正确吗?这是示例代码,如果我编译并运行此 Python 最终会崩溃(VS2015,Python 3.5)。
from libcpp.vector cimport vector
def test():
cdef vector[int]* vec = new vector[int](5)
cdef int i
for i in range(5):
print(vec[i])
del vec
Run Code Online (Sandbox Code Playgroud)
我想要一个具有一定大小的二维向量。我该怎么做?可不可能是:
cdef std::vector[std::vector[int]]* vec=new vector[vector[int](<size1>)](<size2>)
我有一个tf.Variable
类型的3D数组.tf.reduce_sum
仅适用于个人张量.我试过做:
tf.reduce_sum([tf.reduce_sum(mat) for mat in var_3Dlist])
Run Code Online (Sandbox Code Playgroud)
...但是tf.reduce_sum()
期望张量而不是列表.我能以某种方式将其转换为张量,还是有另一种更好的方法呢?我没有在API中找到任何内容.
所以这一定是非常愚蠢的事情,但是这个代码我得到了一个错误.
可能出现的问题,操作数<,>也不起作用.一个人使用不同的向量吗?当我尝试y.at(1)= 10; 它说表达式必须有类型......?
#include "stdafx.h"
#include <iostream>
#include "time.h"
#include <vector>
int main()
{
using namespace std;
const long long l = 100000;
vector <int> y[l];
long long x[l];
y[0] = 10; // Test statement results in Error.
//for (long i = 0;i < l;i++) {
// y.at(i) = i;//rand() % 100;
// x[i] = rand() % 100;
//}
clock_t t = clock();
for (long long i = 0;i < l;i++) {
long long r;
r = y[i] ^ …
Run Code Online (Sandbox Code Playgroud) long long n, prod, i;
n = 13;
prod = 1;
for (i = 1 ; i <= n ; i++) {
prod *= i;
}
printf("%d\n", prod);
printf("%d\n", sizeof(long long));
Run Code Online (Sandbox Code Playgroud)
回报
$ 1932053504
$ 8
Run Code Online (Sandbox Code Playgroud)
结果显然是溢出的.但我不明白为什么会发生这种情况long long
.sizeof(int)
返回4 [字节],但产品是相同的.我究竟做错了什么?
python ×8
tensorflow ×5
c++ ×2
android ×1
android-room ×1
arrays ×1
c ×1
cython ×1
long-integer ×1
nan ×1
overflow ×1
pybind11 ×1
vector ×1