python - 对于相同的 keras 模型,我得到不同的结果
问题描述
我用 imagenet-weights 训练了一个 VGG16 来对 4 个类的图像进行分类。
训练数据:3578 幅图像,属于 4 个类别。验证数据:894 张图片属于 4 个类别
每次我运行代码时,我都会得到这两个准确度值之一。val_acc:第一次运行时为 1.0000。val_acc:第二次运行时为 0.3364。
对此有何解释?因为结果之间的差异太大了。
train_dir = 'C:/Users/ucduq/Desktop/output1/train'
validation_dir = 'C:/Users/ucduq/Desktop/output1/val'
training_data_generator = ImageDataGenerator(
rescale=1./255,
#rotation_range=90,
#horizontal_flip=True,
# vertical_flip=True,
#shear_range=0.9
#zoom_range=0.9
)
validation_data_generator = ImageDataGenerator(rescale=1./255)
IMAGE_WIDTH=150
IMAGE_HEIGHT=150
BATCH_SIZE=32
input_shape=(150,150,3)
training_generator = training_data_generator.flow_from_directory(
train_dir,
target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),
batch_size=BATCH_SIZE,
class_mode="categorical")
validation_generator = validation_data_generator.flow_from_directory(
validation_dir,
target_size=(IMAGE_WIDTH, IMAGE_HEIGHT),
batch_size=BATCH_SIZE,
class_mode="categorical",
shuffle=False)
from keras.applications import VGG16
vgg_conv = VGG16(weights='imagenet',
include_top=False,
input_shape=(150, 150, 3))
model = models.Sequential()
model.add(vgg_conv)
### Add new layers
model.add(layers.Flatten())
model.add(layers.Dense(1024, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(4, activation='softmax'))
model.compile(loss="categorical_crossentropy",optimizer='adam',metrics=["accuracy"])
results = model.fit_generator(training_generator, steps_per_epoch=training_generator.samples/training_generator.batch_size,
epochs=100,
callbacks=callbacks,
validation_data=validation_generator, validation_steps=28)
first run:
Epoch 100/100
111/110 [==============================] - 17s 152ms/step - loss: 1.3593 - acc: 0.3365 - val_loss: 1.3599 - val_acc: 0.3364
second run:
Epoch 100/100
111/110 [==============================] - 18s 158ms/step - loss: 1.9879e-06 - acc: 1.0000 - val_loss: 5.2915e-06 - val_acc: 1.0000
解决方案
我假设你的数据有一个类是整个集合的 33%?如果这是真的,那么first run:
模型根本没有学到任何东西(acc: 0.3365
)。
这可能是因为数据增强的使用不正确,如果注释行是您在第一次运行时使用的,那么它们就是罪魁祸首。
#shear_range=0.9
和
太多了,其中
#zoom_range=0.9
只有一个意味着您对每张图像的 90% 不和谐,因此模型不会学到任何东西。
推荐阅读
- android - 为什么imageView在android中会翻倍?
- c# - 但问题我有他们想要 20,35,45 是第 15 步,然后是 10
- php - PHP exec()命令不返回Ajax成功函数
- javascript - 有没有办法在 Javascript 中添加链接(包含 php)?
- python - 第一个路由过滤器后的路由
- c++ - 在 C++ 类中实现 TPCircularBuffer
- android - 使用 Xamarin 将文件写入手机的内部存储
- oop - 如何在 UML 类图中对非成员聚合建模
- javascript - 元素。删除不起作用。(innerHTML 工作正确)
- python - TypeError:强制转换为 Unicode:需要找到字符串或缓冲区日期时间日期时间