问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在tensorflow中输入数据

发布网友 发布时间:2022-05-10 05:42

我来回答

2个回答

懂视网 时间:2022-05-10 10:03

本篇文章给大家带来的内容是关于Tensorflow分类器项目自定义数据读入的方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

Tensorflow分类器项目自定义数据读入

在照着Tensorflow官网的demo敲了一遍分类器项目的代码后,运行倒是成功了,结果也不错。但是最终还是要训练自己的数据,所以尝试准备加载自定义的数据,然而demo中只是出现了fashion_mnist.load_data()并没有详细的读取过程,随后我又找了些资料,把读取的过程记录在这里。

首先提一下需要用到的模块:

import os

import keras
import matplotlib.pyplot as plt
from PIL import Image
from keras.preprocessing.image import ImageDataGenerator
from sklearn.model_selection import train_test_split

图片分类器项目,首先确定你要处理的图片分辨率将是多少,这里的例子为30像素:

IMG_SIZE_X = 30
IMG_SIZE_Y = 30

其次确定你图片的方式目录:

image_path = r'D:ProjectsImageClassifierdataset'
path = ".data"
# 你也可以使用相对路径的方式
# image_path =os.path.join(path, "set")

目录下的结构如下:

210901301-5c57a5e09df2b_articlex.png

相应的label.txt如下:

动漫
风景
美女
物语
樱花

接下来是接在labels.txt,如下:

label_name = "labels.txt"
label_path = os.path.join(path, label_name)
class_names = np.loadtxt(label_path, type(""))

这里简便起见,直接利用了numpy的loadtxt函数直接加载。

之后便是正式处理图片数据了,注释就写在里面了:

re_load = False
re_build = False
# re_load = True
re_build = True

data_name = "data.npz"
data_path = os.path.join(path, data_name)
model_name = "model.h5"
model_path = os.path.join(path, model_name)

count = 0

# 这里判断是否存在序列化之后的数据,re_load是一个开关,是否强制重新处理,测试用,可以去除。
if not os.path.exists(data_path) or re_load:
 labels = []
 images = []
 print('Handle images')
 # 由于label.txt是和图片防止目录的分类目录一一对应的,即每个子目录的目录名就是labels.txt里的一个label,所以这里可以通过读取class_names的每一项去拼接path后读取
 for index, name in enumerate(class_names):
 # 这里是拼接后的子目录path
 classpath = os.path.join(image_path, name)
 # 先判断一下是否是目录
 if not os.path.isdir(classpath):
  continue
 # limit是测试时候用的这里可以去除
 limit = 0
 for image_name in os.listdir(classpath):
  if limit >= max_size:
  break
  # 这里是拼接后的待处理的图片path
  imagepath = os.path.join(classpath, image_name)
  count = count + 1
  limit = limit + 1
  # 利用Image打开图片
  img = Image.open(imagepath)
  # 缩放到你最初确定要处理的图片分辨率大小
  img = img.resize((IMG_SIZE_X, IMG_SIZE_Y))
  # 转为灰度图片,这里彩色通道会干扰结果,并且会加大计算量
  img = img.convert("L")
  # 转为numpy数组
  img = np.array(img)
  # 由(30,30)转为(1,30,30)(即`channels_first`),当然你也可以转换为(30,30,1)(即`channels_last`)但为了之后预览处理后的图片方便这里采用了(1,30,30)的格式存放
  img = np.reshape(img, (1, IMG_SIZE_X, IMG_SIZE_Y))
  # 这里利用循环生成labels数据,其中存放的实际是class_names中对应元素的索引
  labels.append([index])
  # 添加到images中,最后统一处理
  images.append(img)
  # 循环中一些状态的
