数据用的sklearn自带的乳腺癌数据集,中间写了好几次loss函数都出问题了,最后用的tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None)这个方法实现的。
代码如下:
from sklearn.model_selection import train_test_split
import tensorflow as tf
from sklearn.datasets import load_breast_cancer
import numpy as np
from sklearn.preprocessing import MinMaxScaler
#数据预处理
breast_cancer=load_breast_cancer()
label=breast_cancer.target.reshape([-1,1])
feature=breast_cancer.data
minmxx=MinMaxScaler([0,1])
minmxx.fit(feature)
feature=minmxx.transform(feature)
#tensorflow
w=tf.Variable(tf.random_normal([30,1]))
b=tf.Variable(tf.zeros([1,1]))
x=tf.placeholder(tf.float32)
y=tf.placeholder(tf.float32)
ye=tf.matmul(x,w)+b
pre=tf.sigmoid(ye)
#loss=-tf.reduce_mean(tf.square(y-pre))
loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=pre))
train=tf.train.AdamOptimizer(0.1).minimize(loss)
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)
for step in range(20001):
sess.run(train,feed_dict={x:feature,y:label})
if step%2000==0:
print(sess.run([loss],feed_dict={x:feature,y:label}))
#计算测试精度
pred=sess.run(pre,feed_dict={x:feature,y:label})
from sklearn import metrics
print(metrics.classification_report(label,pred.round()))
最后计算结果还可以。刚开始学的时候总想着上手去写,所以过程中遇到了很多困难,比如矩阵乘法问题,loss总是不收敛、loss会出现nan的问题,也都找到了解决的办法,感觉是对于这个框架慢慢的逐渐熟悉就好了。