Tensorflow 模型快速训练-Data Pipeline

写这篇博客的,主要目的是介绍如何用Tensorflow 训练自己的数据。当然前提是已经对数据做了相应的分析,根据实际任务选择相应模型,有了一定的参考。这里我们着重介绍,基于Tensorflow的模型训练过程。

Tensorflow 对数据处理的方式比较多样,这里我们介绍一下3种常用的数据处理方式:

Tensorflow数据加载方式

  1. feed_dict feed_dict,笔者这里不建议大家直接用这种方式加载训练数据。这种数据加载方式,受别于Python GIL,计算资源的消耗与调用量不成正比。
  2. Tensorflow TfRecords 这是Tensorflow 自带的数据格式。当我们拥有少量的数据时,学习使用这种方式显得过于沉重;同事由于TfRecord序列化的耗时问题,反序列化容易出错。笔者在使用Tensorflow Model Zoo中的模型用到过这种方式,因此在相应的场合使用还是有必要的。
  3. tensorflow.data.Dataset 这种方式笔者建议使用的方式,网上对这种方式的介绍不多,这也会此文的目的,介绍并使用tf.data.Dataset;

人脸识别模型应用

这里以一个简单的网络结构,做一个人脸识别应用。

import tensorflow as tf
from tensorflow import Tensor
class Inputs(object):
	def __init__(self, img1, img2, label):
		self.img1 = img1
		self.img2 = img2
		self.lable = label
class Model(object):
	def __init__(self, inputs: Inputs):
		self.inputs = inputs
		self.predictions = self.predict(inputs)
		self.loss = self.calculate_loss(inputs, self.predictions)
		self.opt_step = tf.train.AdamOptimizer(learning_rate=0.001).minimize(self.loss)
	def predict(self, inputs):
		with tf.name_scope('image_subtraction'):
			img_diff = (inputs.img1 - inputs.img2)
			x = img_diff
		with tf.name_scope('conv_relu_maxpool'):
			for conv_layer_i in range(5):
				x = tf.layers.conv2d(x,
					filter=20*(conv_layer_i + 1),
					kernal_size=3,
					activation=tf.nn.relu
					)
				x = tf.layers.max_pooling2d(x, pool_size=3, strides=2)
		with tf.name_scope('fully_connected'):
			for conv_layer_i in range(1):
				x = tf.layers.dense(x, units=200, activation=tf.nn.relu)
		with tf.name_scope('linear_predict'):
			predict_logits = tf.layers.dense(x, 1, activation=None)
			return tf.squeeze(predicted_logits)
	def calculate_loss(self, inputs, prediction_logits):
		with tf.name_scope('calculate_loss'):
			return tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=inputs.label, logits=prediction_logits))

The Data (lfw as example)

Fold 结构如下所示:
/lfw
/lfw/lilei/lilei_1.jpg
/lfw/lilei/lilei_2.jpg

/lfw/zhuangxy/zhuangxy_1.jpg
/lfw/zhuangxy/zhuangxy_2.jpg
这里总共有18984张图片,因此这里我们使用Pythonic Generator 来生成数据;

import os
import glob
import random
class PairGenerator(object):
	def __init__(self, lfw_path=None):
		self.all_people = self.generate_all_people_dict(lfw_path)
	def generate_all_people_dict(self, lfw_path):
		all_people = {}
		for person_folder in os.listdir(lfw_path):
			person_photos = glob.glob(os.path.join(lfw_path, person_folder, '*.jpg'))
			all_peopel[person_folder] = person_photos
		return all_people
	def get_next_pair(self):
		while True:
			person1 = random.choice(self.all_people)
			same_person = random.random() > 0.5
			if same_person:
				person2 = person1
			else:
				person2 = random.choice(self.all_people)
			person1_photo = random.choice(self.all_people[person1])
			person2_photo = random.choice(self.all_people[person2])
			yield({'person1':person1_photo,'person2':person2_photo,'label':same_person})

由于图像读取,缩放,采样,数据增强操作,比较耗时,需要计算资源,因此笔者把这些工作放到了Tensorflow 实现。这里也是我们这篇文章的核心,具体如下:

import tensorflow as tf
from .pair_generator import PairGenerator
from .model import Inputs