输出,可以去除 print("{} class: {} {} limit: {} {}" .format(count, index + 1, class_names[index], limit, imagepath)) # 最后一次性将images和labels都转换成numpy数组 npy_data = np.array(images) npy_labels = np.array(labels) # 处理数据只需要一次,所以我们选择在这里利用numpy自带的方法将处理之后的数据序列化存储 np.savez(data_path, x=npy_data, y=npy_labels) print("Save images by npz") else: # 如果存在序列化号的数据,便直接读取,提高速度 npy_data = np.load(data_path)["x"] npy_labels = np.load(data_path)["y"] print("Load images by npz") image_data = npy_data labels_data = npy_labels

到了这里原始数据的加工预处理便已经完成,只需要最后一步,就和demo中fashion_mnist.load_data()返回的结果一样了。代码如下:

# 最后一步就是将原始数据分成训练数据和测试数据
train_images, test_images, train_labels, test_labels = 
 train_test_split(image_data, labels_data, test_size=0.2, random_state=6)

这里将相关信息打印的方法也附上:

print("_________________________________________________________________")
print("%-28s %-s" % ("Name", "Shape"))
print("=================================================================")
print("%-28s %-s" % ("Image Data", image_data.shape))
print("%-28s %-s" % ("Labels Data", labels_data.shape))
print("=================================================================")

print('Split train and test data,p=%')
print("_________________________________________________________________")
print("%-28s %-s" % ("Name", "Shape"))
print("=================================================================")
print("%-28s %-s" % ("Train Images", train_images.shape))
print("%-28s %-s" % ("Test Images", test_images.shape))
print("%-28s %-s" % ("Train Labels", train_labels.shape))
print("%-28s %-s" % ("Test Labels", test_labels.shape))
print("=================================================================")

之后别忘了归一化哟:

print("Normalize images")
train_images = train_images / 255.0
test_images = test_images / 255.0

最后附上读取自定义数据的完整代码:

import os

import keras
import matplotlib.pyplot as plt
from PIL import Image
from keras.layers import *
from keras.models import *
from keras.optimizers import Adam
from keras.preprocessing.image import ImageDataGenerator
from sklearn.model_selection import train_test_split

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
re_load = False
re_build = False
# re_load = True
re_build = True
epochs = 50
batch_size = 5
count = 0
max_size = 2000000000
IMG_SIZE_X = 30
IMG_SIZE_Y = 30
np.random.seed(9277)
image_path = r'D:ProjectsImageClassifierdataset'
path = ".data"
data_name = "data.npz"
data_path = os.path.join(path, data_name)
model_name = "model.h5"
model_path = os.path.join(path, model_name)
label_name = "labels.txt"
label_path = os.path.join(path, label_name)
class_names = np.loadtxt(label_path, type(""))
print('Load class names')
if not os.path.exists(data_path) or re_load:
 labels = []
 images = []
 print('Handle images')
 for index, name in enumerate(class_names):
 classpath = os.path.join(image_path, name)
 if not os.path.isdir(classpath):
  continue
 limit = 0
 for image_name in os.listdir(classpath):
  if limit >= max_size:
  break
  imagepath = os.path.join(classpath, image_name)
  count = count + 1
  limit = limit + 1
  img = Image.open(imagepath)
  img = img.resize((30, 30))
  img = img.convert("L")
  img = np.array(img)
  img = np.reshape(img, (1, 30, 30))
  # img = skimage.io.imread(imagepath, as_grey=True)
  # if img.shape[2] != 3:
  # print("{} shape is {}".format(image_name, img.shape))
  # continue
  # data = transform.resize(img, (IMG_SIZE_X, IMG_SIZE_Y))
  labels.append([index])
  images.append(img)
  print("{} class: {} {} limit: {} {}"
   .format(count, index + 1, class_names[index], limit, imagepath))
 npy_data = np.array(images)
 npy_labels = np.array(labels)
 np.savez(data_path, x=npy_data, y=npy_labels)
 print("Save images by npz")
else:
 npy_data = np.load(data_path)["x"]
 npy_labels = np.load(data_path)["y"]
 print("Load images by npz")
