AI学习---数据IO操作&神经网络基础


数据IO操作
TF支持3种文件读取:
1.直接把数据保存到变量中
2.占位符配合feed_dict使用
3. QueueRunner(TF中特有的)

文件读取流程
文件读取流程(多线程 + 队列)
1)构造文件名队列(先读取文件名到队列,方便快速读取文件)
file_queue = tf.train.string_input_producer(string_tensor,shuffle=True)
2)读取与解码(读取器根据文件名读取数据,以一个样本为一个单位进行读取,返回一个实例reader)
文本(一行文字):
读取:tf.TextLineReader()
解码:tf.decode_csv()
图片(一张图片):
读取:tf.WholeFileReader()
解码:
tf.image.decode_jpeg(contents) # 将jpeg编码的图片解码为unit8
tf.image.decode_png(contents) # 将png编码的图片解码为unit8
二进制(固定数量字节):
读取:tf.FixedLengthRecordReader(record_bytes)
解码:tf.decode_raw()
TFRecords类型(TF自定义的)
读取:tf.TFRecordReader()
说明:读取器有一个通用的方法read(),返回一个元组
key, value = 读取器.read(file_queue)
key:文件名(指明文件在哪个文件名中)
value:一个样本
3)批处理队列
tf.train.batch(tensors, batch_size, num_threads = 1, capacity = 32, name=None)
4)手动开启线程
队列操作对象:tf.train.QueueRunner()
开启会话:
tf.train.start_queue_runners(sess=None, coord=None)

1、构造文件名队列

2、读取与解码


3、批处理

线程操作

图片数据
图像基本知识
0 文本特征处理
文本 -->利用特征词(某个单词,可统计数量Count,可统计重要程度TF-IDF) -> 二维数组shape(n_samples行,m_features列)
字典 –> one-hot编码 -> 二维数组
图片 像素值(组成图片的最基本单位就是像素)
1 图片三要素(长度+宽度+通道数)
黑白图、灰度图
一个通道
黑[0, 255]白
彩色图
三个通道
一个像素点 由三个通道值构成,每一个通道是一个灰度图,3个组合在一起就是一个彩色图的像素点
R [0, 255]
G [0, 255]
B [0, 255]
2 TensorFlow中表示图片
Tensor对象
指令名称、形状、类型
shape = [height, width, channel]
3 图片特征值处理
[samples, features]
为什么要缩放图片到统一大小?
1)每一个样本特征数量要一样多
2)缩小图片的大小
tf.image.resize_images(images, size)
4 数据格式
存储:uint8
训练:float32
1、图片三要素(长+宽+通道数)

点击查看图片的某一个像素点(左:灰度图, 右:彩色图)


2、张量(类似ndarray)形状--》3D

3、图片特征值处理
iris数据集: 150个样本 4个特征值 目标值
图片数据集:1个样本有500*500*3个特征(像素点) + 每个图片的特征值不一样 –》所以需要进行大小转换

4、数据格式

狗图片读取Demo

