2021-09-19

张量的变换

#     2.4.3 张量的变换
#         ndarray属性的修改
#             类型的修改
#                 1)ndarray.astype(type)
#                 tf.cast(tensor, dtype)
#                     不会改变原始的tensor
#                     返回新的改变类型后的tensor
#                 2)ndarray.tostring()
#             形状的修改
#                 1)ndarray.reshape(shape)#返回一个新的数组
#                     -1 自动计算形状
#                 2)ndarray.resize(shape)#对原数组进行修改
#             静态形状 - 初始创建张量时的形状
#                 1)如何改变静态形状
#                     什么情况下才可以改变/更新静态形状?
#                         只有在形状没有完全固定下来的情况下(占位符)
#                     tensor.set_shape(shape)
#                 2)如何改变动态形状
#                     tf.reshape(tensor, shape)
#                     不会改变原始的tensor
#                     返回新的改变形状后的tensor
#                     动态创建新张量时,张量的元素个数必须匹配

类型改变
由tf.int32变成了tf.float32

linear_squares = tf.constant([[4], [9], [16], [25]], dtype=tf.int32)
print("linear_squares_before:\n",linear_squares)
l_cast=tf.cast(linear_squares,dtype=tf.float32)
print("linear_squares_after:\n",linear_squares)
print("l_cast:\n",l_cast)

在这里插入图片描述
更新/改变静态形状

#定义占位符
a_p=tf.placeholder(dtype=tf.float32,shape=[None,None])
b_p=tf.placeholder(dtype=tf.float32,shape=[None,10])
c_p=tf.placeholder(dtype=tf.float32,shape=[3,2])
print("a_p:\n",a_p)
print("b_p:\n",b_p)
print("c_p:\n",c_p)
#更新形状未确定的部分,已经固定的部分不能更改,只能更改那些为问号的地方
a_p.set_shape([2,3])
b_p.set_shape([2,10])
print("a_p:\n",a_p)
print("b_p:\n",b_p)

在这里插入图片描述
动态形状的修改,不能改变原始数据的个数,只能变换形状

a_p_reshape=tf.reshape(a_p,shape=[2,3,1])
print("a_p:\n",a_p)
print("a_p_reshape:\n",a_p_reshape)

在这里插入图片描述
关于动态形状和静态形状必须符合以下规则

静态形状
转换静态形状的时候,1-D到1-D,2-D到2-D,不能跨阶数改变形状(比如原来形状是[None,None],可以改成[3,4],不能改成[2,2,2])
对于已经固定的张量的静态形状的张量,不能再次设置静态形状
动态形状
tf.reshape)动态创建新张量时,张量的元素个数必须匹配

张量的数学运算

张量的数学运算
1.算术运算符
2.基本数学函数
3.矩阵运算
4.reduce操作
5.序列索引操作
详细请参考: https://tensorflow.google.cn/versions/r1.15/api_docs/python/tf/math

变量

TensorFlow变量是表示程序处理的共享持久状态的最佳方法。变量通过tf.VariableOP类进行操作。变量的特点∶
●存储持久化
●可修改值
●可指定被训练
变量是用来保存深度学习的模型参数
创建变量

**tf.Variable(initial_value=None,trainable=True,collections=None,name=None)**
# 2.5 变量OP
#     TensorFlow - 变量
#     存储模型参数
#     2.5.1 创建变量
#         tf.Variable.init(initial_value, trainable=True, collections=None, validate_shape=True, name=None)
#         变量需要显式初始化,才能运行值
#     2.5.2 使用tf.variable_scope()修改变量的命名空间
#         使得结构更加清晰
initial_value:初始化的值
trainable:是否被训练
collections:新变量将添加到列出的图的集合中collections,默认为[GraphKeys.GLOBAL_VARIABLES],如果trainable是True变量也被添加到图形集合GraphKeys.TRA INABLE_VARIABLES
变量需要显式初始化,才能运行值
import tensorflow as tf


#创建变量
#修改命名空间
with tf.variable_scope("my_scope"):
    a = tf.Variable(initial_value=50)
    b = tf.Variable(initial_value=40)

with tf.variable_scope("your_scope"):
    c = tf.add(a, b)

print("a:\n",a)
print("b:\n",b)
print("c:\n",c)

#初始化变量
init=tf.global_variables_initializer()

#开启会话
with tf.Session() as sess:
    #运行初始化
    sess.run(init)
    a_value,b_value,c_value=sess.run([a,b,c])
    print("a_value:\n",a_value)
    print("b_value:\n", b_value)
    print("c_value:\n", c_value)

在这里插入图片描述
在这里插入图片描述

tensorflow实现线性回归

