tensorflow 基本用法(线性模型为例)

代码如下

# https://blog.csdn.net/geyunfei_/article/details/78782804
import tensorflow as tf
import numpy as np

# 整型常量,即0阶Tensor
t0 = tf.constant(3, dtype=tf.int32)

# 浮点数的一维数组,即1阶Tensor
t1 = tf.constant([3., 4.1, 5.2], dtype=tf.float32)

# 字符串的 2*2数组,即2阶 Tensor
t2 = tf.constant([['apple', 'orange'], ['potato', 'tomato']], dtype=tf.string)

# 2*3*1数组,即3阶张量,数据类型为整型
t3 = tf.constant([[[5], [6], [7]], [[4], [3], [2]]])

# print只能打印属性定义
print(t0, '\n', t1, '\n', t2, '\n', t3)

sess = tf.Session()
print(sess.run(t3))

print(' -----------------构建计算图--------------')
node1 = tf.constant(3.2)
node2 = tf.constant(4.2)
add = node1 + node2
print(add)
print(sess.run(add))

print('------------------占位符-----------------')
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
add = a + b
print(a, b, add)
print(sess.run(add, {a: 3, b: 5.5}))
print(sess.run(add, {a: [.1, 2], b: [5, .5]}))

add_triple = add * 3
print(sess.run(add_triple, {a: 2, b: 2.5}))

print('-----使用 TensorFlow 实现模型-- y=w*x+b -------')
# 创建变量w,b节点,并设置初始值   原始数据为 x: [1, 2, 3, 6, 8], y: [4.8, 8.5, 10.4, 21.0, 25.3]   即当x=1时,y=5
w = tf.Variable([.1], dtype=tf.float32)
b = tf.Variable([-.1], dtype=tf.float32)
# 创建x节点,用来输入实验室中的输入数据
x = tf.placeholder(tf.float32)
# 创建线性模型
linear_model = w * x + b
# 创建y节点,用来输入实验中得到的输出数据,用于损失模型计算
y = tf.placeholder(tf.float32)
# 创建损失模型
loss = tf.reduce_sum(tf.square(linear_model - y))
# 初始化变量
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
print(sess.run(w))
# 用w和b的设置初始值0.1和-0.1运行模型
print(sess.run(linear_model, {x: [1, 2, 3, 6, 8]}))  # --> 与实际输出相差很大
# 计算损失值
print(sess.run(loss, {x: [1, 2, 3, 6, 8], y: [4.8, 8.5, 10.4, 21.0, 25.3]}))  # --> 损失值也很大 1223.0499

# 用tf.assign对w和b重新赋值
fixw = tf.assign(w, [2.])
fixb = tf.assign(b, [1.])
sess.run([fixw, fixb])
print(sess.run(loss, {x: [1, 2, 3, 6, 8], y: [4.8, 8.5, 10.4, 21.0, 25.3]}))  # ---> 159.93999
# TensorFlow 提供了训练模型的方法,自动帮我们找到使损失值最小的W和b

print('---------- 训练模型 (初级)------------------')
# 创建一个梯度下降优化器, 学习率为0.001
optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)

# 用数组保持训练数据
x_train = [1, 2, 3, 6, 8]
y_train = [4.8, 8.5, 10.4, 21.0, 25.3]
# 训练10000次
for i in range(10000):
    sess.run(train, {x: x_train, y: y_train})
# 训练后的结果
print('W: %s b: %s loss: %s' % (sess.run(w), sess.run(
    b), sess.run(loss, {x: x_train, y: y_train})))

print('------------------------高级训练模型---------------')
# 运行训练循环
# 运行评估循环
# 管理训练数据集
# 优模型是否会一直是最优的?
# 我们需要通过一些新的实验数据来评估(evaluation)模型的泛化性能(generalization performance),
# 如果新的实验数据应用到到这个模型中损失值越小,那么这个模型的泛化性能就越好,反之就越差。

# 创建一个特征向量列表,该特征列表里只有一个特征向量
# 该特征向量为实数向量,只有一个元素的数组,且该元素名称为x
# 我们还可以创建其他更加复杂的特征列表
feature_columns = [tf.feature_column.numeric_column('x', shape=[1])]

# 创建一个LinearRegressor训练器,并传入特征向量列表
estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns)

# 保持训练用的数据
x_train = np.array([1., 2., 3., 6., 8.])
y_train = np.array([4.8, 8.5, 10.4, 21.0, 25.3])

# 保存评估用的数据
x_eavl = np.array([2., 5., 7., 9.])
y_eavl = np.array([7.6, 17.2, 23.6, 28.8])

# 用训练数据创建一个输入模型,用来进行后面的模型训练
# 第一个参数用来做线性回归模型的输入数据
# 第二个参数用来做线性回归模型损失模型的输入
# 第三个参数batch_size表示每批训练数据的个数
# 第四个参数num_epochs为epoch的次数,将训练集的所有数据都训练一遍为1次epoch
# 第五个参数shuffle为取训练数据是顺序还是随机取
train_input_fn = tf.estimator.inputs.numpy_input_fn(
    {'x': x_train}, y_train, batch_size=2, num_epochs=None, shuffle=True
)

