我正在尝试创建一个相当通用的遗传算法实现I' TensorFlow。我有一个缓慢的实现,并试图提高其速度。我将提供一个非常简单的示例,说明程序变慢的地方,并欢迎提高当前实现速度的建议。
让我们说我们创建以下内容:
W = tf.Variable(tf.convert_to_tensor(Warr, dtype=tf.float32))
X = tf.placeholder(dtype=tf.float32, shape=(3, None))
y = tf.placeholder(dtype=tf.float32, shape=(None) )
我们希望找到条件W
:
Warr = np.array([[0.1, 0, 0]])
Xarr = np.random.random((3, 100))
yarr = np.dot(Warr, Xarr)
一个天真的实现(就像我创建的那样)是这样的:
1为此实现创建了一个成本函数:
yHat = tf.matmul(W, X)
costFunction = tf.reduce_mean( tf.sqrt((y - yHat)*(y - yHat)) )
请注意,成本函数可能是任意复杂的,并且不知道 apriori 。因此,它将被传递到一个类中。请注意,其余代码是类中的摘录,但主要思想很容易理解:
2生成一个人口(在一个班级内)。
self.population = []
for i in tqdm(range(self.GAconfig['numChildren'])):
temp = []
for j, v in enumerate(locVars):
v = (v + (np.random.random( v.shape ) - 0.5) * 2)
v = tf.Variable(tf.convert_to_tensor(v, dtype=tf.float32))
temp.append(v)
self.population.append( temp )
找到这个人口的成本函数是一项相当艰巨的任务。首先将总体中的权重复制到原始权重张量中,然后计算原始成本函数:
for ps in self.population:
for i, v in enumerate(self.variables):
sess.run(tf.assign( self.variables[i], ps[i] ))
result = sess.run(self.costFunction, feed_dict={
self.X : X, self.y : y
})
这种实施显然很慢。一种可能的方法是生成一组成本函数张量而不是权重变量,它们都可以一次更新。
然而,这就是我不确定什么是好的实施"将是可以提高当前实施的速度。蚂蚁帮助将不胜感激......
注意:完整实施可在此处获取:
src/lib/GA/GA.py
GA
类src/moduleGA/moduleGA.py