import tensorflow as tf
import os os.environ["TF_CPP_MIN_LOG_LEVEL"] = '3' def read_picture_dog(file_list):
"""
读取狗图片案例
:return:
"""
# 1、构造文件名队列
file_queue = tf.train.string_input_producer(file_list)
# 2、读取与解码
# 读取
reader = tf.WholeFileReader()
key, value = reader.read(file_queue)
print("key:\n", key)
print("value:\n", value) # 解码
image_decoded = tf.image.decode_jpeg(value)
print("image_decoded:\n", image_decoded) # 3、图像形状、类型修改
# 将图片缩放到同一个大小
image_resized = tf.image.resize_images(image_decoded, [200, 200]) # 到此仅确定了长和宽,未确定通道
print("image_resized_before:\n", image_resized) # 更新静态形状
image_resized.set_shape([200, 200, 3]) # 第三个的通道一定是3
print("image_resized_after:\n", image_resized) # 4、批处理队列
image_batch = tf.train.batch([image_resized], batch_size=100, num_threads=2, capacity=100)
print("image_batch:\n", image_batch) # 5、开始会话
with tf.Session() as sess:
# key_new, value_new = sess.run([key, value])
# print('key_new\n', key_new) # 开启单线程的情况下,会阻塞,因为只有一个queue现场,而前面已经运行中
# print('value_new\n', value_new) # 开启线程
# ->构造线程协调器
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord) # 运行
filename, sample, image, n_image = sess.run([key, value, image_resized, image_batch])
print("filename:\n", filename)
print("sample:\n", sample)
print("image:\n", image)
print("n_image:\n", n_image) coord.request_stop()
coord.join(threads) # 回收线程 if __name__ == "__main__":
# 0、构造文件路径 + 文件名列表
filename = os.listdir('F:\\linear')
file_list = [
os.path.join('F:\\linear', x) for x in filename
]
print('文件名列表:', filename)
print('文件路径:', file_list)
read_picture_dog(file_list)
二进制数据
- CIFAR-10数据集介绍
CIFAR-10数据集由10个类中的60000个32x32彩色图像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像。
数据集分为五个训练批次和一个测试批次,每个批次有10000个图像。测试批次包含来自每个类别的1000个随机选择的图像。训练批次以随机顺序包含剩余图像,但是一些训练批次可能包含来自一个类别的更多图像而不是另一个类别。在他们之间,训练批次包含来自每个班级的5000个图像。
http://www.cs.toronto.edu/~kriz/cifar.html

- 二进制版本
每3072个字节构成一个样本 1个目标值 + 3072个字节


- CIFAR10 二进制数据读取
流程分析:
1)构造文件名队列
2)读取与解码
3)批处理队列
开启会话
手动开启线程

- 图片转置


demo:
import tensorflow as tf
import os os.environ["TF_CPP_MIN_LOG_LEVEL"] = '3' class Cifar():
def __init__(self):
# 设置图像大小
self.width = 32
self.height = 32
self.channel = 3 # 设置图像字节数
self.image = self.height * self.width * self.channel # 一个图的字节大小
self.label = 1 # 标签字节数(范围0-9)
self.sample = self.image + self.label # 一个样本的大小 = 一个标签 + 一个图 def read_binary(self, file_list):
# 1、 构建文件名队列
file_queue = tf.train.string_input_producer(file_list)
# 2、 文件读取与解码
# 读取
reader = tf.FixedLengthRecordReader(self.sample)
key, value = reader.read(file_queue)
print('key\n', key) # Tensor("ReaderReadV2:0", shape=(), dtype=string)
print('value\n', value)
# 解码
image_decoded = tf.decode_raw(value, tf.uint8)
print("image_decoded:\n", image_decoded) # 一阶 Tensor("DecodeRaw:0", shape=(?,), dtype=uint8) # 切片操作
label = tf.slice(image_decoded, [0], [self.label])
image = tf.slice(image_decoded, [self.label], [self.image])
print("label:\n", label) # Tensor("Slice:0", shape=(1,), dtype=uint8) ,1维,
print("image:\n", image) # Tensor("Slice_1:0", shape=(3072,), dtype=uint8), 1维,3072字节 # 调整图像的形状
image_reshaped = tf.reshape(image, [self.channel, self.height, self.width])
print("image_reshaped:\n", image_reshaped) # 改变阶数, Tensor("Reshape:0", shape=(3, 32, 32), dtype=uint8) # 三维数组的转置(原数组的顺序不符合 TF的要求,转换后维)
image_transposed = tf.transpose(image_reshaped, [1, 2, 0])
print("image_transposed:\n", image_transposed) # 调整图像类型
# image_cast = tf.cast(image_transposed, tf.float32) # 3、构造批处理队列
image_batch, label_batch = tf.train.batch([image_transposed, label], batch_size=100, num_threads=2,
capacity=100) # 开启会话
with tf.Session() as sess:
# 开启线程
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
key_new, value_new, image_decoded, label_new, image_new, image_reshaped_new,\
image_transposed_new,image_batch_new, label_batch_new = sess.run([key, value,
image_decoded, label, image, image_reshaped, image_transposed, image_batch, label_batch])
print('key_new\n', key_new) # Tensor("ReaderReadV2:0", shape=(), dtype=string)
print('value_new\n', value_new) # b'\x03\x9e\x9f\xa5\xa6\xa0
print('image_decoded\n', image_decoded) # [3 158 159 ... 124 129 110] --》 3是类别,158,159是目标和特征值,需切片
print('label_new\n', label_new) # [6]
print('image_new\n', image_new) # [ 59 43 50 ... 140 84 72]
print('image_reshaped_new\n', image_reshaped_new)
print('image_transposed_new\n', image_transposed_new)
print('image_batch_new\n', image_batch_new)
print('label_batch_new\n', label_batch_new) coord.request_stop()
coord.join(threads) # 回收线程
return None if __name__ == "__main__":
filename = os.listdir('F:\\linear')
file_list = [
os.path.join('F:\\linear', x) for x in filename if x[-3:] == 'bin'
]
print('filename\n', filename)
print('file_list\n', file_list) cifar = Cifar()
cifar.read_binary(file_list)
TFRecords
神经网络基础
神经网络原理

