参考这篇。不需要session,和tf1一样使用apply_gradients进行训练。
在for循环里训练,预测结果和这篇的两个for的结果一样。直接train(x_train,y_train)训练,结果和其他所有结果不一样。
import tensorflow as tf
from tensorflow import keras
from keras.layers import *
import numpy as np
tf.random.set_seed(1)
np.random.seed(1)
x_input = Input(shape=(None, 1))
y_input = Input(shape=(None, 1))
ki=keras.initializers.Constant(value=2)
bi=keras.initializers.Constant(value=1)
y = Dense(1, kernel_initializer=ki,bias_initializer=bi)(x_input)
def myloss(yt,yp):
return tf.reduce_mean(tf.pow(yt - yp, 2))
opt = tf.compat.v1.train.AdamOptimizer(1e-2)
m = keras.models.Model(inputs=[x_input, y_input], outputs=y)
# m.compile(loss=myloss,optimizer=opt) #注释掉结果一样
x_pure = np.random.randint(-10, 100, 320).astype(np.float).reshape(-1, 1)
x_train = x_pure
y_train = 3 * x_pure + 2
def train(x,y):
with tf.GradientTape() as tape:
y_pred = m([x,y])
loss = myloss(y, y_pred)
grads = tape.gradient(loss, m.trainable_weights)
grads_and_vars = zip(grads, m.trainable_weights)
opt.apply_gradients(grads_and_vars)
for x_,y_ in zip(x_train,y_train):
train(x_[np.newaxis,:],y_[np.newaxis,:])
# train(x_train,y_train)
testdata = np.arange(3).reshape(-1, 1)
print(m.predict([testdata, testdata]))