image_data = npy_data
labels_data = npy_labels
print("_________________________________________________________________")
print("%-28s %-s" % ("Name", "Shape"))
print("=================================================================")
print("%-28s %-s" % ("Image Data", image_data.shape))
print("%-28s %-s" % ("Labels Data", labels_data.shape))
print("=================================================================")
train_images, test_images, train_labels, test_labels = 
 train_test_split(image_data, labels_data, test_size=0.2, random_state=6)
print('Split train and test data,p=%')
print("_________________________________________________________________")
print("%-28s %-s" % ("Name", "Shape"))
print("=================================================================")
print("%-28s %-s" % ("Train Images", train_images.shape))
print("%-28s %-s" % ("Test Images", test_images.shape))
print("%-28s %-s" % ("Train Labels", train_labels.shape))
print("%-28s %-s" % ("Test Labels", test_labels.shape))
print("=================================================================")

# 归一化
# 我们将这些值缩小到 0 到 1 之间,然后将其馈送到神经网络模型。为此,将图像组件的数据类型从整数转换为浮点数,然后除以 255。以下是预处理图像的函数:
# 务必要以相同的方式对训练集和测试集进行预处理:
print("Normalize images")
train_images = train_images / 255.0
test_images = test_images / 255.0

热心网友 时间:2022-05-10 07:11

用pickle来load字典结构的数据
代码如下:
import pickle as p#记得导入pickle,用它来加载数据
import os
import tensorflow as tf

filename = os.path.join("data","contact")#我把数据文本放在项目下的data文件夹下
X = None
Y = None
with open(filename, 'rb')as f:
#从字典结构的数据文本加载数据,加载出来的数据保留了字典结构
datadict = p.load(f)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 灌篮高手有没有后续的动画啊 黄丹到犍为三井有多少公里 保温杯能不能泡茶叶 美国理工科好的文理学院都有哪些 美国工科留学,有哪些热门学校? 美国商科和理科好的大学 推荐几个工科比较好的美国大学。 美国理科最好的大学 融化和溶化的区别是什么 普通程序员的出路在哪里? J2EE程序员和普通程序员有什么不同? 小儿抽动症一个症状消失后另一个新的症状又出现了,是加重了吗? 孩子抽了是抽动症,你知道吗? 白象老母鸡汤方便面面料包都有什么成份有猪油吗? 老母鸡汤面真的有人能中一部手机吗? 濉溪老母鸡手擀面在哪里学 白象方便面老母鸡汤面酱料包里为什么有颗粒状东西 如何区分单元格地址的相对引用与绝对引用? 白象汤好喝老母鸡汤面包装箱为啥是红色的 Excel中对单元格地址的引用有 平安集团在上海的收入高不高? 在全回流操作条件下,回流量的变化对理论塔板数有何影响? 大家对平安保险的印象如何 个人贷款后能否全部取现?比如平安银行的新一贷。两万能不能提现 丰奇威视硬盘录像机密码忘记了怎么重置? 硬盘录像机管理员密码丢失,如何重置或恢复? 怎么恢复微信登录设备管理,前提是无法登陆,必须恢复以前删除过得设备型号 《艾米丽在巴黎》女主和谁在一起了? 艾米丽在巴黎女主和谁在一起了 巴黎生活的电视剧有哪些 跪求2020年彼得·劳尔执导执导的一部美剧《艾米丽在巴黎第一季》高清免费百度云资源。 天使爱美丽的剧情简介 韩国麦馨低卡路里咖啡(原味)的热量是多少? 韩国速溶咖啡麦馨与麦可馨有区别吗? 北京哪家超市有卖韩国麦馨咖啡 最好在市区 韩国麦馨咖啡有假货吗 韩国麦馨黑咖啡 原味 朋友说这个咖啡能减肥~ 谁试过啊。。效果如何~~~ 请问,韩国麦馨咖啡在哪些韩剧中出现过? ☆【求助】☆怎么打薄头发??? 如何自己打薄头发?