Softmax回归

softmax特点:神经网络的输出变成了概率输出


交叉熵损失





logits: 线性值+权重的线性值
Mnist手写数字识别案例

1、数据集介绍

1、特征值:
特征值就是我们的图片(28*28个像素),图片就是以28*28*1的形式存储,根据书写的轨迹进行编码(即把数字1用0.1~1.0的数字进行标识,完全笔直用1,稍微偏一点用0.5标识)。一个手写识别图片包含图片和它对应的标签,设置图片为xs,标签为ys。样本数共55000

2、目标值
Minist的每个图片都有对应的标签,0~9之间的数字表示图像中绘制的数字,利用one-hot编码,共[55000,10]个样本

3、Mnist数据获取API

Mnist手写数字的识别:

图片数字1 --》 输入特征值28*28*1 --》每个特征都有权重值,进行加权求和(y=w1x1+w2x2+b) -->获取logits -->进行softmax进行分类


import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data def full_connection():
"""
用全连接对手写数字进行识别
:return:
"""
# 1)准备数据
mnist = input_data.read_data_sets("F:\mnist_data", one_hot=True)
# 用占位符定义真实数据
X = tf.placeholder(dtype=tf.float32, shape=[None, 784])
y_true = tf.placeholder(dtype=tf.float32, shape=[None, 10]) # 2)构造模型 - 全连接
# [None, 784] * W[784, 10] + Bias = [None, 10]
weights = tf.Variable(initial_value=tf.random_normal(shape=[784, 10], stddev=0.01))
bias = tf.Variable(initial_value=tf.random_normal(shape=[10], stddev=0.1))
y_predict = tf.matmul(X, weights) + bias # 3)构造损失函数
loss_list = tf.nn.softmax_cross_entropy_with_logits(logits=y_predict, labels=y_true)
loss = tf.reduce_mean(loss_list) # 4)优化损失
# optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(loss)
optimizer = tf.train.AdamOptimizer(learning_rate=0.01).minimize(loss) # 5)增加准确率计算
bool_list = tf.equal(tf.argmax(y_true, axis=1), tf.argmax(y_predict, axis=1))
accuracy = tf.reduce_mean(tf.cast(bool_list, tf.float32)) # 初始化变量
init = tf.global_variables_initializer() # 开启会话
with tf.Session() as sess: # 初始化变量
sess.run(init) # 开始训练
for i in range(50):
# 获取真实值
image, label = mnist.train.next_batch(50) _, loss_value, accuracy_value = sess.run([optimizer, loss, accuracy], feed_dict={X: image, y_true: label}) print("第%d次的损失为%f,准确率为%f" % (i+1, loss_value, accuracy_value)) return None if __name__ == "__main__":
full_connection()
===
AI学习---数据IO操作&神经网络基础的更多相关文章
- AI学习---数据读取&神经网络
AI学习---数据读取&神经网络 fa
- JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作
基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...
- JAVASE02-Unit08: 文本数据IO操作 、 异常处理
Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.i ...
- Day03:文本数据IO操作 / 异常处理
文本数据IO操作 Reader和Writer 字符流原理 Reader是字符输入流的父类 Writer是字符输出流的父类. 字符流是以字符(char)为单位读写数据的.一次处理一个unicode. ...
- 动手学习Pytorch(6)--卷积神经网络基础
卷积神经网络基础 本节我们介绍卷积神经网络的基础概念,主要是卷积层和池化层,并解释填充.步幅.输入通道和输出通道的含义. 二维卷积层 本节介绍的是最常见的二维卷积层,常用于处理图像数据. 二维 ...
- Andrew Ng - 深度学习工程师 - Part 1. 神经网络和深度学习(Week 2. 神经网络基础)
=================第2周 神经网络基础=============== ===2.1 二分分类=== ===2.2 logistic 回归=== It turns out, whe ...
- [DeeplearningAI笔记]神经网络与深度学习2.11_2.16神经网络基础(向量化)
觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.11向量化 向量化是消除代码中显示for循环语句的艺术,在训练大数据集时,深度学习算法才变得高效,所以代码运行的非常快十分重要.所以在深度学 ...
- 深度学习笔记 (一) 卷积神经网络基础 (Foundation of Convolutional Neural Networks)
一.卷积 卷积神经网络(Convolutional Neural Networks)是一种在空间上共享参数的神经网络.使用数层卷积,而不是数层的矩阵相乘.在图像的处理过程中,每一张图片都可以看成一张“ ...
- Python学习之-- IO 操作
阻塞IO / 非阻塞IO /IO多路复用 / 异步IO 说明:同步IO包含(阻塞IO / 非阻塞IO /IO多路复用),因为他们有个共同特性就是都需要内核态到用户态的一个等待. 基本概念解释,环境限定 ...
随机推荐
- vue的路由映射问题
遇到的问题 今天在项目中遇到了一个问题,明明在Router文件夹下的路由js映射文件中,配置好了,如下: // 生日贺卡 { path: 'birthdayRemind', component: lo ...
- [PKUWC2018] Slay the spire
Description 现在有 \(n\) 张强化牌和 \(n\) 张攻击牌: 攻击牌:打出后对对方造成等于牌上的数字的伤害. 强化牌:打出后,假设该强化牌上的数字为 \(x\),则其他剩下的攻击牌的 ...
- MySQL系列详解六:MySQL主从复制/半同步演示-技术流ken
前言 随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求.此时数据库集群就很好的解决了这个问题了.采用MySQL分布式集群,能够搭建一个高并发.负载均衡的集群服务器.在 ...
- YTKNetwork网络封装
本篇是答应在端午写iOS网络-四篇源码解析以及封装的最后一篇,是针对上一篇YTKNetwork源码解析后的一次封装,也是自己实际项目中所使用过的.在对YTKNetwork封装的时候,还是需要对YTKN ...
- iPhone屏幕尺寸说明及iPhone在微信上的一些表现
很久没有更新博客了,由于自己的水平一般,能力有限,这种情况下的知识点可能过于薄弱,所以不好分享给大家,注意是怕误导大家了,最近学习移动端的东西,有点心得,分享给大家,希望对大家有所帮助,如果有什么地方 ...
- Centos 6.8 配置mysql数据库主从同步
Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务,首先确保主从服务器上的Mysql版本相同. 一.安装部署mysql ...
- [angularjs] angularjs系列笔记(六)http
读取服务器json数据,get方式 <body> <div ng-app="Home"> <div ng-controller="httpT ...
- php常用函数搜集
搜集了几个php常用函数方法....相信项目中肯定会用到吧... <?php /** * @param $arr * @param $key_name * @return array * 将数据 ...
- java中获取路径的方法
在class获取路径的方法,getResource有没有“\”的区别 System.out.println("" + this.getClass().getResource(&qu ...
- es6 语法 (数值扩展)
{ //二进制数值都是0b开头,八进制0o console.log(0b111110111) console.log(0o767); } { console.log('15',Number.isFin ...