吴恩达-机器学习-简单神经网络实现

该博客介绍了如何用TensorFlow构建一个简单的两层神经网络,包括数据预处理、模型构建、训练及预测。数据集是随机生成的咖啡烘焙数据,经过标准化处理,使用Sigmoid激活函数和Adam优化器。模型训练10次后,展示并解释了预测结果。
摘要由CSDN通过智能技术生成

吴恩达-机器学习-简单神经网络实现TensorFlow版

1.数据集为 load_coffee_data() 函数每次随机生成,之后进行简单的标准化Normalization。

2.搭建了一个两层的简单神经网络

        第一层网络:三个神经元 ,第二层网络:一个神经元

        激活函数:Sigmoid

        损失函数:二值交叉熵Binary-Cross-entropy

        优化算法:Adam

        迭代次数:十次

3.输入两个测试函数进行预测 输出结果

*****

Normalization标准化:
        在数据分析之前,我们通常需要先将数据标准化,利用标准化后的数据进行数据分析。数据标准化处理主要包括数据同趋化处理和无量纲化处理两个方面。数据同趋化处理主要解决不同性质数据问题,对不同性质指标直接加总不能正确反映不同作用力的综合结果,须先考虑改变逆指标数据性质,使所有指标对测评方案的作用力同趋化,再加总才能得出正确结果。数据无量纲化处理主要解决数据的可比性。经过上述标准化处理,原始数据均转换为无量纲化指标测评值,即各指标值都处于同一个数量级别上,可以进行综合测评分析。

Adam优化算法:

Adam 是一种可以替代传统随机梯度下降过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重。Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。Adam 算法的提出者描述其为两种随机梯度下降扩展式的优点集合,即:

  • 适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。
  • 均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。

 代码

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import logging
logging.getLogger("tensorflow").setLevel(logging.ERROR)
tf.autograph.set_verbosity(0)

#随机生成数据
def load_coffee_data():
    """ Creates a coffee roasting data set.
        roasting duration: 12-15 minutes is best
        temperature range: 175-260C is best
    """
    rng = np.random.default_rng(2)
    X = rng.random(400).reshape(-1,2)
    X[:,1] = X[:,1] * 4 + 11.5          # 12-15 min is best
    X[:,0] = X[:,0] * (285-150) + 150  # 350-500 F (175-260 C) is best
    Y = np.zeros(len(X))
    
    i=0
    for t,d in X:
        y = -3/(260-175)*t + 21
        if (t > 175 and t < 260 and d > 12 and d < 15 and d<=y ):
            Y[i] = 1
        else:
            Y[i] = 0
        i += 1

    return (X, Y.reshape(-1,1))

#导入数据
X,Y = load_coffee_data();

norm_l = tf.keras.layers.Normalization(axis=-1)
norm_l.adapt(X)  
Xn = norm_l(X)

Xt = np.tile(Xn,(1000,1))
Yt = np.tile(Y,(1000,1))   

tf.random.set_seed(1234)  

#构建模型
model = Sequential(
    [
        tf.keras.Input(shape=(2,)),
        Dense(3, activation='sigmoid', name = 'layer1'),
        Dense(1, activation='sigmoid', name = 'layer2')
     ]
)

#model.summary()

model.compile(
    loss = tf.keras.losses.BinaryCrossentropy(),
    optimizer = tf.keras.optimizers.Adam(learning_rate=0.01),
)

model.fit(
    Xt,Yt,            
    epochs=10,
)


#测试输出
X_test = np.array([
    [200,13.9],  # postive example
    [200,17]])   # negative example
X_testn = norm_l(X_test)
predictions = model.predict(X_testn)
print("predictions = \n", predictions)

yhat = np.zeros_like(predictions)
for i in range(len(predictions)):
    if predictions[i] >= 0.5:
        yhat[i] = 1
    else:
        yhat[i] = 0
print(f"decisions = \n{yhat}")

结果

#迭代十次
Epoch 1/10
6250/6250 [==============================] - 5s 813us/step - loss: 0.1826
Epoch 2/10
6250/6250 [==============================] - 5s 821us/step - loss: 0.1173
Epoch 3/10
6250/6250 [==============================] - 5s 824us/step - loss: 0.0351
Epoch 4/10
6250/6250 [==============================] - 5s 834us/step - loss: 0.0167
Epoch 5/10
6250/6250 [==============================] - 5s 826us/step - loss: 0.0112
Epoch 6/10
6250/6250 [==============================] - 5s 818us/step - loss: 0.0081
Epoch 7/10
6250/6250 [==============================] - 5s 823us/step - loss: 0.0059
Epoch 8/10
6250/6250 [==============================] - 5s 823us/step - loss: 0.0043
Epoch 9/10
6250/6250 [==============================] - 5s 823us/step - loss: 0.0032
Epoch 10/10
6250/6250 [==============================] - 5s 826us/step - loss: 0.0024

#测试
1/1 [==============================] - 0s 75ms/step

#预测结果
predictions = 
 [[9.8878360e-01]
 [3.9570075e-08]]

decisions = 
[[1.]
 [0.]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值