[英]Accuracy too low with very simple CNN model using Keras in Tensorflow
我是 TensorFlow 的新手,因此不勝感激。 我的 model 的 output 與輸入相同,只是形狀不同,所以我預計精度為 1,但我得到的是 0.0062。
輸入
我的數據集的每個輸入都是 (19, 19, 1) 的形狀。 對於這些輸入中的每一個,只有一個隨機單個值設置為 1,而 rest 為 0。示例但帶有 (4, 4, 1):
# [[0, 0, 0, 0],
# [0, 1, 0, 0],
# [0, 0, 0, 0],
# [0, 0, 0, 0]
輸出
每個 output 的形狀為 (361),本質上是其輸入的扁平版本,因此理論上達到 1 的精度應該不是問題。 例子:
# [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
我的數據集由 2404 個這些樣本組成。
這是我的代碼。 請注意,我嘗試了不同損失函數和優化器的組合:
model = models.Sequential()
model.add(layers.Conv2D(1, (1, 1), activation='relu', padding='same', input_shape=(19, 19, 1)))
model.add(layers.Flatten())
model.add(layers.Dense(19 * 19, activation='softmax'))
model.compile(
optimizer='adam',
loss=tf.keras.losses.Huber(),
metrics=['accuracy']
)
dataset = Dataset()
inputs = dataset.input
outputs = dataset.output
model.fit(
inputs, # (2404, 19, 19, 1)
outputs, # (2404, 361)
epochs=1000,
shuffle=True,
verbose=1
)
結果
它很快達到 0.0062 並保持在那里。
Epoch 10/1000
76/76 [==============================] - 0s 2ms/step - loss: 0.0014 - accuracy: 0.0062
謝謝您的幫助。 在我的代碼中刪除隨機數的使用並禁用隨機播放后,它開始在我運行代碼的時間達到 1.00 50% 的准確度。 其他 50% 的峰值精度為 0.0046。 當我嘗試將權重和偏差初始化為 0 時,它在 0.0046 100% 的時間達到峰值。 更新我所有的 TF 包幾乎解決了這個問題,現在 90% 的時間都成功了。
從評論中得出答案。 您正在對 1x1 kernel 進行卷積,然后將其傳遞給密集層。 您希望網絡學習的理想參數是密集層中的所有權重都是 kernel 值的倒數。 不過,這里最重要的是您通常會通過零。 密集層中的任何權重值,應用於零會導致另一個零,因此零會導致梯度消失。
當您將權重初始化為零時,這會將您的輸入向量變為全零,全零總是結束學習。 不能反向傳播。 當您不對初始化做任何事情時,TF 使用正態分布進行初始化,以 0 為中心。一半時間,初始化的 kernel 值為負數。 卷積后,你得到全零和一個負數。 在 relu 之后你全為零。 它可以學習的時間有一半——因為偶然它用正的 kernel 值初始化,而一半的時間不能。
嘗試這個:
initializer = tf.keras.initializer.Ones()
model.add(layers.Conv2D(1, (1, 1), kernel_initializer=initializer, activation='relu', padding='same', input_shape=(19, 19, 1)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.