# 2.7 案例:实现线性回归
#     2.7.1 线性回归原理复习
#         1)构建模型
#             y = w1x1 + w2x2 + …… + wnxn + b
#         2)构造损失函数
#             均方误差
#         3)优化损失
#             梯度下降
#     2.7.2 案例:实现线性回归的训练
#         准备真实数据
#             100样本
#             x 特征值 形状 (100, 1)
#             y_true 目标值 (100, 1)
#             y_true = 0.8x + 0.7
#         假定x 和 y 之间的关系 满足
#             y = kx + b
#             k ≈ 0.8 b ≈ 0.7
#             流程分析:
#             (100, 1) * (1, 1) = (100, 1)
#             y_predict = x * weights(1, 1) + bias(1, 1)
#             1)构建模型
#             y_predict = tf.matmul(x, weights) + bias
#             2)构造损失函数
#             error = tf.reduce_mean(tf.square(y_predict - y_true))
#             3)优化损失
#             optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
#             5 学习率的设置、步数的设置与梯度爆炸
#     2.7.3 增加其他功能
#         1 增加变量显示
#             1)创建事件文件
#             2)收集变量
#             3)合并变量
#             4)每次迭代运行一次合并变量
#             5)每次迭代将summary对象写入事件文件
#         2 增加命名空间
#         3 模型的保存与加载
#             saver = tf.train.Saver(var_list=None,max_to_keep=5)
#             1)实例化Saver
#             2)保存
#                 saver.save(sess, path)
#             3)加载
#                 saver.restore(sess, path)
#         3 模型的保存与加载
#             saver = tf.train.Saver(var_list=None,max_to_keep=5)
#             1)实例化Saver
#             2)保存
#                 saver.save(sess, path)
#             3)加载
#                 saver.restore(sess, path)
#         4 命令行参数使用
#             1)tf.app.flags
#             tf.app.flags.DEFINE_integer("max_step", 0, "训练模型的步数")
#             tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路径+模型名字")
#             2)FLAGS = tf.app.flags.FLAGS
#             通过FLAGS.max_step调用命令行中传过来的参数
#             3、通过tf.app.run()启动main(argv)函数
import tensorflow as tf
import os
with tf.variable_scope("prepare_data"):
    # 1)准备数据
    X = tf.random_normal(shape=[100, 1], name="feature")
    y_true = tf.matmul(X, [[0.8]]) + 0.7

with tf.variable_scope("create_model"):
    # 2)构造模型
    # 定义模型参数 用 变量
    weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name="Weights")
    bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name="Bias")
    y_predict = tf.matmul(X, weights) + bias

with tf.variable_scope("loss_function"):
    # 3)构造损失函数
    error = tf.reduce_mean(tf.square(y_predict - y_true))

with tf.variable_scope("optimizer"):
    # 4)优化损失
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

# 2_收集变量
tf.summary.scalar("error", error)
tf.summary.histogram("weights", weights)
tf.summary.histogram("bias", bias)#偏置

# 3_合并变量
merged = tf.summary.merge_all()

# 创建Saver对象
saver = tf.train.Saver()

# 显式地初始化变量
init = tf.global_variables_initializer()

# 开启会话
with tf.Session() as sess:
    # 初始化变量
    sess.run(init)

    # 1_创建事件文件
    file_writer = tf.summary.FileWriter("./tmp/linear", graph=sess.graph)

    # 查看初始化模型参数之后的值
    print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))

    # 开始训练
    # for i in range(100):
    #     sess.run(optimizer)
    #     print("第%d次训练后模型参数为:权重%f,偏置%f,损失为%f" % (i+1, weights.eval(), bias.eval(), error.eval()))
    #
    #     # 运行合并变量操作
    #     summary = sess.run(merged)
    #     # 将每次迭代后的变量写入事件文件
    #     file_writer.add_summary(summary, i)
    #
    #     # 保存模型
    #     if i % 10 ==0:
    #         saver.save(sess, "./tmp/model/my_linear.ckpt")
    # 加载模型
    if os.path.exists("./tmp/model/checkpoint"):
        saver.restore(sess, "./tmp/model/my_linear.ckpt")

    print("训练后模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))

在这里插入图片描述

稀疏数组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class SparseArray(object):
    def print_array(self, array):  # 打印测试
        for row_item in array:
            for data in row_item:
                print("%d" % data, end=" ")
            print()

    def make_sparse_array(self, array):  # 将二维数组 转 稀疏数组
        if array == "":
            return
        total = 0
        for row_num in range(len(array)):
            for col_num in range(len(array[0])):
                if array[row_num][col_num] != 0:
                    total += 1
        # 开始创建稀疏数组
        sparse_array = [[0 for i in range(3)] for j in range(total + 1)]
        sparse_array[0][0] = len(array)
        sparse_array[0][1] = len(array[0])
        sparse_array[0][2] = total
        # 遍历二维数组,将非0的值存放到 sparse_array 中
        count = 0
        for row_index, row_item in enumerate(array):
            for col_index, col_item in enumerate(row_item):
                if col_item:
                    count += 1
                    sparse_array[count][0] = row_index
                    sparse_array[count][1] = col_index
                    #  sparse_array[count][2] = chess_array[row_index][col_index]
                    sparse_array[count][2] = col_item
        return sparse_array

    def back_array(self, array):  # 将稀疏数组 还原 二维数组
        previous_array = [[0 for i in range(array[0][0])] for j in range(array[0][1])]
        for index, item in enumerate(array):
            if index == 0:
                continue
            previous_array[item[0]][item[1]] = item[2]
        return previous_array


if __name__ == '__main__':
    row = 11  # 得到行数
    col = 11  # 得到列数
    chess_array = [[0 for i in range(col)] for j in range(row)]
    # 给原始二维数组输入值
    chess_array[1][2] = 1
    chess_array[2][3] = 2
    chess_array[4][5] = 2
    # 实例测试
    obj = SparseArray()
    obj.print_array(chess_array)
    sparse_array = obj.make_sparse_array(chess_array)
    obj.print_array(sparse_array)
    previous_array = obj.back_array(sparse_array)
    obj.print_array(previous_array)
    # print(obj.make_sparse_array(chess_array))
    # print(obj.back_array(obj.make_sparse_array(chess_array)))

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值