用Tensorflow搭建简单神经网络

最近学习需要,做了一个用Tensorflow搭建好的简单神经网络,来预测回归问题。

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import pandas as pd

n_hidden_1 =60     #隐层1
n_input = 2         #输入层
n_output = 1        #输出层

# INPUTS AND OUTPUTS
x = tf.placeholder("float", [None, n_input])
y = tf.placeholder("float", [None, n_output])

# NETWORK PARAMETERS
stddev = 0.1
weights = {
    'w1': tf.Variable(tf.random_normal([n_input, n_hidden_1], stddev=stddev)),
    'w2': tf.Variable(tf.random_normal([n_hidden_1, n_output], stddev=stddev))
}
biases = {
    'b1': tf.Variable(tf.random_normal([n_hidden_1])),
    'b2': tf.Variable(tf.random_normal([n_output]))
}

# 取出数据
filepath = "D:\\SwarmData\\trans_result\\trans_step250.csv" #绝对路径,按需要修改
data = pd.DataFrame()
xtest=np.mat(np.array([])) #测试x
ytest=np.mat(np.array([]))#测试y
xMat=np.mat(np.array([]))#训练x
yMat=np.mat(np.array([]))#训练y

#预存各项最大值、最小值。用来归一化后的还原数据
max=pd.Series()
min=pd.Series()
rmax=0
rmin=0
sizemax=0
sizemin=0
gapmax=0
gapmin=0

def get_input():
    global data
    global xMat
    global yMat
    global xtest
    global ytest
    global max
    global min
    global rmax
    global rmin
    global sizemax
    global sizemin
    global gapmax
    global gapmin
    data = pd.read_csv(filepath)
    data = data[['swarmsize', 'gap', 'r']]
    max=data.max()
    min=data.min()
    rmax=max['r']
    rmin=min['r']
    sizemax = max['swarmsize']
    sizemin = min['swarmsize']
    gapmax = max['gap']
    gapmin = min['gap']
    data = (data - data.min()) / (data.max() - data.min()) #归一化操作
    # data=data.div(200)
    data = np.array(data)
    np.random.shuffle(data)
    allurl_fea = [d[0] for d in data]
    traindata = data[:int(0.9 * len(allurl_fea))]
    traindata = pd.DataFrame(traindata, columns=['swarmsize', 'gap', 'r'])
    testdata = data[int(0.9 * len(allurl_fea)): ]
    testdata = pd.DataFrame(testdata, columns=['swarmsize', 'gap', 'r'])

    xMat = traindata[['swarmsize', 'gap']].as_matrix()  #训练x
    yMat = traindata[['r']].as_matrix() #训练y
    xtest = testdata[['swarmsize', 'gap']].as_matrix()  #测试x
    ytest = testdata[['r']].as_matrix() #测试y

#取出数据
get_input()


def multilayer_perceptron(_X, _weights, _biases):
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(_X, _weights['w1']), _biases['b1']))
    # layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, _weights['w2']), _biases['b2']))
    return (tf.matmul(layer_1, _weights['w2']) + _biases['b2'])

# PREDICTION
pred = multilayer_perceptron(x, weights, biases)

# LOSS AND OPTIMIZER
# 损失函数
cost = tf.reduce_mean(tf.square(pred - y))
#0.02 学习率按具体需要设置
optm = tf.train.GradientDescentOptimizer(learning_rate=0.02).minimize(cost)
# INITIALIZER
# LAUNCH THE GRAPH
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

#保存
saver=tf.train.Saver()

do_train=2     #do_train==1训练,do_train==0测试
training_epochs = 2000  #训练的轮数,按具体需要设置
batch_size      = 5     #随机梯度代入数据块,按具体需要设置

#训练
if do_train==1:
    for epoch in range(training_epochs):
        avg_cost = 0.
        total_batch = int(xMat.shape[0]/batch_size)
        # ITERATION
        for i in range(total_batch):
            batch_xs = xMat[i*batch_size:(i+1)*batch_size]
            batch_ys = yMat[i*batch_size:(i+1)*batch_size]
            feeds = {x: batch_xs, y: batch_ys}  #传入数据
            # print(feeds)
            sess.run(optm, feed_dict=feeds)
            avg_cost += sess.run(cost, feed_dict=feeds)
        avg_cost = avg_cost / total_batch
        print (avg_cost)
        do_save=1
        if do_save==1:
            if epoch==training_epochs-1:
                #保存模型到文件
                saver.save(sess,"save/w"+str(epoch))
#测试
if do_train == 0:
    epoch = training_epochs - 1
    #取出模型
    saver.restore(sess, "save/w" + str(epoch))
    testfeed = {x: xtest, y: ytest}     #传入测试数据
    test_cost = sess.run(cost, feed_dict=testfeed)
    print('test_cost:', test_cost)      #测试损失函数值

    # 以下部分是归一化之后的还原操作,对于训练模型而言可以忽略
    # 只是为了更直观的观察预测数据,与真实数据之间的差异
    feed = {x: xtest}
    preddata=sess.run(pred,feed_dict=feed)
    d=[]
    for i in range(200):
        yout=ytest[i:i+1]*(rmax-rmin)+rmin
        predout=preddata[i:i+1]*(rmax-rmin)+rmin
        d.append(abs(yout-predout))
        print('y',i,':',yout,'pred',i,':',predout,'abs:',d[i])
    aver=np.mean(d)
    var=np.var(d)
    print('average:',aver,'var:',var)

#以下代码 可忽略,只是需要预测size很大的时候,输出r的值
if do_train == 2:
    epoch = training_epochs - 1
    saver.restore(sess, "save/w" + str(epoch))
    xx=[]
    def func(size,gap):
        x1 = (size - sizemin) / (sizemax - sizemin)
        x2 = (gap - gapmin) / (gapmax - gapmin)
        x = [x1, x2]
        xx.append(x)
    func(500,25)
    func(1000,25)
    xtest=xx
    feed = {x: xtest}
    preddata=sess.run(pred,feed_dict=feed)
    predout = preddata * (rmax - rmin) + rmin
    print('pred:',predout)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜菜菜菜菜菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值