在训练虹膜花数据集的分类器时获取TypeError

时间:2018-04-02 14:09:51

标签: tensorflow

我试图通过将输出图层作为线性图层进行实验,以对虹膜花数据集进行分类并使用回归,并使用目标值 从0,1和2不等。 我正在使用1个隐藏的tanh激活层和另一个线性层。我有动机尝试使用这个而不是一个热编码的标签,因为我想比较我的代码的'模型'功能的分数,因为我是新的tensorflow。在代码下运行...

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import tensorflow as tf
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
data=load_iris()
X=data['data']
Y=data['target']
pca=PCA(n_components=2)
X=pca.fit_transform(X)
#visualise the data
#plt.figure(figsize=(12,12))
#plt.scatter(X[:,0],X[:,1],c=Y,alpha=0.4)
#plt.show()
labels=Y.reshape(-1,1)
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.3,random_state=42)
y_train=y_train.reshape(-1,1)
y_test=y_test.reshape(-1,1)
hidden_nodes=5
batch_size=100
num_features=2
lr=0.01
g=tf.Graph()
with g.as_default():
    tf_train_dataset=tf.placeholder(tf.float32,shape=[None,num_features])         
    tf_train_labels=tf.placeholder(tf.float32,shape=[None,1]) 
    tf_test_dataset=tf.constant(x_test,dtype=tf.float32)                       
    layer1_weights=tf.Variable(tf.truncated_normal([num_features,hidden_nodes]),dtype=tf.float32)
    layer1_biases=tf.Variable(tf.zeros([hidden_nodes]),dtype=tf.float32)            
    layer2_weights=tf.Variable(tf.truncated_normal([hidden_nodes,1]),dtype=tf.float32)
    layer2_biases=tf.Variable(tf.zeros([1]),dtype=tf.float32)   
    def model(data):                                                               
        Z1=tf.matmul(data,layer1_weights)+layer1_biases                    
        A1=tf.nn.relu(Z1)    
        Z2=tf.matmul(A1,layer2_weights)+layer2_biases                 
        return Z2
    model_scores=model(tf_train_dataset)
    loss=tf.reduce_mean(tf.losses.mean_squared_error(model_scores,tf_train_labels))           
    optimizer=tf.train.GradientDescentOptimizer(lr).minimize(loss)                    
    #train_prediction=model_scores                                                             
    test_prediction=(tf_test_dataset)                                                    
    num_steps=10001                                                                           
    with tf.Session() as sess:                                                                
         init=tf.global_variables_initializer() 
         sess.run(init)                                                  
         for step in range(num_steps):  
             offset=(step*batch_size)%(y_train.shape[0]-batch_size)                            
             minibatch_data=x_train[offset:(offset+batch_size),:]                              
             minibatch_labels=y_train[offset:(offset+batch_size)]                              
             feed_dict={tf_train_dataset:minibatch_data,tf_train_labels:minibatch_labels}      
             ll,loss,scores=sess.run([optimizer,loss,model_scores],feed_dict=feed_dict)
             if step%1000==0:                                                                  
                 print('Minibatch loss at step {}:{}'.format(step,loss))  

我在线上收到错误

ll,loss,scores=sess.run([optimizer,loss,model_scores],feed_dict=feed_dict)
  

TypeError:Fetch参数14.686994具有无效类型,必须是字符串或Tensor。 (无法将float32转换为Tensor或Operation。)

为什么会出现错误,是因为这行

  

model_scores =模型(tf_train_dataset)

我应该如何解决这个问题,并且模型函数的返回值不能是张量或者是张量的。

感谢。

1 个答案:

答案 0 :(得分:1)

这是因为这一行:

targetList=[0,1,1,2,2,2,3,3,3,3,3]

您将ll,loss,scores=sess.run([optimizer,loss,model_scores],feed_dict=feed_dict) 张量替换为loss返回的损失值。只需使用另一个变量来存储损失值。