TensorFlow Keras 使用Inception-resnet-v2模型训练自己的分类数据集(含源码)

TensorFlow Keras 使用Inception-resnet-v2模型训练自己的分类数据集(含源码)

运行环境

TensorFlow 1.13.1
TensorFlow.Keras 2.2.4-tf

简单介绍

使用TensorFlow自带的Inception-resnet-v2模型训练自己的数据集。数据读取用的是TensorFlow自己的Dataset类,且无需转存成TFrecord格式。使用TensorFlow中的Keras,简单易懂,容易上手

注意事项

  • 先准备好一个分类数据集
  • 使用GPU训练(用CPU应该训练不动Inception-resnet-v2模型,如果没有GPU你可以换成TensorFlow现有的其他模型,但代码需要进行一定的改动)

源码

废话不多说,上源码。
DATA_PATH放数据集路径

ds = ds.prefetch(buffer_size=10*BATCH_SIZE)

这一句用于预读取数据,用的时候注意下CPU和内存,特别是内存,如果百分之九十多了就把程序关了(友情提示Ctrl+C可关闭程序),把这句话注释掉再跑

mport pathlib
import random
import tensorflow as tf

# 训练数据集路径
DATA_PATH = 'E:\dataset'
# 一个批次的大小
BATCH_SIZE = 16
# 启用动态图
tf.enable_eager_execution()
# 数据集路径规范化
data_root = pathlib.Path(DATA_PATH)
# 获取图片的绝对路径
all_image_paths = list(data_root.glob('*/*'))
# 转换成字符串存进列表中
all_image_paths = [str(path) for path in all_image_paths]
# 图片数量
image_count = len(all_image_paths)
# 打乱顺序
random.shuffle(all_image_paths)
# 获取所有类名
label_names = sorted(item.name for item in data_root.glob('*/') if item.is_dir())
# 创建类名、索引字典
label_to_index = dict((name, index) for index,name in enumerate(label_names))
# 获取所有的图片类名对应的索引
all_image_labels = [label_to_index[pathlib.Path(path).parent.name]for path in all_image_paths]
# 进行one-hot编码
all_image_labels = tf.one_hot(all_image_labels,170,1,0)

# 图片的预处理函数
def preprocess_image(image):
  image = tf.image.decode_jpeg(image, channels=3)
  image = tf.image.resize(image, [299, 299])
  image /= 255.0  # normalize to [0,1] range
  return image

# 图片的加载函数
def load_and_preprocess_image(path):
  image = tf.io.read_file(path)
  return preprocess_image(image)

# 创建图片的Dataset类用于传输图片数据
path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)
# 绑定图片的初始化操作(加载和预处理)
image_ds = path_ds.map(load_and_preprocess_image)
# 创建索引的Dataset类
label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(all_image_labels, tf.int64))
# 将两个Dataset类打包成一个
image_label_ds = tf.data.Dataset.zip((image_ds, label_ds))
# 设置数据集无限循环使用
ds = image_label_ds.repeat()
# 打乱Dataset中的元素
ds = ds.shuffle(buffer_size=20*BATCH_SIZE)
# 设置Dataset的批次大小
ds = ds.batch(BATCH_SIZE)
# 预读取数据,减少数据读取对训练的影响
ds = ds.prefetch(buffer_size=10*BATCH_SIZE)
# 从Keras中获取现有的网络模型
model = tf.keras.applications.InceptionResNetV2(weights=None,classes=170)
# 网络模型的参数设置
model.compile(
  optimizer=tf.keras.optimizers.RMSprop(),
  loss='binary_crossentropy',
  metrics=['accuracy'])
# 设置训练时的回调函数
class CollectBatchStats(tf.keras.callbacks.Callback):
  def __init__(self):
    self.batch_losses = []
    self.batch_acc = []

  def on_train_batch_end(self, batch, logs=None):
    self.batch_losses.append(logs['loss'])
    self.batch_acc.append(logs['acc'])
    self.model.reset_metrics()

batch_stats_callback = CollectBatchStats()
# 开始训练
history = model.fit(ds, epochs=100,
                    steps_per_epoch=30,
                    callbacks = [batch_stats_callback])

参考文章:https://tensorflow.google.cn/beta/tutorials/load_data/images

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供代码实现。在这里,我将使用Keras中的ResNet50预训练模型,并使用Fashion-MNIST数据集对十种服装进行分类。首先,我们需要安装一些必要的库: ``` !pip install tensorflow !pip install keras !pip install matplotlib ``` 接下来,我们将加载数据集并进行预处理: ```python import numpy as np import keras from keras.datasets import fashion_mnist from keras.preprocessing.image import ImageDataGenerator # 数据集路径 (x_train, y_train), (x_test, y_test) = fashion_mnist.load_data() # 将图像转换为RGB格式 x_train = np.repeat(x_train[..., np.newaxis], 3, -1) x_test = np.repeat(x_test[..., np.newaxis], 3, -1) # 批量大小 batch_size = 32 # 数据增强 train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) # 没有数据增强的验证数据生成器 val_datagen = ImageDataGenerator(rescale=1./255) # 训练集生成器 train_generator = train_datagen.flow( x_train, keras.utils.to_categorical(y_train), batch_size=batch_size) # 验证集生成器 val_generator = val_datagen.flow( x_test, keras.utils.to_categorical(y_test), batch_size=batch_size) ``` 接下来,我们将加载ResNet50模型,并对其进行微调,以适应我们的数据集: ```python from keras.applications.resnet50 import ResNet50 from keras.layers import Dense, GlobalAveragePooling2D from keras.models import Model # 加载ResNet50模型,不包括顶层(全连接层) base_model = ResNet50(weights='imagenet', include_top=False) # 添加全局平均池化层 x = base_model.output x = GlobalAveragePooling2D()(x) # 添加全连接层,输出为十个类别 predictions = Dense(10, activation='softmax')(x) # 构建我们需要训练的完整模型 model = Model(inputs=base_model.input, outputs=predictions) # 冻结ResNet50的所有层,以便在训练过程中不更新它们的权重 for layer in base_model.layers: layer.trainable = False ``` 现在,我们可以开始训练模型了: ```python from keras.optimizers import SGD # 编译模型,指定损失函数、优化器和评价指标 model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.001), metrics=['accuracy']) # 训练模型 history = model.fit_generator( train_generator, steps_per_epoch=x_train.shape[0] // batch_size, epochs=10, validation_data=val_generator, validation_steps=x_test.shape[0] // batch_size) ``` 最后,我们可以使用matplotlib库绘制训练和验证的准确率和损失曲线: ```python import matplotlib.pyplot as plt # 绘制训练和验证的准确率曲线 plt.plot(history.history['accuracy']) plt.plot(history.history['val_accuracy']) plt.title('Model accuracy') plt.ylabel('Accuracy') plt.xlabel('Epoch') plt.legend(['Train', 'Val'], loc='upper left') plt.show() # 绘制训练和验证的损失曲线 plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('Model loss') plt.ylabel('Loss') plt.xlabel('Epoch') plt.legend(['Train', 'Val'], loc='upper left') plt.show() ``` 现在您应该可以使用这些代码实现您的需求了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值