个人刚刚入门使用tensorflow进行深度学习编程,看到的教程如鸢尾花、图片分类等,输出都是一个类似一维数组。
例如:鸢尾花分类结果是0 1 2三类,输出结果是一个一维数组(0.2 0.8 0)三个数字分别为对应分类的概率。
我现在想实现的东西如下:
输入是一个一维数组,也就是一个时间域的子波;输出是一个二维矩阵(这个矩阵表示的意思是产生这个时间域子波对应的阵列),比如是一个3*3的矩阵,如下所示:
X Y Z
L M N
O P Q
每个元素分别代表了我这个位置上对应的阵列气枪容量选择(每个位置有几种可能性,类似鸢尾花的分类),举个例子:X这个位置,可供选择的种类共有5种,我们分别称之为0 1 2 3 4,对应我想要的输出应该是这个位置对应的一个概率,类似鸢尾花那种,输出应该是(0.1 0.6 0.1 0 0.2)这种,那这个位置我就选择1这个分类,对应的比如是容量为70的枪;这样一来,其实每个元素本身就不代表一个数了,而是代表一个一维矩阵,对于这个问题我的能力没法解决,所以求指点(我个人能力比较差,希望能把代码编好,我可以对照理解)。
此外,对于这个3*3的输出矩阵,我倒是想了办法,可以给他拉成一维平的矩阵,这个倒没啥问题,如果我后续想增加一个输出,比如X和Y这两个元素之间的距离这种,如何实现?也请专家给个例子。
最后,上述内容所提到的比如子波和对应的阵列,元素之间的距离,我都可以产生对应的训练数据,最好在编好程序后能自己稍微生成几个数据跑一下,证明能跑通,感谢。
我想要达到的结果:
1、对于我描述的多参数输出(每个矩阵元素都是一个一维矩阵)问题,给出描述问题对应的tensorflow代码,我是用pycharm在anaconda环境下练习的,所以希望能给出对应代码,不然我可能看不懂。
2、实现输出一个矩阵阵列每个元素对应概率的同时输出每个元素之间的距离这个结果(应该也是个矩阵,只是行列数有点区别),最好能在1的代码上修改得到。
望不吝赐教(吐槽下,文个问题改了半天,各种格式要求,影响效率啊)
给你提供个例子,我用的slearn中的鸢尾花数据集,以前使用梯度下降的方式做的一个demo,里面用tf.nn.softmax(y)是预测的概率值,并用tf.argmax(y, axis=1)返回最大索引, tf.cast()将x的数据格式转化成dtype.例如,原来x的数据格式是bool, 那么将其转化成float以后,就能够将其转化成0和1的序列。你可以看一看https://blog.csdn.net/qq_52363737/article/details/119514954?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166254101116800180668019%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166254101116800180668019&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-119514954-null-null.142^v47^control,201^v3^control_2&utm_term=TensorFlow%E5%AF%B9%E9%B8%A2%E5%B0%BE%E8%8A%B1%E8%BF%9B%E8%A1%8C%E5%88%86%E7%B1%BB&spm=1018.2226.3001.4187,这个是对我说的这个讲解的很透彻的一个
data:
([[7.4, 2.8, 6.1, 1.9],
[5.1, 3.8, 1.6, 0.2],
[5. , 3.3, 1.4, 0.2],
[6.7, 3.3, 5.7, 2.1],
[5.5, 2.3, 4. , 1.3]])
target:
array([1, 1, 1, 0, 0, 2, 2, 2, 1, ])
全部代码:
# -*- coding:utf-8 -*-
import numpy as np
from sklearn.datasets import load_iris
import tensorflow as tf
iris_data = load_iris()
x_data,y_data = iris_data.data,iris_data.target
# 打乱数据集
# 设置随机数种子,确保打乱后的数据仍然是一组组对应的数据
np.random.seed(116)
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
#9:1
split_num = int(len(y_data) * 0.9)
x_train = x_data[:split_num]
y_train = y_data[:split_num]
# 测试集
x_test = x_data[split_num:]
y_test = y_data[split_num:]
# 将特征值的类型转换为tensor类型,避免后面的矩阵乘法报错
x_train = tf.cast(x_train, tf.float32)
x_test = tf.cast(x_test, tf.float32)
# 将特征值和目标值一一配对 并且每32组数据为一个batch,喂入神经网络的数据以batch为单位
train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)
test_data = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)
# print(test_data)
# 初始化梯度和偏置
# 由于输入的特征为4个,目标值是三分类,所以我们将 梯度 随机初始化为 四行三列的tensor
w = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1))
# 同理,我们的目标值是一维数据,所以将 偏置 初始化为随机的1维tensor
b = tf.Variable(tf.random.truncated_normal([3], stddev=0.1))
# 初始化学习率
lr = 0.1
# 梯度下降次数
epoch = 500
# 每轮分4个step,loss_all记录四个step生成的4个loss的和
loss_all = 0
for epoch in range(epoch):
for step, (x_train, y_train) in enumerate(train_data):
with tf.GradientTape() as tape:
y = tf.matmul(x_train, w) + b
# 使输出符合概率分布
y = tf.nn.softmax(y)
# 将目标值转换为独热编码,方便计算loss和acc
y_true = tf.one_hot(y_train, depth=3)
# 回归性能评估采用MSE
loss = tf.reduce_mean(tf.square(y_true - y))
# print(loss)
loss_all += loss.numpy()
# 对每个梯度和偏置求偏导
grads = tape.gradient(loss, [w, b])
# 梯度自更新
# 这两行代码相当于
# w = w - lr * w_grads、b = b - lr * b_grads
w.assign_sub(lr * grads[0])
b.assign_sub(lr * grads[1])
print(f"第{epoch}轮,损失是:{loss_all / 4}")
loss_all = 0
total_correct, total_number = 0, 0
for x_test, y_test in test_data:
y = tf.matmul(x_test, w) + b
y = tf.nn.softmax(y)
# 返回最大值所在的索引,即预测的分类
y_pred = tf.argmax(y, axis=1)
# print(y_pred)
y_pred = tf.cast(y_pred, dtype=y_test.dtype)
correct = tf.cast(tf.equal(y_pred, y_test), dtype=tf.int32)
correct = tf.reduce_sum(correct)
total_correct += int(correct)
total_number += x_test.shape[0]
acc = total_correct / total_number
print("测试集的准确率为:\n", acc)
有用欢迎采纳,顺道给那位博主点个赞,讲的很透彻