自己拍了苹果和梨子各100张图片,将70张作为训练集,30张作为验证集。
代码如下,代码调用了VGG16作为base,不管是用base还是只有全连接层,accuracy一直都是50%,是模型出现问题还是数据量不够呢?
# imports
import os, warnings
import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing import image_dataset_from_directory
from google.colab import files
from google.colab import drive
from tensorflow import keras
from tensorflow.keras import layers
import pandas as pd
# Reproducability
def set_seed(seed=31415):
np.random.seed(seed)
tf.random.set_seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
os.environ['TF_DETERMINISTIC_OPS'] = '1'
set_seed(31415)
# Set Matplotlib defaults
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',
titleweight='bold', titlesize=18, titlepad=10)
plt.rc('image', cmap='magma')
warnings.filterwarnings("ignore") # to clean up output cells
# Load data
drive.mount('/content/drive')
path_train = "/content/drive/My Drive/fruit_train"
path_valid = "/content/drive/My Drive/fruit_valid"
# Load training and validation sets
ds_train_ = image_dataset_from_directory(
'/content/drive/My Drive/fruit_train',
labels='inferred',
label_mode='binary',
image_size=[224, 224],
interpolation='nearest',
batch_size=20,
shuffle=True,
)
ds_valid_ = image_dataset_from_directory(
'/content/drive/My Drive/fruit_valid',
labels='inferred',
label_mode='binary',
image_size=[224, 224],
interpolation='nearest',
batch_size=10,
shuffle=False,
)
# Data Pipeline
def convert_to_float(image, label):
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
return image, label
AUTOTUNE = tf.data.experimental.AUTOTUNE
ds_train = (
ds_train_
.map(convert_to_float)
.cache()
.prefetch(buffer_size=AUTOTUNE)
)
ds_valid = (
ds_valid_
.map(convert_to_float)
.cache()
.prefetch(buffer_size=AUTOTUNE)
)
pretrained_base = tf.keras.applications.VGG16(
include_top=True, weights='imagenet', input_tensor=None,
input_shape=None, pooling=None, classes=1000,
classifier_activation='softmax'
)
pretrained_base.trainable = False
model = keras.Sequential([
pretrained_base,
layers.Flatten(),
layers.Dense(6, activation='relu'),
layers.Dense(1, activation='sigmoid'),
])
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['binary_accuracy'],
)
history = model.fit(
ds_train,
validation_data=ds_valid,
epochs=5,
)