python - 使用 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。我不知道它是否正确,因为我是机器学习部分的新手。请帮我
解决方案
仅在需要时使用精度输出打印。并且在需要时,请为您选择合适的准确度指标并包含所需的内容。对于简单的方法,我认为它适合您监控培训性能的目的,请按照下面的示例,通过修改您的代码来完成。此外,按照评论中的建议测试不同的损失参数并查看效果。
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)
推荐阅读
- android - 谷歌地图:为什么我会收到referer-not-allowed-map-error?
- ruby-on-rails - 使用 has_many 创建一个 Ruby 对象:通过
- graphql - 如何通过没有边的后代过滤 GraphQL 结果?
- corda - 由于 pg_largeobject,Postgres DB 占用了大量空间
- sitecore - 我们可以限制为任何特定模板创建子项吗?
- python - Openpyxl 小写 VLOOKUP
- c# - C# .Net Newtonsoft JSON 不序列化属性但在 Json Post 中读取它
- multithreading - 引用队列中的前数据包时程序终止
- android - 错误:android.view.WindowManager$BadTokenException
- augmented-reality - SensorStreamViewer,HoloLensForCV:“初始化媒体捕获失败:访问被拒绝。”