tensorflow_DNN训练三角函数模型

标题利用简单的三层神经网络来训练sin函数和cos函数的模型,根据预测值画出相应的函数图像。tensorflow实现过程如下:

  1. 配置超参数
class Config:
    def __init__(self):
        self.lr = 0.001
        self.epoches = 2000
        self.samples = 200	#训练样本数量
        self.hidden_units = 200  #隐藏层神经元个数
  1. 获取训练样本
class Sample:
    def __init__(self, samples):
        self.xs = np.random.uniform(-np.pi, np.pi, [samples]) 	#随机正太分布生成-pi到pi的随机数作为样本x
        self.xs = sorted(self.xs)
        self.ys = np.sin(self.xs), np.cos(self.xs)  #样本目标值[2,-1]
  1. 搭建神经网络
class Tensor:
    def __init__(self, config: Config):
        self.x = tf.placeholder(tf.float32, [None], name='x')  # [200]
        self.y = tf.placeholder(tf.float32, [2,None], name='y')	#[2,-1]
        x = tf.reshape(self.x, [-1, 1])  # 元素转化为张量
        x = tf.layers.dense(x, config.hidden_units, tf.nn.relu)
        self.y_predict = tf.layers.dense(x, 2)   #[-1,2]

        y = tf.transpose(self.y)     #使目标值的shape与预测值相同

        self.loss = tf.reduce_mean(tf.square(self.y_predict - y))  #计算loss
        self.lr = tf.placeholder(tf.float32, [], 'lr') 
        opt = tf.train.AdamOptimizer(self.lr)  #训练优化器
        self.train_op = opt.minimize(self.loss) 
        self.loss = tf.sqrt(self.loss)
  1. 编写应用对象
class App:
    def __init__(self, config: Config):
        self.ts = Tensor(config)  #实例化张量网络
        self.config = config
        
        self.session = tf.Session()  #创建会话
        self.session.run(tf.global_variables_initializer())  #初始化变量

    def train(self):   #训练方法
        sample = Sample(200)
        for epoche in range(self.config.epoches):   
            _, loss = \
                self.session.run([self.ts.train_op, self.ts.loss],
                                 {self.ts.x: sample.xs, self.ts.y: sample.ys, self.ts.lr: self.config.lr})#喂入训练数据
            print(f"{epoche}:{loss}")
        return sample.xs, sample.ys  #返回样本数据

    def predict(self):  #预测方法
        sample = Sample(400)
        ys = self.session.run(self.ts.y_predict, {self.ts.x: sample.xs})   #喂入预测数据
        return sample.xs, ys  #返回预测数据

    def close(self):
        self.session.close()
  1. 主方法
if __name__ == '__main__':
    app = App(Config())
    xs_raw, ys_raw = app.train()
    predict_x, predict_y = app.predict()
    plt.plot(predict_x, predict_y)
    plt.legend(['predict_sin','predict_cos'])
    plt.show()
  1. 结果

result

这个表达式是计算二分类(通常涉及机器学习中的预测模型,如DNN,即深度神经网络)中模型的准确率(Accuracy)。其中: - TP (True Positive): 真正例,预测为正且实际为正的样本数。 - TN (True Negative): 真负例,预测为负且实际为负的样本数。 - FP (False Positive): 假正例,预测为正但实际为负的样本数。 - FN (False Negative): 假负例,预测为负但实际为正的样本数。 公式 `(TP_DNN + TN_DNN) / (TP_DNN + TN_DNN + FP_DNN + FN_DNN)` 就是将正确预测(TP和TN)的总数除以所有预测总数(包括正确和错误预测),得到分类器在给定数据集上的准确率。 为了增加一个固定的阈值为0.5(通常用于二元分类问题中的概率阈值决策),我们通常会这样操作: 1. 对于模型输出的概率或预测概率进行比较。如果预测概率大于等于0.5,我们可以将其分类为正例(例如1),否则为负例(例如0)。 2. 计算新的TP、TN、FP和FN,基于新的分类标准。 这是一个示例代码片段: ```python # 假设model_output是DNN模型的输出概率列表 threshold = 0.5 new_predictions = [1 if prob >= threshold else 0 for prob in model_output] # 更新计数 TP_new = sum([1 for pred, actual in zip(new_predictions, labels) if pred == 1 and actual == 1]) TN_new = sum([1 for pred, actual in zip(new_predictions, labels) if pred == 0 and actual == 0]) FP_new = sum([1 for pred, actual in zip(new_predictions, labels) if pred == 1 and actual == 0]) FN_new = sum([1 for pred, actual in zip(new_predictions, labels) if pred == 0 and actual == 1]) # 新的精度计算 accuracy_DNN_thresholded = (TP_new + TN_new) / (TP_new + TN_new + FP_new + FN_new) print(f"Accuracy with 0.5 threshold: {accuracy_DNN_thresholded}") ``` 这里`labels`是对应的实际标签列表,`model_output`是模型预测的概率输出。这个新精度值就是基于0.5阈值后的模型性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值