tesnsorflow简单神经网络构造

 
# -*- coding:utf-8 -*-
# author:taojianmin
"""
Know more, visit my Python tutorial page: https://morvanzhou.github.io/tutorials/
My Youtube Channel: https://www.youtube.com/user/MorvanZhou

More information about Dataset: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/docs_src/programmers_guide/datasets.md
"""

#代码来自于:莫烦 ,代码解释来自于:TJMtaotao
import tensorflow as tf  # tensorflow库
import numpy as np  # numpy科学计算库
from tensorflow.contrib.data import Dataset #tensorflow导入数据库

# load your data or create your data in here
#首先先定义好数据(实际的(真实)数据)
npx = np.random.uniform(-1, 1, (1000, 1))       #1000行1列的数据,范围在(-1和1之间)        # x data
npy = np.power(npx, 2) + np.random.normal(0, 0.1, size=npx.shape)# y data  均值为0 ,标准差为0.1,1000行1列的数据
'''
numpy.power(x1, x2)

数组的元素分别求n次方。x2可以是数字,也可以是数组,但是x1和x2的列数要相同
'''

'''
numpy.random.normal(loc=0.0, scale=1.0, size=None)
参数的意义为:

loc:float
    此概率分布的均值(对应着整个分布的中心centre)
scale:float
    此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
    输出的shape,默认为None,只输出一个值
'''
npx_train, npx_test = np.split(npx, [800])   # training and test data 总共1000个数据点,将前800个数据点用于训练,后200个数据用于测试
'''
np.split():
大小要么按照数字来划分(int),要么是一个list来划分:
但是如果你仅是输入一个int类型的数字的话,
你的数组必须是均等的分割,否则就会报错,
不像array_split()是可以进行不均等的划分的!
'''
npy_train, npy_test = np.split(npy, [800])
#然后定义好实际上要用于训练的数据(来自于上面已经定义好的数据)
#palaceholder只是帮对应数据占据一个位置,
# 用到真实数据,并且初始化数据 并且sun.Session()的时候才会起作用
# use placeholder, later you may need different data,
# pass the different data into placeholder
tfx = tf.placeholder(npx_train.dtype, npx_train.shape)
# npx_train.dtype数据类型 px_train.sha数据大小为800行1列
tfy = tf.placeholder(npy_train.dtype, npy_train.shape)
print(npx_train.dtype,npx_train.shape)
#查看前面定义好的用于训
# 练的数据  float64 (800, 1)
print(tfx,tfy) #查看占好位置的数据结构
# Tensor("Placeholder:0", shape=(800, 1), dtype=float64)
# Tensor("Placeholder_1:0", shape=(800, 1), dtype=float64)
# create dataloader
dataset = Dataset.from_tensor_slices((tfx, tfy)) #将数据切片
# 这里就是数据结构是 800行 2列的数据 ,第一列数据都是X ,
# 第二列数据是y 也就是每一个数据都对应一个标签

'''
train_imgs = tf.constant(['train/img1.png', 'train/img2.png',
                          'train/img3.png', 'train/img4.png',
                          'train/img5.png', 'train/img6.png'])
train_labels = tf.constant([0, 0, 0, 1, 1, 1])

tr_data = Dataset.from_tensor_slices((train_imgs, train_labels))

输出:
(b'train/img1.png', 0)
(b'train/img2.png', 0)
(b'train/img3.png', 0)
(b'train/img4.png', 1)
(b'train/img5.png', 1)
(b'train/img6.png', 1)

'''
dataset = dataset.shuffle(buffer_size=1000)
# choose data randomly from this buffer #这里的意思就是将1000个数据打乱

dataset = dataset.batch(32)
# batch size you will use 每一次的数据大小
dataset = dataset.repeat(3)
# repeat for 3 epochs 将上面数据重复3次
iterator = dataset.make_initializable_iterator()  # later we have to initialize this one
#可以将dataset.make_initializable_iterator()理解为将设置好
# 数据的结构,总共1000个数据,还没有只是声明好了,
# 把它们分成32组,然后再重复这个3遍,每一次的数据都不相同

#建立网络模型,和参数等
# your network
bx, by = iterator.get_next()#用定义好的容器中数据给bx,by
# use batch to update
l1 = tf.layers.dense(bx, 10, tf.nn.relu)      # 非线性变换
out = tf.layers.dense(l1, npy.shape[1]) # 输出网络预测的结果
loss = tf.losses.mean_squared_error(by, out) # 均方误差(真实值减去预测值)
train = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 梯度下降,最小化均方误差

sess = tf.Session() # 数据起作用的关键点
# need to initialize the iterator in this case
# 初试化变量 还有将训练用的数据导入到站好位置的变量中,现在网络中就有数据了
sess.run([iterator.initializer, tf.global_variables_initializer()], feed_dict={tfx: npx_train, tfy: npy_train})

# 训练模型
for step in range(201): #201次迭代
  try:
    _, trainl = sess.run([train, loss])                       # train
    if step % 10 == 0: # 每10次迭代 就打印
      testl = sess.run(loss, {bx: npx_test, by: npy_test})    # test
      print('step: %i/200' % step, '|train loss:', trainl, '|test loss:', testl)
  except tf.errors.OutOfRangeError:     # if training takes more than 3 epochs, training will be stopped
    print('Finish the last epoch.')
    break

 

你可能感兴趣的:(tensorflow)