Python keras卡在0损失值
我要把这张x光片分为细菌、病毒和正常三类。问题是我的准确率真的很低,比如25%,而损失一直是0。我使用一个预训练的神经网络,它使用来自X射线胸部图像数据集的权重。此nn使用keras.loss.CategoricalCrossentropy作为损失函数,使用keras.metrics.accurity()作为精度Python keras卡在0损失值,python,tensorflow,keras,Python,Tensorflow,Keras,我要把这张x光片分为细菌、病毒和正常三类。问题是我的准确率真的很低,比如25%,而损失一直是0。我使用一个预训练的神经网络,它使用来自X射线胸部图像数据集的权重。此nn使用keras.loss.CategoricalCrossentropy作为损失函数,使用keras.metrics.accurity()作为精度 import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
TRAIN_DIR = 'D:/tf/archiveBilanciato/chest_xray/train/PNEUMONIA'
TEST_DIR = 'D:/tf/archiveBilanciato/chest_xray/test'
IMG_SIZE = 224 #224 è quella migliore
image_size = (IMG_SIZE, IMG_SIZE)
batch_size = 32
LR = 1e-3
import os
nt = 0
for folder_name in ("bacteria", "normal","virus"):
folder_path = os.path.join("D:/tf/NeoArchiveBilanciato/chest_xray", folder_name)
for fname in os.listdir(folder_path):
fpath = os.path.join(folder_path, fname)
nt += 1
print("Totale immagini: %d" % nt)
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
"D:/tf/NeoArchiveBilanciato/chest_xray",
validation_split=0.2,
subset="training",
seed=1337,
color_mode='rgb',
image_size=image_size,
batch_size=batch_size,
)
val_ds = tf.keras.preprocessing.image_dataset_from_directory(
"D:/tf/NeoArchiveBilanciato/chest_xray",
validation_split=0.2,
subset="validation",
seed=1337,
color_mode='rgb',
image_size=image_size,
batch_size=batch_size,
)
import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras.applications import DenseNet121
from keras.layers import GlobalAveragePooling2D,Dense
def pre_model():
base_model = tf.keras.applications.DenseNet121(
weights='imagenet', include_top=False, input_shape=(224, 224, 3))
x = base_model.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(14, activation="softmax")(x)
pre_model = keras.Model(inputs=base_model.input, outputs=predictions)
return pre_model
base_model = pre_model()
base_model.load_weights("D:/tf/nih_pretrained_chest_model.h5")
#print(base_model.summary())
from keras.layers import Input
#from tensorflow.keras.layers import Input
from kerassurgeon.operations import delete_layer, insert_layer
from keras.models import load_model
new_input = Input(shape=(IMG_SIZE, IMG_SIZE, 3), name='image_input')
model_imp = base_model
model_imp = Dense(3, activation='softmax')(model_imp.layers[-2].output)
base_model.trainable = False
mio_classificatore = Dense(1, activation='softmax')(base_model.layers[-2].output)
nuovo_model = keras.Model(inputs=base_model.input, outputs=mio_classificatore)
#print(nuovo_model.summary())
train = train_ds
val = val_ds
nuovo_model.compile(optimizer=keras.optimizers.Adam(),
loss=keras.losses.CategoricalCrossentropy(),
metrics=[keras.metrics.Accuracy()])
nuovo_model.fit(train,batch_size=32, epochs=14, validation_data=val)
如何解决这个问题?有3个类别需要预测,因此模型的最后一层应该包含3个神经元(每个类别1个),而不是1个神经元 尝试改变
mio_classificatore = Dense(1, activation='softmax')(base_model.layers[-2].output)
到
您不能将softmax与一个神经元一起使用,它将产生恒定的输出。谢谢您的回答。当我这样做时,我会得到以下错误:ValueError:Shapes(None,1)和(None,3)不兼容
mio_classificatore = Dense(3, activation='softmax')(base_model.layers[-2].output)