TensorFlow实现简单线性分类问题
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import random
from sklearn.utils import shuffle
#数据生成和数据处理
def generate(sample_size,mean,cov,diff,regression,num_classes):
"""sample_size:样本个数;mean:不同特征的分布均值;cov:不同特征的分布方差;diff:特征分布的偏移量;regression:是否One Hot;num_classes:分类个数。"""
sample_size_per_class=int(sample_size//num_classes)
X0=np.random.multivariate_normal(mean,cov,sample_size_per_class)
Y0=np.zeros(sample_size_per_class)
for ci, d in enumerate(diff):
Xtmp=np.random.multivariate_normal(mean+d,cov,sample_size_per_class)
Ytmp=(ci+1)*np.ones(sample_size_per_class)
X0=np.concatenate((X0,Xtmp))
Y0=np.concatenate((Y0,Ytmp))
if regression==False:
class_ind=[Y==class_number for class_number in range(num_classes)]
Y0=np.asarray(class_ind)
X,Y=shuffle(X0,Y0)
return X,Y
np.random.seed(10)
num_classes=2
input_lable=2
mean=np.random.randn(input_lable)
cov=np.eye(input_lable)
X,Y=generate(1000,mean,cov,[3.0],True,num_classes)
lab_dim=1
#参数输入接口
input_featrues=tf.placeholder(tf.float32,[None,input_lable])
input_labels=tf.placeholder(tf.float32,[None,lab_dim])
#变量名
W=tf.Variable(tf.random_normal([input_lable,lab_dim]),name='Weight')
b=tf.Variable(tf.zeros([lab_dim]),name='bias')
output=tf.nn.sigmoid(tf.matmul(input_featrues,W)+b)
cross_entropy=-(input_labels*tf.log(output)+(1-input_labels)*tf.log(1-output))
ser=tf.square(output-input_labels)
loss=tf.reduce_mean(cross_entropy)
err=tf.reduce_mean(ser)
learning_rate=0.04
train=tf.train.AdamOptimizer(learning_rate).minimize(loss)
maxEpochs=60
minibatchSize=25
W_output=[]
b_output=[]
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(maxEpochs):
sumerr=0
for i in range(int(len(Y)//minibatchSize)):
x1=X[i*minibatchSize:(i+1)*minibatchSize:]
y1=Y[i*minibatchSize:(i+1)*minibatchSize].reshape(-1,1)
_,lossval,outputval,errval=sess.run([train,loss,output,err],feed_dict={input_featrues:x1,input_labels:y1})
sumerr+=errval
if (epoch+1)%10==0:
print("Epoch:",'%04d'%(epoch+1),"cost=","{:9f}".format(lossval),\
"err=",sumerr/minibatchSize)
print("Finish!")
W_output.append(sess.run(W))
b_output.append(sess.run(b))
colors=['r' if l==0 else 'b' for l in Y[:]]
plt.scatter(X[:,0],[X[:,1]],c=colors)
x=np.linspace(-1,8,200)
y=-x*(W_output[0][0]/W_output[0][1])-b_output[0][0]/W_output[0][1]
plt.plot(x,y,label='Fitted line')
plt.xlabel('Scaled age(in yrs)')
plt.ylabel('Tumor size(in cm)')
plt.show()
运行结果:
代码参考《深度学习之TensorFlow入门、原理与进阶实战》