cylhs 2019-06-09 20:49 采纳率: 0%
浏览 1655

简单BP神经网络训练鸢尾花

大佬们,请问result为什么大于0.8就是1,小于0.2是0,其他值则为0.5啊?

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


iris = pd.read_csv("Iris.txt",names=['a','b','c','d','class'])
iris['class'][iris['class']=="Iris-setosa"] = 0
iris['class'][iris['class']=="Iris-versicolor"] = 0.5
iris['class'][iris['class']=="Iris-virginica"] = 1

iris_class1 = iris[iris["class"]==0]
iris_class2 = iris[iris["class"]==0.5]
iris_class3 = iris[iris["class"]==1]

temp = np.array(iris)
train_data = np.delete(temp,range(len(temp))[::3],axis=0)
test_data = temp[::3,:]

"""
添加神经网络层的函数
inputs -- 输入内容
in_size -- 输入尺寸
out_size -- 输出尺寸
activation_function --- 激励函数,可以不用输入
"""
def add_layer(inputs,in_size,out_size,activation_function=None):
    W = tf.Variable(tf.zeros([in_size,out_size])+0.01)   #定义,in_size行,out_size列的矩阵,随机矩阵,全为0效果不佳
    b = tf.Variable(tf.zeros([1,out_size])+0.01)       #不建议为0
    Wx_plus_b = tf.matmul(inputs,W) + b            # WX + b
    if activation_function is None:         #如果有激励函数就激励,否则直接输出
        output = Wx_plus_b
    else:
        output = activation_function(Wx_plus_b)
    return output

X = tf.placeholder(tf.float32,[None,4])
Y = tf.placeholder(tf.float32,[None,1])

output1 = add_layer(X,4,8,activation_function = tf.nn.sigmoid)
output2 = add_layer(output1,8,3,activation_function = tf.nn.sigmoid)
temp_y = add_layer(output2,3,1,activation_function = tf.nn.sigmoid)
#先求平方,再求和,在求平均
loss = tf.reduce_mean(tf.reduce_sum(tf.square(Y-temp_y),reduction_indices=[1]))
#通过优化器,以0.001的学习率,减小误差loss
train_step = tf.train.AdamOptimizer(0.001).minimize(loss)

#拆分训练集数据集,分为输入和输出
train_x = train_data[:,:4]
train_y = train_data[:,-1:]

sess = tf.Session()
sess.run(tf.global_variables_initializer())
save_process = []
for i in range(90000):#训练90000次
    sess.run(train_step,feed_dict={X:train_x,Y:train_y})
    if i%300 == 0:#每300次记录损失值(偏差值)
        save_process.append(sess.run(loss,feed_dict={X:train_x,Y:train_y}))

#第前两个数据比较大,踢掉
# save_process = np.delete(save_process,[0,1])
# plt.plot(range(len(save_process)),save_process)

def compare_numpy(a,b,is_num=False):
    """比较两个维度相同的数组,返回相同数字个数/相似度"""
    num = 0
    for i in range(len(a)):
        if a[i]==b[i]:
            num+=1
    return num if is_num else num/len(a)

test_x = test_data[:,:4]
test_y = test_data[:,-1:]

result = sess.run(temp_y,feed_dict={X:test_x})
result[result > 0.8] = 1
result[result < 0.2] = 0
result[(result < 0.8) & ( result > 0.2)] = 0.5

print("总数:",len(test_data),"  准确个数:",compare_numpy(result,test_y,True),"  精确度:",compare_numpy(result,test_y))
  • 写回答

1条回答

  • threenewbee 2019-06-09 21:39
    关注
    这个是置信度,>0.8和<0.2表示非常有把握判断是或者不是,在此之间表示不确定
    
    评论

报告相同问题?

悬赏问题

  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效