# 再用训练数据创建一个输入模型,用来进行后面的模型评估
train_input_fn_2 = tf.estimator.inputs.numpy_input_fn(
    {'x': x_train}, y_train, batch_size=2, num_epochs=1000, shuffle=False
)

# 用评估数据创建一个输入模型,用来进行后面的模型评估
eval_input_fn = tf.estimator.inputs.numpy_input_fn(
    {'x': x_eavl}, y_eavl, batch_size=2, num_epochs=1000, shuffle=False
)

# 使用训练数据训练1000次
estimator.train(input_fn=train_input_fn, steps=1000)

# 使用原来训练数据评估一下模型,目的是查看训练结果
train_metrics = estimator.evaluate(input_fn=train_input_fn_2)
print('train metrics: %r' % train_metrics)

# 使用评估数据评估一下模型,目的是验证模型的泛化性能
eval_metrics = estimator.evaluate(input_fn=eval_input_fn)
print('eval metrics: %s' % eval_metrics)
# -----评估数据的loss比训练数据还要小,说明我们的模型泛化性能很好

print('----------自定义Estimator模型------------------')


# 定义模型训练函数,同时也定义了特征向量

def model_fn(features, labels, mode):
    # 构建线性模型
    W = tf.get_variable('W', [1], dtype=tf.float64)
    b = tf.get_variable('b', [1], dtype=tf.float64)
    y = W * features['x'] + b
    # 构建损失模型
    loss = tf.reduce_sum(tf.square(y - labels))
    # 训练模型子图
    global_step = tf.train.get_global_step()
    optimizer = tf.train.GradientDescentOptimizer(0.01)
    train = tf.group(optimizer.minimize(loss), tf.assign_add(global_step, 1))
    # 通过EstimatorSpec指定我们的训练子图积极损失模型
    return tf.estimator.EstimatorSpec(
        mode=mode,
        predictions=y,
        loss=loss,
        train_op=train
    )


# 创建自定义的训练模型
estimator = tf.estimator.Estimator(model_fn=model_fn)

# 后面的训练逻辑与使用linearRegressor一样
x_train = np.array([1., 2., 3., 6., 8.])
y_train = np.array([4.8, 8.5, 10.4, 21.0, 25.3])

x_eavl = np.array([2., 5., 7., 9.])
y_eavl = np.array([7.6, 17.2, 23.6, 28.8])

train_input_fn = tf.estimator.inputs.numpy_input_fn(
    {'x': x_train}, y_train, batch_size=2, num_epochs=None, shuffle=True
)

train_input_fn_2 = tf.estimator.inputs.numpy_input_fn(
    {'x': x_train}, y_train, batch_size=2, num_epochs=1000, shuffle=False
)

eval_input_fn = tf.estimator.inputs.numpy_input_fn(
    {'x': x_eavl}, y_eavl, batch_size=2, num_epochs=1000, shuffle=False
)

estimator.train(input_fn=train_input_fn, steps=1000)

train_metrics = estimator.evaluate(input_fn=train_input_fn_2)
print("train metrics: %r" % train_metrics)

eval_metrics = estimator.evaluate(input_fn=eval_input_fn)
print('eval metrics: %s' % eval_metrics)

print('-----------TensorBoard 可视化-----------------')
# 创建节点时设置name,方便在图中识别
W = tf.Variable([0], dtype=tf.float32, name='W')
b = tf.Variable([0], dtype=tf.float32, name='b')

x = tf.placeholder(tf.float32, name='x')
y = tf.placeholder(tf.float32, name='y')

# 线性模型
linear_model = W * x + b

# 损失模型隐藏到loss-model模块
with tf.name_scope('loss-model'):
    loss = tf.reduce_sum(tf.square(linear_model) - y)
    # 给损失模型的输出添加scalar,用来观察loss的收敛曲线
    tf.summary.scalar('loss', loss)

optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)

x_train = [1, 2, 3, 6, 8]
y_train = [4.8, 8.5, 10.4, 21.0, 25.3]

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

# 调用merge_all(),收集所有的操作数据
merged = tf.summary.merge_all()

# 模型运动产生的所有数据保存到 /tem/tensorflow 文件夹供TensorBoard使用
writer = tf.summary.FileWriter('/tem/tensorflow', sess.graph)

# 训练10000次
for i in range(10000):
    # 训练时传入merge
    summary, _ = sess.run([merged, train], {x: x_train, y: y_train})
    writer.add_summary(summary, i)

curr_W, curr_b, curr_loss = sess.run([w, b, loss], {x: x_train, y: y_train})

print('After train W: %s , b %s loss:%s' % (curr_W, curr_b, curr_loss))
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容