Python 如何在GPU中并行运行Tensorflow上的独立循环
我想通过仿真实现重构受限玻尔兹曼机器的算法。M是可见变量的数量,N是隐藏变量的数量。为了在GPU上并行运行,我想首先使用python在tensorflow上编写它Python 如何在GPU中并行运行Tensorflow上的独立循环,python,tensorflow,gpu,parallels,logistics,Python,Tensorflow,Gpu,Parallels,Logistics,我想通过仿真实现重构受限玻尔兹曼机器的算法。M是可见变量的数量,N是隐藏变量的数量。为了在GPU上并行运行,我想首先使用python在tensorflow上编写它 在我的主要函数RBMIC()中,我需要运行带有L1惩罚的M独立逻辑回归,并更新我的权重和偏差矩阵:(w和b),然后使用它们来估算隐藏变量的值。所以我写了一个独立的for循环。我想知道tensorflow是否能够识别出独立的for循环,并在GPU上高效地运行它(每个核心有一次迭代) 代码也非常慢,特别是对于运行logistics Ret
将numpy导入为np
导入tensorflow作为tf
n=200
M=4
N=2
μ,σ=0,0.1
β=0.001
lr=0.05
纪元=1000
Maxepochs=10
迭代=100
可见=np.数组([[1,0,1,0],[0,1,1,0],[1,0,0,1],[0,1,0,1])
vis=np。瓷砖(可见,50)。重塑(n,M)
vis=tf.cast(vis,tf.32)
err_hat=np.zero([迭代])
def Bionimal(x):
样本=tf.其中(tf.随机_均匀(形状=x.形状)-x<0,
tf.one(shape=x.shape),tf.zero(shape=x.shape))
回样
def LogisticsReg(X、Y、wj、bj、beta、lr、epochs):
logitj=tf.add(tf.matmul(X,wj),bj)
损失=tf.reduce\u均值(tf.nn.sigmoid\u交叉\u熵\u与logits(labels=Y,logits=logitj))
l1_正则化子=tf.reduce_和(tf.abs(wj))
损耗=tf.减少平均值(损耗+β*l1正则化器)
优化器=tf.train.GradientDescentOptimizer(学习率=lr).最小化(损失,变量列表=[wj,bj])
使用tf.Session()作为sess:
tf.global_variables_initializer().run()
对于范围内的k(历次):#对模型n#u历次进行训练
_,bf,wf=sess.run([optimizer,bj,wj])
#bf=tf.变量(bf,name=“bf”)
#wf=tf.Variable(wf,name=“wf”)
返回[bf,wf]
def更新(wi、hi、c_opt、Maxepochs):
ph=tf.sigmoid(tf.add(tf.matmul(vis,tf.transpose(wi)),c_opt))
lik=tf.add(tf.multiply(hi,tf.log(ph)),tf.multiply((1.-hi),tf.log(1.-ph)))
loss2=-tf.减少总和(lik)
optimizer=tf.contrib.opt.ScipyOptimizerInterface(loss2,var_to_bounds={c_opt:(-1,1)},options={'maxiter':Maxepochs},var_list=[c_opt])
使用tf.Session()作为sess:
tf.global_variables_initializer().run()
优化程序。最小化(sess)
返回sess.run(c_opt)
#首字母
w=tf.Variable(tf.random_normal(shape=(N,M),stddev=0.1),name=“weights”)
c=tf.Variable(tf.random_normal(shape=(1,N),stddev=0.1),name=“hbias”)
b=tf.Variable(tf.random_normal(shape=(1,M),stddev=0.1),name=“vbias”)
def RBMIC(w、c、vis):
#计算隐藏变量
logits=tf.add(tf.matmul(vis,tf.transpose(w)),tf.tile(c[n,1]))
prob=tf.sigmoid(logits)
hids=生物动物(prob)
#通过物流回归和l1惩罚估计偏差、权重,以及可见变量的偏差c。
bs=np.零([1,M])
ws=np.zero([N,M])
X=hids
对于范围内的j(M):
Y=tf.重塑(vis[:,j],[n,1])
wj=tf.Variable(tf.reformate(w[:,j],[N,1]),name=“wj”)
bj=tf.Variable(tf.random_normal(shape=[1,1],stddev=0.1),name=“bj”)
bf,wf=LogisticsReg(X,Y,wj,bj,beta,lr,历代)
bs[0,j]=bf
ws[:,[j]]=wf
b=tf.cast(tf.Variable(bs,name=“vbias”),tf.float32)
w=tf.cast(tf.Variable(ws,name=“weights”),tf.float32)
cs=np.零([1,N])
对于范围(N)中的i:
wi=tf.重塑(w[i,:],[1,M])
hi=tf.重塑(hids[:,i],[n,1])
c_opt=tf.Variable(c[0,i],name=“c_opt”)
cs[0,i]=UpdateC(wi,hi,c_opt,Maxepochs)
c=tf.cast(tf.Variable(cs,name=“hbias”),tf.float32)
#评估绩效
vis_pred=tf.sigmoid(tf.add(tf.matmul(hids,w),tf.tile(b[n,1]))
误差=tf.减少总和((相对于前)**2)
返回错误
对于步进范围(迭代):#训练模型迭代次数
err=RBMIC(w、c、vis)
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(初始化)
打印“在步骤%d处重建=\n%”(步骤)
print sess.run(err)
要回答文章标题中的问题,控制流构造支持迭代的并行执行(通过关键字参数parallel_iterations
公开)
关于第二个和第三个问题,您可能不想创建多个会话。例如,如果使用单个会话,就不必将张量转换为变量。我强烈建议您参考教程和文档,以获取有关TensorFlow语义的更多信息