自制数据集,解决本领域应用
目录
摘要
一、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 是这张图所对应的标签。
图片文件夹:
标签文件:
"""
自制数据集,解决本领域应用
"""
# 导入模块
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()
"""
自制数据集,解决本领域应用
"""
# 导入模块
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()