簡體   English   中英

在 Tensorflow 中使用 Keras 的非常簡單的 CNN model 精度太低

[英]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 - 稍微好一點

謝謝您的幫助。 在我的代碼中刪除隨機數的使用並禁用隨機播放后,它開始在我運行代碼的時間達到 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM