我正在尝试将以前的tf1代码迁移到tf2。不幸的是我的代码没有处于急切模式,所以我遇到了更多困难。我做了以下代码(尚未训练),然后进入错误消息:
Traceback (most recent call last):
training_op = tf.assign(W, W - learning_rate * gradients)
AttributeError: module 'tensorflow' has no attribute 'assign'
这是我的最小代码示例PS:它必须处理复数!
# Data pre-processing
m = 50
n = 20
x_train, y_train, x_test, y_test = get_my_data(x, y, m, n) # data x of size mxn
# Network Declaration
input_size = n
output_size = 1
learning_rate = 0.001 # The optimization learning rate
# Create weight matrix initialized randomely from N~(0, 0.01)
W = tf.Variable(tf.complex(np.random.rand(input_size, output_size),
np.random.rand(input_size, output_size)), name="weights")
with tf.GradientTape() as gtape:
y_out = tf.matmul(x_train, W, name="out")
error = y - y_out
loss = tf.reduce_mean(tf.square(tf.abs(error)), name="mse")
gradients = gtape.gradient(loss, [W])[0]
training_op = tf.assign(W, W - learning_rate * gradients)
我之所以这样做是因为除非他们更改了这些设置,否则优化器不支持复数,因此我会“手工”完成。
答案 0 :(得分:2)
tf.assign*
函数可作为TF 2.0中tf.Variable
上的方法使用。因此,您的示例可以重写为
with tf.GradientTape() as gtape:
...
W.assign_sub(learning_rate * gradients)
请注意,与TF 1.X中的tf.assign
不同,tf.Variable.assing_sub
将急切地执行分配。
答案 1 :(得分:1)
改为尝试tf.compat.v1.assign
。
它对我有用。