損失函式沒有接近 0。它似乎沒有收斂,并且始終無法預測 Y。我嘗試過使用初始化器、激活和層大小。這里的任何見解將不勝感激。
import tensorflow as tf
import keras
activation = 'relu'
initializer = 'he_uniform'
input_layer = tf.keras.layers.Input(shape=(1,),batch_size=1)
dense_layer = keras.layers.Dense(
32,
activation=activation,
kernel_initializer=initializer
)(input_layer)
dense_layer = keras.layers.Dense(
32,
activation=activation,
kernel_initializer=initializer
)(dense_layer)
predictions = keras.layers.Dense(1)(
dense_layer
)
model = keras.models.Model(inputs=input_layer, outputs=[predictions])
model.summary()
optimizer = tf.keras.optimizers.Adam(learning_rate=0.0001)
x = tf.constant([[727.], [1424.], [379], [1777], [51.]])
y = tf.constant([[1.], [1.], [0.], [1.], [0.]])
for item in tf.data.Dataset.from_tensor_slices((x,y)).shuffle(5).repeat():
with tf.GradientTape() as tape:
x = item[0]
output = model(x)
loss = keras.losses.BinaryCrossentropy(
from_logits=True
)(item[1], output)
# loss = item[1] - output[0]
dy_dx = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(dy_dx, model.trainable_weights))
print("batch", item[0], "x", "output", output, "expected", item[1], "gradient", dy_dx[-1])
print("loss", loss)
uj5u.com熱心網友回復:
您的輸入數字很大,這會導致數字問題,并且您沒有對輸入進行批處理,這會導致每個批次在可能的不同方向上產生非常大的梯度(同樣,由于輸入數字很大)。當我作業正常
- 添加
.batch(5)到資料集定義(實際上只是替換,shuffle因為每個批次都包含完整的資料集)以改進梯度估計, - 將輸入除以 1000 以使它們處于更合理的范圍內,
- 之后,您可以提高學習率(最高 0.1 可以正常作業)以顯著加快訓練速度。
這應該很快收斂。
import tensorflow as tf
import keras
activation = 'relu'
initializer = 'he_uniform'
input_layer = tf.keras.layers.Input(shape=(1,))
dense_layer = keras.layers.Dense(
32,
activation=activation,
kernel_initializer=initializer
)(input_layer)
dense_layer = keras.layers.Dense(
32,
activation=activation,
kernel_initializer=initializer
)(dense_layer)
predictions = keras.layers.Dense(1)(
input_layer
)
model = keras.models.Model(inputs=input_layer, outputs=[predictions])
model.summary()
optimizer = tf.keras.optimizers.Adam(learning_rate=0.1)
x = tf.constant([[727.], [1424.], [379], [1777], [51.]]) / 1000.
y = tf.constant([[1.], [1.], [0.], [1.], [0.]])
for step, item in enumerate(tf.data.Dataset.from_tensor_slices((x,y)).batch(5).repeat()):
with tf.GradientTape() as tape:
x = item[0]
output = model(x)
loss = keras.losses.BinaryCrossentropy(
from_logits=True
)(item[1], output)
# loss = item[1] - output[0]
dy_dx = tape.gradient(loss, model.trainable_variables)
optimizer.apply_gradients(zip(dy_dx, model.trainable_weights))
if not step % 100:
print("batch", item[0], "x", "output", tf.nn.sigmoid(output), "expected", item[1], "gradient", dy_dx[-1])
print("loss", loss)
并注意:您沒有使用“來自 logits”的二進制交叉熵的激活函式是正確的,因此請忽略其他人告訴您的內容。
uj5u.com熱心網友回復:
您的輸出層 - predictions- 缺少激活。引數的keras.layers.Dense默認值為。從您的代碼看起來您??正在執行二進制分類,因此您的輸出層應該有一個激活。Noneactivation'sigmoid'
在推理時,請務必將模型的輸出四舍五入為 0 或 1 以獲得預測。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489700.html
上一篇:KerasImageDataGeneratorwithflow,GotValueError:`x`(imagestensor)and`y`(labels)shouldhavethesamelength
