实现多级分类,以及keras自定义Generator实现

一、基本介绍

最近在家闲着没事做尝试着用keras做一个图像的多级分类。基本上来说我自己制作了个比较简单的数据集,其中包括两大类:交通工具、动物;然后往下细分的话,交通工具中我简单地设置了三类:SUV、飞机和摩托车,动物则设置了两类:猫和狗。
目标自己训练一个多输出模型,可以用于判断输入图片属于动物还是交通工具,然后同样也可以细分归类是阿猫阿狗还是摩托suv飞机。

交通工具 名称(大类-细类-样本编号)
SUV vehicle_SUV_1
飞机 vehicle_plane_1
摩托车 vehicle_motor_1
动物 名称(大类-细类-样本编号)
animal_cat_1
animal_dog_1

二、数据及标签处理

自行编写了prepare函数用于将数据进行一定的预处理。首先将图片数据读入,然后使用per_image_standardization函数将图片进行规范化处理。至于标签的处理,则将其分为两类标签分别是labels1和labels2,分别对应交通工具这样的大类标签以及SUV这样的细类标签。

import matplotlib
from keras.preprocessing.image import ImageDataGenerator
from keras.optimizers import Adam
from keras.preprocessing.image import img_to_array
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.model_selection import train_test_split
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import random
import pickle
import cv2
import os
Image_width=150
Image_height=150
Image_size=(Image_width,Image_height)
Image_channels=3
batch_size=15
#输入训练文件路径,返回数据array以及labels
def prepare(path):
    fileList = os.listdir(path)  # 训练数据文件夹
    data=[]
    labels1=[]
    labels2=[]
    for fileName in fileList:
        image=cv2.imread(os.path.join(path,fileName))
        if image is not None:
            std_image=tf.image.per_image_standardization(image)#图片normalization
            image2=cv2.resize(std_image.numpy(),Image_size)
            image2=img_to_array(image2)
            data.append(image2)
            label1=str(fileName
  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Keras 是一个高度模块化的深度学习框架,提供了各种预定义的层类型,如全连接层、卷积层、池化层等等。然而,在某些情况下,您可能需要自定义一些层来实现您所需的特定功能。在 Keras 中,您可以通过继承 keras.layers.Layer 类来自定义层。 以下是一个简单的例子,展示如何使用 Keras 自定义层类: ```python import tensorflow as tf from tensorflow import keras class MyLayer(keras.layers.Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim super(MyLayer, self).__init__(**kwargs) def build(self, input_shape): self.kernel = self.add_weight(name='kernel', shape=(input_shape[1], self.output_dim), initializer='uniform', trainable=True) super(MyLayer, self).build(input_shape) def call(self, inputs): return tf.matmul(inputs, self.kernel) def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim) ``` 在上面的代码中,我们定义了一个名为 MyLayer 的自定义层类。该层包含一个内部实现,用于将输入张量与内部权重矩阵相乘,以产生输出张量。在这个例子中,我们使用了 TensorFlow 的 matmul 函数来实现这个操作。 我们还实现了两个必需的方法:build 和 compute_output_shape。build 方法用于初始化内部权重,并将它们添加到层中。compute_output_shape 方法用于确定输出张量的形状。 要使用自定义层,您可以像使用任何其他层一样使用它。例如: ```python model = keras.Sequential([ MyLayer(10, input_shape=(784,)), keras.layers.Activation('softmax'), ]) ``` 在上面的代码中,我们创建了一个顺序模型,并将 MyLayer 作为第一层添加到模型中。然后,我们添加了一个 softmax 激活层,以便产生最终输出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值