Tensorflow2.x框架-神经网络八股扩展-自制数据集

自制数据集,解决本领域应用

 

目录

摘要

一、Sequential() 实现自制数据集

二、Class() 实现自制数据集


摘要

mnist_image_label 文件夹:

 

    mnist_train_jpg_60000(训练集图片):

        存放训练用的 60000 张图片,都是灰底白字的灰度图。

        每张图有28行28列个像素点,每个像素点都是0到255之间的整数。

        纯黑色用数值0表示,纯白色用数值255表示。

    mnist_test_jpg_10000(训练集图片):

        存放测试用的 10000 张图片,都是灰底白字的灰度图。

        每张图有28行28列个像素点,每个像素点都是0到255之间的整数。

        纯黑色用数值0表示,纯白色用数值255表示。

    mnist_train_jpg_60000.txt(训练集标签):

        存放60000张训练集图片的图片名和对应的标签,中间用空格隔开。

        比如,28755_0.jpg 0 中 28755_0.jpg 就是训练集第一张图片的图片名,空格后的 0 是这张图所对应的标签。

    mnist_test_jpg_10000.txt(训练集标签):

        存放10000张测试集图片的图片名和对应的标签,中间用空格隔开。

        比如,2028_7.jpg 7中 2028_7.jpg 就是训练集第一张图片的图片名,空格后的 7 是这张图所对应的标签。

图片文件夹:

    

标签文件:

一、Sequential() 实现自制数据集

"""
自制数据集,解决本领域应用
"""
# 导入模块
import os
import numpy as np
import tensorflow as tf
from PIL import Image

# 根目录
base_path = os.path.dirname(os.path.abspath(__file__))
# ../MNIST_FC/mnist_image_label/
base_path = os.path.join(base_path, "MNIST_FC")
base_path = os.path.join(base_path, "mnist_image_label")

# 训练集文件
train_path = os.path.join(base_path, "mnist_train_jpg_60000")
# 训练集标签
train_txt = os.path.join(base_path, "mnist_train_jpg_60000.txt")
# 训练集数据存储文件
x_train_save_path = os.path.join(base_path, "mnist_x_train.npy")
# 训练集标签存储文件
y_train_save_path = os.path.join(base_path, "mnist_y_train.npy")

# 测试集文件
test_path = os.path.join(base_path, r"mnist_test_jpg_10000/")
# 测试集标签
text_txt = os.path.join(base_path, r"mnist_test_jpg_10000.txt")
# 测试集数据存储文件
x_test_save_path = os.path.join(base_path, "mnist_x_test.npy")
# 测试集标签存储文件
y_test_save_path = os.path.join(base_path, "mnist_y_test.npy")


def generate_data_sets(path, txt):
    """
    加载数据集
    :param path: 输入特征路径
    :param txt: 标签路径文件名
    :return:
    """
    f = open(txt, 'r')  # 以只读形式打开txt文件
    contents = f.readlines()  # 读取文件中所有行
    f.close()  # 关闭txt文件
    x, y_ = [], []  # 建立空列表
    for content in contents:  # 逐行取出
        value = content.split()  # 以空格分开,图片路径为value[0] , 标签为value[1] , 存入列表
        img_path = os.path.join(path, value[0])  # 拼出图片路径和文件名
        img = Image.open(img_path)  # 读入图片
        img = np.array(img.convert('L'))  # 图片变为8位宽灰度值的np.array格式
        img = img / 255.  # 数据归一化 (实现预处理)
        x.append(img)  # 归一化后的数据,贴到列表x
        y_.append(value[1])  # 标签贴到列表y_
        print('loading : ' + content)  # 打印状态提示

    x = np.array(x)  # 变为np.array格式
    y_ = np.array(y_)  # 变为np.array格式
    y_ = y_.astype(np.int64)  # 变为64位整型
    return x, y_  # 返回输入特征x,返回标签y_


if os.path.exists(x_train_save_path) and os.path.exists(y_train_save_path) and \
        os.path.exists(y_test_save_path) and os.path.exists(y_test_save_path):
    print("------------Load Data Sets------------")
    x_train_save = np.load(x_train_save_path)
    y_train = np.load(y_train_save_path)
    x_test_save = np.load(x_test_save_path)
    y_test = np.load(y_test_save_path)

    x_train = np.reshape(x_train_save, (len(x_train_save), 28, 28))
    x_test = np.reshape(x_test_save, (len(x_test_save), 28, 28))
    # x_train = x_train_save.reshape(len(x_train_save), 28, 28)
    # x_test = x_test_save.reshape(len(x_test_save), 28, 28)
else:
    print("------------Generate Data Sets------------")
    x_train, y_train = generate_data_sets(train_path, train_txt)
    x_test, y_test = generate_data_sets(test_path, text_txt)

    print("------------Save Data Sets------------")
    x_train_save = np.reshape(x_train, (len(x_train), -1))
    x_test_save = np.reshape(x_test, (len(x_test), -1))
    # x_train_save = x_train.reshape(len(x_train), -1)
    # y_test_save = x_test.reshape(len(x_test), -1)

    np.save(x_train_save_path, x_train_save)
    np.save(y_train_save_path, y_train)
    np.save(x_test_save_path, x_test_save)
    np.save(y_test_save_path, y_test)


# 搭建网络结构
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),  # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值
    tf.keras.layers.Dense(128, activation="relu"),  # 第一层网络128个神经元,使用relu激活函数
    tf.keras.layers.Dense(10, activation="softmax")     # 第二层网络10个神经元,使用softmax激活函数,使输出符合概率分布
])

# 配置训练方法
model.compile(optimizer="adam",     # 优化器
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),    # 损失函数,输出是概率分布,from_logits=False
              metrics=["sparse_categorical_accuracy"])  # 数据集中的标签是数值,神经网络输出y是概率分布

