python - InceptionV3 中的梯度消失和非常低的准确度
问题描述
我正在使用 tensorflow 使用 InceptionV3 进行多类分类。我以为我做对了,但结果很奇怪,离我想要的还很远。
Epoch 1/10
58/58 [==============================] - 47s 591ms/step - loss: 0.0000e+00 - accuracy: 0.0279
Epoch 2/10
58/58 [==============================] - 38s 591ms/step - loss: 0.0000e+00 - accuracy: 0.0286
Epoch 3/10
58/58 [==============================] - 38s 596ms/step - loss: 0.0000e+00 - accuracy: 0.0249
Epoch 4/10
58/58 [==============================] - 38s 603ms/step - loss: 0.0000e+00 - accuracy: 0.0250
这是我的代码。
这段代码是我处理数据的地方。raw_train 来自 oxford_iiit_pet。
dataset, metadata = tfds.load('oxford_iiit_pet', with_info=True, as_supervised=True)
raw_train, raw_test = dataset['train'], dataset['test']
IMAGE_SIZE = (224, 224)
def preprocess_dataset(image, label):
image = tf.cast(image, tf.float32)
image = (image/127.5)-1 # might need to fix this part
image = tf.image.resize(image, IMAGE_SIZE)
return image, label
BATCH_SIZE = 64
SHUFFLE_BUFFER_SIZE = 1024
train = raw_train.map(preprocess_dataset)
test = raw_test.map(preprocess_dataset)
train_batches = train.shuffle(SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE)
test_batches = test.batch(BATCH_SIZE)
这是我的模型。
IMG_SHAPE = (IMAGE_SIZE[0], IMAGE_SIZE[1], 3)
model_inception = tf.keras.applications.InceptionV3(input_shape=IMG_SHAPE, include_top = False, weights = 'imagenet')
model_inception.trainable = False # freeze the model
learning_rate = 0.001
model = tf.keras.Sequential([
model_inception,
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(
optimizer = tf.keras.optimizers.RMSprop(lr=learning_rate),
loss = 'categorical_crossentropy',
metrics=['accuracy']
)
EPOCHS = 10
history = model.fit(
train_batches,
epochs = EPOCHS
)
我不完全确定这是我预处理数据的方式还是我设置模型的方式。在我真正运行模型之前,一切似乎都很好。似乎正在发生梯度消失,但我不知道为什么以及它是否真的是问题所在。我已经查看了该模型的使用方式,但似乎没有什么能清楚地给出答案。
解决方案
因此,您输出的是 . 域中的单个值[0.0,1.0]
。但是你说有多个类,而不仅仅是一个类:所以你要让最后一层的神经元数量不管有多少类,并将其从sigmoid
激活变为softmax
激活。像这样:
NUM_CLASSES = 8 # edit this number to suit your problem
model = tf.keras.Sequential([
model_inception,
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
])
sigmoid
将无法正常工作,即使它看起来像(因为所有值都是 0 和 1 之间的浮点数,就像softmax
会给你一样)。
坦率地说,我什至不确定您在调用fit()
. 这是 Keras 的问题之一,恕我直言:它是如此的用户友好,以至于它会“工作”(也就是说,运行,而不是工作),即使它应该给你一个关于你如何设置数据的提示不当。除非您的训练集中的训练目标包含每个输入图像的单个浮点值,否则它甚至不应该运行。
推荐阅读
- javascript - 如何在 p5js 中使用箭头键跳转对象?
- sql - 具有多个顺序列的sql server中的条件顺序
- java - 从 FireStore android 检索自定义字段
- c++ - 如何在 Clang LibTooling 中获取有关调用析构函数的信息?
- javascript - 在某个元素之后查找类
- java - 当 postDelayed 处理程序运行时,AsynchTask 冻结
- php - 消息:未定义属性:CI_DB_mysqli_result::$num_row
- css - React js语义菜单项在中心
- python - 如何在 pycharms 交互式调试器中评估协程
- firebase - 无法为 Firebase 子集合和角色创建正确的规则