首先,我知道這里有一個類似的主題。 https://stats.stackexchange.com/questions/352036/what-should-i-do-when-my-neural-network-doesnt-learn
但不幸的是,這并沒有幫助。我的代碼中可能有一個我找不到的錯誤。我想做的是對一些WAV檔案進行分類。但是模型沒有學習。
首先,我正在收集檔案并將它們保存在一個陣列中。
其次,創建新的目錄,一個用于訓練資料,一個用于評價資料。 接下來,我正在讀取WAV檔案,創建頻譜圖,并將它們全部保存在火車目錄中。 之后,我將20%的資料從train目錄移到val目錄中。
注意:在創建頻譜圖時,我正在檢查WAV的長度。如果它太短(少于2秒),我就把它加倍。從這個頻譜圖中,我隨機切下一塊,只保存這塊。結果是,所有的影像都有相同的高度和寬度。
然后作為下一步,我正在加載火車和山谷的影像。在這里,我也在做規范化處理。
IMG_WIDTH=300
IMG_HEIGHT=300
IMG_DIM = (IMG_WIDTH, IMG_HEIGHT, 3)
train_files = glob.glob(DBMEL_PATH "*",recursive=True)
train_imgs = [img_to_array(load_img(img, target_size=IMG_DIM)) for img in train_files]
train_imgs = np.array(train_imgs) / 255 #歸一化資料
train_labels = [fn.split('/span>)[-1].split(' 。 '][1].strip() for fn in train_files ]
validation_files = glob.glob(DBMEL_VAL_PATH "*",recursive=True)
validation_imgs = [img_to_array(load_img(img, target_size=IMG_DIM)) for img in validation_files] 。
validation_imgs = np.array(validation_imgs) / 255 # 歸一化資料。
validation_labels = [fn.split('/span>)[-1].split(' 。 ')[1].strip() for fn in validation_files]
我已經檢查了這些變數并列印了它們。我想這是很好的作業。這些陣列包含了總資料的80%和20%。
#Train dataset shape: (3756, 300, 300, 3)
#Validation dataset shape: (939, 300, 300, 3)
接下來,我還實作了一個One-Hot-Encoder。 到目前為止還不錯。在下一步,我創建了空的DataGenerators,所以沒有任何資料增強。當呼叫DataGenerators時,一次是訓練資料,一次是價值資料,我將傳遞影像陣列(train_imgs, validation_imgs)和單熱編碼標簽(train_labels_enc, validation_labels_enc)。
好吧,現在是棘手的部分。 首先,創建/加載一個預訓練的網路
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.models import Model
import Tensorflow.keras
input_shape=(IMG_HEIGHT,IMG_WIDTH,3)
restnet = ResNet50(include_top=False, weights='imagenet', input_shape=(IMG_HEIGHT,IMG_WIDTH,3)
output = restnet.layer[-1].output
output = tensorflow.keras.layer.Flatten()(output)
restnet = Model(restnet.input, output)
for layer in restnet.layer:
layer.trainable = False[/span]。
現在終于創建了模型本身。在創建模型時,我使用了預先訓練好的網路進行遷移學習。我想在某個地方肯定有問題。
from tensorflow.keras.layer import Conv2D, MaxPooling2D, Flatten, Dense, Dropout, InputLayer
from tensorflow.keras.models import Sequential
from tensorflow.keras import optimizers
model = Sequential()
model.add(restnet) # <--轉移學習[/span
model.add(Dense(512, activation='relu', input_dim=input_shape))# 512(num_classes)
model.add(Dropout(0.3))
model.add(Dense(512, activation='relu')
model.add(Dropout(0.3))
model.add(Dense(7, activation='softmax')
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.summary()
而模型的運行是這樣的
history = model.fit_generator(train_generator,
steps_per_epoch=100,
epochs=100,
validation_data=val_generator,
validation_steps=10,
verbose=1)
)
但是,即使在50個歷時之后,準確率也停滯在0.15左右
Epoch 1/100。
100/100 [==============================] - 711s 7s/step - loss: 10.6419 -精確度。0.1530 - val_loss: 1.9416 - val_accuracy: 0.14672/100。
100/100 [==============================] - 733s 7s/step - loss: 1.9595 -精確度。0.1550 - val_loss: 1.9372 - val_accuracy: 0.1267 - val_accuracy: 0.1267
Epoch 3/100
100/100 [==============================] - 731s 7s/step - loss: 1.9940 -精確度。0.1444 - val_loss: 1.9388 - val_accuracy: 0.1400 - val_accuracy: 0.1400
紀元4/100。
100/100 [==============================] - 735s 7s/step - loss: 1.9416 -精確度。0.1535 - val_loss: 1.9380 - val_accuracy: 0.17335/100。
100/100 [==============================] - 737s 7s/step - loss: 1.9394 -精確度。0.1656 - val_loss: 1.9345 - val_accuracy: 0.15336/100。
100/100 [==============================] - 741s 7s/step - loss: 1.9364 -精確度。0.1667 - val_loss: 1.9286 - val_accuracy: 0.17677/100
100/100 [==============================] - 740s 7s/step - loss: 1.9389 -精確度。0.1523 - val_loss: 1.9305 - val_accuracy: 0.1400 - val_accuracy:
紀元8/100。
100/100 [==============================] - 737s 7s/step - loss: 1.9394 -精確度。0.1623 - val_loss: 1.9441 - val_accuracy: 0.1667 - val_accuracy: 0.1667
紀元9/100。
100/100 [==============================] - 735s 7s/step - loss: 1.9391 -精確度。0.1582 - val_loss: 1.9458 - val_accuracy: 0.1333 - val_accuracy: 0.1333
紀元10/100。
100/100 [==============================] - 734s 7s/step - loss: 1.9381 -精確度。0.1602 - val_loss: 1.9372 - val_accuracy: 0.1700 - val_accuracy: 0.1700
紀元11/100。
100/100 [==============================] - 739s 7s/step - loss: 1.9392 -精確度。0.1623 - val_loss: 1.9302 - val_accuracy: 0.2167 - val_accuracy:
Epoch 12/100
100/100 [==============================] - 741s 7s/step - loss: 1.9368 -精確度。0.1627 - val_loss: 1.9326 - val_accuracy: 0.146713/100。
100/100 [==============================] - 740s 7s/step - loss: 1.9381 -精確度。0.1513 - val_loss: 1.9312 - val_accuracy: 0.173314/100。
100/100 [==============================] - 736s 7s/step - loss: 1.9396 -精確度。0.1542 - val_loss: 1.9407 - val_accuracy: 0.1367 - val_accuracy:
Epoch 15/100
100/100 [==============================] - 741s 7s/step - loss: 1.9393 -精確度。0.1597 - val_loss: 1.9336 - val_accuracy: 0.1333 - val_accuracy: 0.1333
Epoch 16/100
100/100 [==============================] - 737s 7s/step - loss: 1.9375 -精確度。0.1659 - val_loss: 1.9354 - val_accuracy: 0.1267 - val_accuracy: 0.1267
Epoch 17/100
100/100 [==============================] - 741s 7s/step - loss: 1.9422 -精確度。0.1487 - val_loss: 1.9307 - val_accuracy: 0.1567 - val_accuracy: 0.1567
Epoch 18/100
100/100 [==============================] - 738s 7s/step - loss: 1.9399 -精確度。0.1680 - val_loss: 1.9408 - val_accuracy: 0.1567 - val_accuracy: 0.1567
紀元19/100
100/100 [==============================] - 743s 7s/step - loss: 1.9405 -精確度。0.1610 - val_loss: 1.9335 - val_accuracy: 0.1533 - val_accuracy: 0.1533
Epoch 20/100
100/100 [==============================] - 738s 7s/step - loss: 1.9410 -精確度。0.1575 - val_loss: 1.9331 - val_accuracy: 0.1533 - val_accuracy: 0.1533
紀元21/100。
100/100 [==============================] - 746s 7s/step - loss: 1.9395 -精確度。0.1639 - val_loss: 1.9344 - val_accuracy: 0.173322/100。
100/100 [==============================] - 746s 7s/step - loss: 1.9393 -精確度。0.1585 - val_loss: 1.9354 - val_accuracy: 0.1667 - val_accuracy: 0.1667
Epoch 23/100
100/100 [==============================] - 746s 7s/step - loss: 1.9398 -精確度。0.1599 - val_loss: 1.9352 - val_accuracy: 0.1500 - val_accuracy: 0.1500
Epoch 24/100
100/100 [==============================] - 746s 7s/step - loss: 1.9392 -精確度。0.1585 - val_loss: 1.9449 - val_accuracy: 0.1667 - val_accuracy:
Epoch 25/100
100/100 [==============================] - 746s 7s/step - loss: 1.9399 -精確度。0.1495 - val_loss: 1.9352 - val_accuracy: 0.1600。
誰能幫助找到問題所在?
uj5u.com熱心網友回復:
我自己解決了這個問題
。我交換了這個
model = Sequential()
model.add(restnet) # <--轉移學習[/span
model.add(Dense(512, activation='relu', input_dim=input_shape))# 512(num_classes)
model.add(Dropout(0.3))
model.add(Dense(512, activation='relu')
model.add(Dropout(0.3))
model.add(Dense(7, activation='softmax')
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.summary()
用這個:
base_model = tf.keras.applications. MobileNetV2(input_shape = (224, 224, 3)。include_top = False, weights = "imagenet" )
model = Sequential()
model.add(base_model)
model.add(tf.keras.layer.GlobalAveragePooling2D())
model.add(Dropout(0.2)
model.add(Dense(number_classes, activation="softmax"/span>)
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.00001)。
loss="categorical_crossentropy"/span>。
metrics=['準確性'])
model.summary()
而且我還發現了一件事。與一些教程相反,在處理頻譜圖時,使用資料增強并沒有用。 在沒有資料增強的情況下,我的訓練準確率為0.99,估值準確率為0.72。但使用資料增強后,我的訓練準確率只有0.75,估值準確率只有0.16。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/328129.html
標籤:
