我正在考虑在Tensorflow 2.0中实现一个简单的模型,同时实现新的@ tf.function装饰器函数以及删除tf.Session()。
截至目前,我使用feedforward()创建具有单独名称范围的权重和偏差:
def feedforward(self,input,output,name_scope):
with tf.variable_scope(name_scope,reuse=tf.AUTO_REUSE) as scope:
self.W = tf.get_variable('weights',shape=(input.shape[1],output),initializer=tf.random_normal_initializer(0,0.01),dtype=tf.float32)
self.b = tf.get_variable('biases',shape=(output),initializer=tf.constant_initializer(0,dtype=tf.float32)
z = tf.matmul(self.W,input) + self.biases
activations = sigmoid(z)
return activations
我使用define_layer函数编译图层:
@tf.function
def define_layers():
self.layer_1 = self.feedforward(self.features,self.l1_dim,'layer_1')
self.layer_2 = self.feedforward(self.layer_1,self.l2_dim,'layer_2')
self.final_layer = self.feedforward(self.layer_2,1,'final_layer')
最后,我使用preamble()创建损失和优化器:
def preamble():
self.loss = //
self.labels * -math.log(self.final_layer) + (1 - self.labels) //
* -math.log(1 - self.final_layer)
self.optimizer = //
tf.train.AdamOptimizer(learning_rate=0.01).minimize(self.loss)
return self.loss
所以我的问题是:如何在不使用tf.Session()的情况下使用train()实施培训?举一个简单的例子,我目前有:
@tf.function
def train():
for epoch in range(100):
for (x,y) in (self.features,self.labels):
loss = preamble()
if epoch % 50 == 0:
print("Current Epoch is {:03d} with loss of {:.3f}".format(epoch,self.loss))
对于此应用程序,我不想使用任何tf.metrics或keras,因为我想使用低级API来全部开发。
还有一个问题,我是否正确使用@ tf.function()装饰器?我根据Tensorflow Guide使用它来定义我的图层,但不确定在哪种情况下合适或不合适。