我試圖在計算損失函式之前對模型的預測進行后處理,因為我的真實資料 (y_train) 是 NN 輸出的外積。我已按照以下步驟操作:
- 我知道我嘗試使用 numpy 執行的操作是:
nX = 201
nT = 101
nNNout = nX nT
nBatch = 32
NNout = np.random.rand(nBatch, nNNout)
f = NNout[:, :nX]
g = NNout[:,nX:]
test = np.empty([nBatch, nX*nT])
for i in range(nBatch):
test[i,:] = np.outer(f[i,:], g[i,:]).flatten('F')
其中 NN 輸出包含 f 和 g。我真正需要的是每個批處理實體的 f 和 g 外積的矢量化版本。
- 我在一個緊湊的 tensorflow 操作中將其翻譯為:
test2 = tf.Variable([tf.reshape(tf.transpose(tf.tensordot(f[i,:],g[i,:], axes=0)),[nX*nT]) for i in range(nBatch)])
我已經檢查過它是正確的,并且輸出的值與步驟 1 中的值相同。
- 然后,我只是想在我的模型預測之后添加這個操作:
n_epochs = 20
batch_size = 32
n_steps = len(x_train) // batch_size
optimizer = keras.optimizers.Nadam(learning_rate=0.01)
loss_fn = keras.losses.mean_squared_error
mean_loss = keras.metrics.Mean()
metrics = [keras.metrics.MeanAbsoluteError()]
# ------------ Training ------------
for epoch in range(1, n_epochs 1):
print("Epoch {}/{}".format(epoch, n_epochs))
for step in range(1, n_steps 1):
X_batch, y_batch = random_batch(x_train, np.array(y_train))
with tf.GradientTape() as tape:
y_pred = model(X_batch, training=True)
u_pred = tf.Variable([tf.reshape(tf.transpose(tf.tensordot(y_pred[i, :nX], y_pred[i, nX:], axes=0)), [nX * nT]) for i in
range(batch_size)])
main_loss = tf.reduce_mean(loss_fn(y_batch, u_pred))
loss = tf.add_n([main_loss] model.losses)
gradients = tape.gradient(loss, model.trainable_variables)
我的主要問題是,當我添加操作時,梯度變成了一個 None 串列。如果我簡單地使用模型的預測 (y_pred) 計算損失函式,則代碼能夠計算梯度。
你能幫我找出我在這里犯的錯誤嗎?
uj5u.com熱心網友回復:
您正在 u_pred 中創建一個新的(可訓練的)變數,從而打破 u_pred 對 y_pred 的任何依賴。為什么值相匹配的原因是因為你初始化與預測的新變數,但它沒有功能上的互相依賴關系了,有沒有流動梯度。
我猜你這樣做是因為你需要一個 tf.Tensor 而不是一個串列,你最終遇到了型別錯誤。您可能想在tf.concatenate和之間使用某些東西,而不是tf.Variable為此而使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/337545.html