class Dataset(object):
	img1_resized ='img1_resized'
	img2_resized= 'img2_resized'
	label = 'same_person'
	def __init__(self, generator = PairGenerator())
		self.next_element = self.build_iterator(generator)
	def build_generator(self, pair_gen:PairGenerator):
		batch_size = 10
		prefetch_batch_buffer = 5
		dataset = tf.data.Dataset.from_generator(pair_gen.get_next_pair,    output_types={PairGenerator.person1:tf.string, 				PairGenerator.person2:tf.string,PairGenerator.label:tf.bool})
		dataset = dataset.map(self._resize_image_and_resizze)
		dataset = dataset.batch(batch_size)
		dataset = dataset.prefetch(prefetch_batch_buffer)
		iter = dataset.make_one_shot_iterator()
		element = iter.get_next()
		return  Inputs(element[self.img1_resized],element[self.img2_resized],element[PairGenerator.label])
	def _read_image_and_resize(self,pair_element):
		target_size=[128,128]
		img1_file = tf.read_file(pair_element[PairGenerator.person1])
		img2_file = tf.read_file(pair_element[PairGenerator.person2])
		img1 = tf.image.decode_image(img1_file)
		img2 = tf.image.decode_image(img2_file)
		img1.set_shape([None,None,3])
		img2.set_shape([None,None,3])
		img1_resized = tf.image.resize_images(img1, target_size)
		img2_resized = tf.image.resize_images(img2, target_size)
		pair_element[self.img1_resized] = img1_resized
		pair_element[self.img2_resized] = img2_resized
		pair_element[self.label] = tf.cast(pair_element[PairGenerator.label], tf.float32)

到这里笔者,已经把本文核心代码展示出来,下面简要介绍一下模型训练。

模型训练

	from reconginzer.pair_generator import PairGenrator
	from recongnizer.tf_dataset import Dataset
	from recongnizer.model import Model
	import tensorflow as tf
	import pylad as plt
	import numpy as np
	def main():
		generator = PairGenerator()
		iter = generator.get_next_pair()
		for i in range(2):
			print(next(iter))
		ds = Dataset(generator)
		model_input = ds.next_element
		model = Model(model_input)
		with tf.Session() as sess:
			(img1, img2, label) = sess.run([model_input.img1, model_input.img2, model_input.label])
		sess.run(tf.global_variables_initializer())
		for step in range(100):
			(_, current_loss) = sess.run([model.opt_step, model.loss])
if __name__ == '__main__':
	main()

到这这里,笔者已经把Tensorflow 使用的整个流程快速梳理了一遍,希望对大家的学习使用有所帮助。这里也是学习引用,如有不当之处,欢迎大家批评指正。
[1]: https://towardsdatascience.com/how-to-quickly-build-a-tensorflow-training-pipeline-15e9ae4d78a0

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
TensorFlow 是谷歌的第二代机器学习系统,按照谷歌所说,在某些基准测试中,TensorFlow的表现比第一代的DistBelief快了2倍。 TensorFlow 内建深度学习的扩展支持,任何能够用计算流图形来表达的计算,都可以使用TensorFlowTensorFlows是人工智能AI领域的一个重要软件工具,是谷歌开发的开源软件(即免费的)。 人工智能领域分为三个方面,即基础层、技术层和应用层;而TensorFlow就是技术层中的学习框架。所谓学习框架,你可以用它来处理大量数据,快速建立数学模型,这些模型可以完成智能功能,例如自动识别一个图片里面的人物是否是范冰冰,当你百度范冰冰时,这个模型就可以识别并呈现范冰冰的图片;TensorFlow就好像一个功能强大的机床,它可以帮助制造出不同的产品(即数学模型)。现在所有行业都有人工智能领域的覆盖,可见人工智能在未来的发展趋势,必然需要大批人才,掌握人工智能势在必行。本课程以实战驱动方式结合基础讲解使大家深入理解Tensorflow、Numpy、Pandas、RNN、LSTM、Keras等知识,能够运用到真实项目中去,未来也是人工智能的时代,有巨大的机遇,早点掌握这些知识,为跳巢涨薪做准备。最后的项目是一个真实可用的项目,预测准确率非常高,商业价值不言而喻。大家可以根据预测的股票走势做参考,来进行投资。也可以基于我的模型基础上进一步完善和优化,所以价值是非常高的。本课程由浅到深讲解,分为简单股票模型和复杂股票模型模型的效果也是非常好,最终的效果如下:1、简单模型效果: 2、复杂模型效果:  本课程包含的技术:Anaconda PyCharmTensorflowNumpyMatplotlibPandasSklearnKerasRNNLSTM等   

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mira-Tableau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值