机器学习笔记(2)tensorflow学习

机器学习笔记(2)

神经网络实例

参考资料:
https://blog.csdn.net/MrMaurice/article/details/90031937?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-2&spm=1001.2101.3001.4242

单隐层前馈网络结构:
在这里插入图片描述
问题描述:预测天气气温,当输入连续三小时的气温时,预测第四个小时的气温。

数据:训练集为20 * 24小时气温数据,测试集为10 * 24小时数据。

网络结构为:3 * 7 * 1,即三个输入神经元,七个隐层神经元,一个输出神经元。

环境:python3.6.5和tensorflow1.2.1,

import tensorflow as tf
from numpy.random import RandomState
import pandas as pd
import numpy as np
import time

# 定义神经网络的参数
d = 3  # 输入节点个数
l = 1  # 输出节点个数
q = 2 * d + 1  # 隐层个数,采用经验公式2d+1
train_num = 480  # 训练数据个数
test_num = 240  # 测试数据个数
eta = 0.5  # 学习率
error = 0.002  # 精度

# 初始化权值和阈值
# tf.Variable()变量初始化,tf.random_normal()采用正态分布
# [d, q]为张量形状,seed设定随机种子,保证每次初始化相同数据
w1 = tf.Variable(tf.random_normal([d, q], stddev=1, seed=1))
b1 = tf.Variable(tf.constant(0.0, shape=[q]))
w2 = tf.Variable(tf.random_normal([q, l], stddev=1, seed=1))
b2 = tf.Variable(tf.constant(0.0, shape=[l]))

# 输入占位,(none,d)表示列为d,行不定
x = tf.placeholder(tf.float32, shape=(None, d))
y_ = tf.placeholder(tf.float32, shape=(None, l))

# 构建图:前向传播
a = tf.nn.sigmoid(tf.matmul(x, w1) + b1)  # sigmoid激活函数
y = tf.nn.sigmoid(tf.matmul(a, w2) + b2)
mse = tf.reduce_mean(tf.square(y_ - y))  # 损失函数采用均方误差
train_step = tf.train.AdamOptimizer(eta).minimize(mse)  # Adam算法,学习率为0.5,最小化均方误差

# 读取气温数据
# pd.read_csv()第一个参数为路径,第二个为分隔符
dataset = pd.read_csv('tem.csv', delimiter=",")
dataset = np.array(dataset)    #得到n行1列的数组
m, n = np.shape(dataset)
totalX = np.zeros((m - d, d))  #返回来一个给定形状和类型的用0填充的数组
totalY = np.zeros((m - d, l)) 
for i in range(m - d):  # range()从0到m-d,以1为步长,分组:前三个值输入,第四个值输出
    totalX[i][0] = dataset[i][0]
    totalX[i][1] = dataset[i + 1][0]
    totalX[i][2] = dataset[i + 2][0]
    totalY[i][0] = dataset[i + 3][0]
# 归一化数据
Normal_totalX = np.zeros((m - d, d))
Normal_totalY = np.zeros((m - d, l))
nummin = np.min(dataset)
nummax = np.max(dataset)
dif = nummax - nummin
for i in range(m - d):
    for j in range(d):
        Normal_totalX[i][j] = (totalX[i][j] - nummin) / dif
    Normal_totalY[i][0] = (totalY[i][0] - nummin) / dif

# 截取训练数据
# 训练集截取前train_num - d行,测试集截取剩下的
X = Normal_totalX[:train_num - d, :]
Y = Normal_totalY[:train_num - d, :]
testX = Normal_totalX[train_num:, :]
testY = totalY[train_num:, :]

start = time.clock()
# 创建会话(session)来执行图
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()  # 初始化节点
    sess.run(init_op) #以初始节点运行网络

    STEPS = 0
    while True:
        sess.run(train_step, feed_dict={x: X, y_: Y}) #用X代替x,Y代替y_执行train_step(Adam算法)
        STEPS += 1
        train_mse = sess.run(mse, feed_dict={x: X, y_: Y})
        if STEPS % 10 == 0:  # 每训练10次,输出损失函数
            print("第 %d 次训练后,训练集损失函数为:%g" % (STEPS, train_mse))
        if train_mse < error:
            break
    print("总训练次数:", STEPS)
    end = time.clock()
    print("运行耗时(s):", end - start)

    # 测试
    Normal_y = sess.run(y, feed_dict={x: testX})  # 求得测试集下的y计算值
    DeNormal_y = Normal_y * dif + nummin  # 将y反归一化
    test_mse = sess.run(mse, feed_dict={y: DeNormal_y, y_: testY})  # 计算均方误差
    print("测试集均方误差为:", test_mse)

    # 预测
    XX = tf.constant([[18.3, 17.4, 16.7]])
    XX = (XX - nummin) / dif  # 归一化
    a = tf.nn.sigmoid(tf.matmul(XX, w1) + b1)
    y = tf.nn.sigmoid(tf.matmul(a, w2) + b2)
    y = y * dif + nummin  # 反归一化
    print("[18.3,17.4,16.7]输入下,预测气温为:", sess.run(y))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值