# 执行训练过程
model.fit(x_train,  # 训练集输入特征
          y_train,  # 训练集标签
          batch_size=32,    # 每次喂入网络32组数据
          epochs=5,     # 数据集迭代5次
          validation_data=(x_test, y_test),     # 测试集输入特征,测试集标签
          validation_freq=1)     # 每迭代1次训练集执行一次测试集的评测

# 打印出网络结构和参数统计
model.summary()

二、Class() 实现自制数据集

"""
自制数据集,解决本领域应用
"""
# 导入模块
import os
import numpy as np
import tensorflow as tf
from PIL import Image
from tensorflow.keras import Model
from tensorflow.keras.layers import Dense, Flatten

# 根目录
base_path = os.path.dirname(os.path.abspath(__file__))
# ../MNIST_FC/mnist_image_label/
base_path = os.path.join(base_path, "MNIST_FC")
base_path = os.path.join(base_path, "mnist_image_label")

# 训练集文件
train_path = os.path.join(base_path, "mnist_train_jpg_60000")
# 训练集标签
train_txt = os.path.join(base_path, "mnist_train_jpg_60000.txt")
# 训练集数据存储文件
x_train_save_path = os.path.join(base_path, "mnist_x_train.npy")
# 训练集标签存储文件
y_train_save_path = os.path.join(base_path, "mnist_y_train.npy")

# 测试集文件
test_path = os.path.join(base_path, r"mnist_test_jpg_10000/")
# 测试集标签
text_txt = os.path.join(base_path, r"mnist_test_jpg_10000.txt")
# 测试集数据存储文件
x_test_save_path = os.path.join(base_path, "mnist_x_test.npy")
# 测试集标签存储文件
y_test_save_path = os.path.join(base_path, "mnist_y_test.npy")


def generate_data_sets(path, txt):
    """
    加载数据集
    :param path: 输入特征路径
    :param txt: 标签路径文件名
    :return:
    """
    f = open(txt, 'r')  # 以只读形式打开txt文件
    contents = f.readlines()  # 读取文件中所有行
    f.close()  # 关闭txt文件
    x, y_ = [], []  # 建立空列表
    for content in contents:  # 逐行取出
        value = content.split()  # 以空格分开,图片路径为value[0] , 标签为value[1] , 存入列表
        img_path = os.path.join(path, value[0])  # 拼出图片路径和文件名
        img = Image.open(img_path)  # 读入图片
        img = np.array(img.convert('L'))  # 图片变为8位宽灰度值的np.array格式
        img = img / 255.  # 数据归一化 (实现预处理)
        x.append(img)  # 归一化后的数据,贴到列表x
        y_.append(value[1])  # 标签贴到列表y_
        print('loading : ' + content)  # 打印状态提示

    x = np.array(x)  # 变为np.array格式
    y_ = np.array(y_)  # 变为np.array格式
    y_ = y_.astype(np.int64)  # 变为64位整型
    return x, y_  # 返回输入特征x,返回标签y_


if os.path.exists(x_train_save_path) and os.path.exists(y_train_save_path) and \
        os.path.exists(y_test_save_path) and os.path.exists(y_test_save_path):
    print("------------Load Data Sets------------")
    x_train_save = np.load(x_train_save_path)
    y_train = np.load(y_train_save_path)
    x_test_save = np.load(x_test_save_path)
    y_test = np.load(y_test_save_path)

    x_train = np.reshape(x_train_save, (len(x_train_save), 28, 28))
    x_test = np.reshape(x_test_save, (len(x_test_save), 28, 28))
    # x_train = x_train_save.reshape(len(x_train_save), 28, 28)
    # x_test = x_test_save.reshape(len(x_test_save), 28, 28)
else:
    print("------------Generate Data Sets------------")
    x_train, y_train = generate_data_sets(train_path, train_txt)
    x_test, y_test = generate_data_sets(test_path, text_txt)

    print("------------Save Data Sets------------")
    x_train_save = np.reshape(x_train, (len(x_train), -1))
    x_test_save = np.reshape(x_test, (len(x_test), -1))
    # x_train_save = x_train.reshape(len(x_train), -1)
    # y_test_save = x_test.reshape(len(x_test), -1)

    np.save(x_train_save_path, x_train_save)
    np.save(y_train_save_path, y_train)
    np.save(x_test_save_path, x_test_save)
    np.save(y_test_save_path, y_test)


# 搭建网络结构
class MnistModel(Model):
    def __init__(self):
        super(MnistModel, self).__init__()
        self.flatten = Flatten()     # 将输入特征拉直为一维数组,也就是拉直为28*28=784个数值
        self.d1 = Dense(128, activation="relu")  # 第一层网络128个神经元,使用relu激活函数
        self.d2 = Dense(10, activation="softmax")     # 第二层网络10个神经元,使用softmax激活函数,使输出符合概率分布

    def call(self, x):
        x = self.flatten(x)
        x = self.d1(x)
        y = self.d2(x)
        return y


model = MnistModel()

# 配置训练方法
model.compile(optimizer="adam",     # 优化器
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),    # 损失函数,输出是概率分布,from_logits=False
              metrics=["sparse_categorical_accuracy"])  # 数据集中的标签是数值,神经网络输出y是概率分布

# 执行训练过程
model.fit(x_train,  # 训练集输入特征
          y_train,  # 训练集标签
          batch_size=32,    # 每次喂入网络32组数据
          epochs=5,     # 数据集迭代5次
          validation_data=(x_test, y_test),     # 测试集输入特征,测试集标签
          validation_freq=1)     # 每迭代1次训练集执行一次测试集的评测

# 打印出网络结构和参数统计
model.summary()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值