首页 > 解决方案 > 使用 Kera val_acc 静态值进行图像分类

问题描述

海我一直在尝试使用 keras 进行图像分类,但是当我拟合测试和训练数据时,损失,val_loss 为 0,val_accuracy 是静态值,并且每个时期都不会改变。提供了下面的代码和终端输出。请帮我。谢谢

import numpy
import cv2
import tensorflow as tf
from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

training_set = train_datagen.flow_from_directory(
    "Breast_MRI/Train",
    target_size=(32, 32),
    shuffle=True,
    batch_size=128,
    class_mode='binary')

test_datagen = ImageDataGenerator(
    rescale=1. / 255)

test_set = test_datagen.flow_from_directory(
    "Breast_MRI/Test",
    target_size=(32, 32),
    shuffle=True,
    batch_size=128,
    class_mode='binary')


cnn = tf.keras.models.Sequential()

'''Convolution'''
cnn.add(tf.keras.layers.Conv2D(filters=16, kernel_size=3, activation='relu', input_shape=[32, 32, 3]))

'''Pooling'''
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))

'''2nd conventional layer'''
cnn.add(tf.keras.layers.Conv2D(filters=16, kernel_size=3, activation='relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))

'''Flattening'''
cnn.add(tf.keras.layers.Dropout(0.8))
cnn.add(tf.keras.layers.Flatten())

'''Full Connection'''
cnn.add(tf.keras.layers.Dense(units=128, activation='relu'))
cnn.add(tf.keras.layers.Dense(units=64, activation='relu'))
cnn.add(tf.keras.layers.Dense(units=32, activation='relu'))

'''Output Layer'''
cnn.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))

'''Training the CNN'''
cnn.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy'])
history = cnn.fit(training_set, validation_data=test_set, epochs=10)

这是终端输出:

Epoch 1/10
14/14 [==============================] - 12s 849ms/step - loss: 0.0000e+00 - accuracy: 0.2178 - val_loss: 0.0000e+00 - val_accuracy: 0.2000
Epoch 2/10
14/14 [==============================] - 11s 768ms/step - loss: 0.0000e+00 - accuracy: 0.2013 - val_loss: 0.0000e+00 - val_accuracy: 0.2000
Epoch 3/10
14/14 [==============================] - 11s 769ms/step - loss: 0.0000e+00 - accuracy: 0.2050 - val_loss: 0.0000e+00 - val_accuracy: 0.2000
Epoch 4/10
14/14 [==============================] - 11s 770ms/step - loss: 0.0000e+00 - accuracy: 0.1935 - val_loss: 0.0000e+00 - val_accuracy: 0.2000
Epoch 5/10
14/14 [==============================] - 11s 774ms/step - loss: 0.0000e+00 - accuracy: 0.2041 - val_loss: 0.0000e+00 - val_accuracy: 0.2000
Epoch 6/10
14/14 [==============================] - 11s 768ms/step - loss: 0.0000e+00 - accuracy: 0.1914 - val_loss: 0.0000e+00 - val_accuracy: 0.2000
Epoch 7/10
14/14 [==============================] - 11s 764ms/step - loss: 0.0000e+00 - accuracy: 0.1906 - val_loss: 0.0000e+00 - val_accuracy: 0.2000
Epoch 8/10
14/14 [==============================] - 11s 771ms/step - loss: 0.0000e+00 - accuracy: 0.2022 - val_loss: 0.0000e+00 - val_accuracy: 0.2000
Epoch 9/10
14/14 [==============================] - 11s 768ms/step - loss: 0.0000e+00 - accuracy: 0.2069 - val_loss: 0.0000e+00 - val_accuracy: 0.2000
Epoch 10/10
14/14 [==============================] - 11s 779ms/step - loss: 0.0000e+00 - accuracy: 0.2172 - val_loss: 0.0000e+00 - val_accuracy: 0.2000

问题是我需要损失值、val_loss、val_accuracy。我不知道它是否正确,因为我是机器学习部分的新手。请帮我

标签: pythontensorflowkeras

解决方案


仅在需要时使用精度输出打印。并且在需要时,请为您选择合适的准确度指标并包含所需的内容。对于简单的方法,我认为它适合您监控培训性能的目的,请按照下面的示例,通过修改您的代码来完成。此外,按照评论中的建议测试不同的损失参数并查看效果。

import numpy
import cv2
import tensorflow as tf
from keras.preprocessing.image import ImageDataGenerator

cnn = tf.keras.models.Sequential()

'''Convolution'''
cnn.add(tf.keras.layers.Conv2D(filters=16, kernel_size=3, activation='relu', input_shape=[32, 32, 3]))

'''Pooling'''
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))

'''2nd conventional layer'''
cnn.add(tf.keras.layers.Conv2D(filters=16, kernel_size=3, activation='relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))

'''Flattening'''
cnn.add(tf.keras.layers.Dropout(0.8))
cnn.add(tf.keras.layers.Flatten())

'''Full Connection'''
cnn.add(tf.keras.layers.Dense(units=128, activation='relu'))
cnn.add(tf.keras.layers.Dense(units=64, activation='relu'))
cnn.add(tf.keras.layers.Dense(units=32, activation='relu'))

'''Output Layer'''
cnn.add(tf.keras.layers.Dense(units=1, activation='sigmoid'))

'''Training the CNN'''
cnn.compile(loss='mean_squared_error', optimizer="adam") #, metrics=['accuracy'])
#history = cnn.fit(training_set, validation_data=test_set, epochs=10)

#Let's test...with a simulated model ... 
import numpy as np

simu_training_set_x=tf.convert_to_tensor(np.random.rand(10,32,32,3))
simu_training_set_y=tf.convert_to_tensor(np.random.rand(10,1))
history = cnn.fit(simu_training_set_x, simu_training_set_y, epochs=10)

推荐阅读