预测TensorFlow模型

我刚开始学习机器学习。我正在研究Iris数据集。使用了花萼长度、花萼宽度和花瓣长度来预测花瓣宽度,使用的是神经网络。因此设置了3个输入节点作为A1,偏置为b1,10个隐藏节点作为A2,偏置为b2,以及1个输出节点。此外,使用变量x_val_train, x_val_test, y_val_train, y_val_test进行训练和测试。主要函数如下所示。

x_val = np.array([x[0:3] for x in iris.data])y_val = np.array([x[3] for x in iris.data])hidden_layer_size = 10#生成一个一维随机数数组,范围为round(len(x_val)*0.8train_indices = np.random.choice(len(x_val), round(len(x_val)*0.8), replace = False)#创建一个不包含train_indices中数字的集合,并将其转换为数组test_indices = np.array(list(set(range(len(x_val))) - set(train_indices)))#print("Train Indexes\n",train_indices,test_indices)x_val_train = x_val[train_indices]x_val_test = x_val[test_indices]y_val_train = y_val[train_indices]y_val_test = y_val[test_indices]x_data = tf.placeholder(shape=[None, 3], dtype = tf.float32)y_target = tf.placeholder(shape = [None, 1], dtype = tf.float32) #了解None的使用#创建神经网络层A1 = tf.Variable(tf.random_normal(shape = [3,hidden_layer_size])) #输入到隐藏层b1 = tf.Variable(tf.random_normal(shape = [hidden_layer_size])) #输入到隐藏层的偏置A2 = tf.Variable(tf.random_normal(shape = [hidden_layer_size,1])) #隐藏层到输出层b2 = tf.Variable(tf.random_normal(shape=[1])) #隐藏层的偏置#生成模型hidden_output = tf.nn.relu(tf.add(tf.matmul(x_data,A1),b1))final_output = tf.nn.relu(tf.add(tf.matmul(hidden_output,A2),b2))cost = tf.reduce_mean(tf.square(y_target - final_output))learning_rate = 0.01model = tf.train.AdamOptimizer(learning_rate).minimize(cost)init = tf.global_variables_initializer()sess.run(init)#训练循环loss_vec = []test_loss = []epoch = 500for i in range(epoch):    #生成len(x_val_train)个随机数    rand_index = np.random.choice(len(x_val_train), size = batch_size)    #获取len(x_val_train)个数据及其3个输入节点    rand_x = x_val_train[rand_index]    #print(rand_index,rand_x)    rand_y = np.transpose([y_val_train[rand_index]])    sess.run(model, feed_dict = {x_data: rand_x, y_target: rand_y})    temp_loss = sess.run(cost, feed_dict = {x_data: rand_x, y_target : rand_y})    loss_vec.append(np.sqrt(temp_loss))    test_temp_loss = sess.run(cost, feed_dict = {x_data : x_val_test, y_target : np.transpose([y_val_test])})    test_loss.append(np.sqrt(test_temp_loss))    if (i+1)%50!=0:        print('Generation: ' + str(i+1) + '.loss = ' + str(temp_loss))    predict = tf.argmax(tf.add(tf.matmul(hidden_output,A2),b2), 1)    test = np.matrix('2  3  4')    pred = predict.eval(session = sess, feed_dict = {x_data : test})print("pred: ", pred)plt.plot(loss_vec, 'k-', label='Train Loss')plt.plot(test_loss, 'r--', label='Test Loss')plt.show()

另外,在这段代码中,hidden_output = tf.nn.relu(tf.add(tf.matmul(x_data,A1),b1))

我已经成功地在归一化数据后训练了我的模型。但我需要通过用户输入的数据来预测输出。

在这里,

test = np.matrix('2  3  4')pred = predict.eval(session = sess, feed_dict = {x_data : test})print("pred: ", pred)

我编写了这段代码来预测结果,但pred总是返回0。我也尝试了超过100个样本,仍然返回0。请问您能告诉我哪里出了问题吗?


回答:

总结

让我们来看一下

predict = tf.argmax(tf.add(tf.matmul(hidden_output,A2),b2), 1)

这(几乎)等于

predict = tf.argmax(final_output)

argmax 是主要问题。如果 final_output 是1-hot编码,那么 argmax 是有意义的,但 final_output 只是一个标量数组。

完整工作代码

假设您已经有了以下内容,这里是完整的工作代码

import numpy as npimport tensorflow as tfimport osimport urllib# 数据集IRIS_TRAINING = "iris_training.csv"IRIS_TRAINING_URL = "http://download.tensorflow.org/data/iris_training.csv"IRIS_TEST = "iris_test.csv"IRIS_TEST_URL = "http://download.tensorflow.org/data/iris_test.csv"# 如果训练和测试集不在本地,则下载它们if not os.path.exists(IRIS_TRAINING):  raw = urllib.urlopen(IRIS_TRAINING_URL).read()  with open(IRIS_TRAINING, "w") as f:    f.write(raw)if not os.path.exists(IRIS_TEST):  raw = urllib.urlopen(IRIS_TEST_URL).read()  with open(IRIS_TEST, "w") as f:    f.write(raw)training_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename=IRIS_TRAINING, target_dtype=np.int, features_dtype=np.float32)test_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename=IRIS_TEST, target_dtype=np.int, features_dtype=np.float32)x_val_train = training_set.data[:,:3]x_val_test = test_set.data[:,:3]y_val_train = training_set.data[:,3].reshape([-1,1])y_val_test = test_set.data[:,3].reshape([-1,1])x_data = tf.placeholder(shape=[None, 3], dtype = tf.float32)y_target = tf.placeholder(shape = [None, 1], dtype = tf.float32) #了解None的使用#创建神经网络层hidden_layer_size = 20A1 = tf.Variable(tf.random_normal(shape = [3,hidden_layer_size])) #输入到隐藏层b1 = tf.Variable(tf.random_normal(shape = [hidden_layer_size])) #输入到隐藏层的偏置A2 = tf.Variable(tf.random_normal(shape = [hidden_layer_size,1])) #隐藏层到输出层b2 = tf.Variable(tf.random_normal(shape = [1])) #隐藏层的偏置#生成模型hidden_output = tf.nn.relu(tf.add(tf.matmul(x_data,A1),b1))final_output = tf.add(tf.matmul(hidden_output,A2),b2)loss = tf.reduce_mean(tf.square(y_target - final_output))learning_rate = 0.01train = tf.train.AdamOptimizer(learning_rate).minimize(loss)init = tf.global_variables_initializer()sess = tf.Session()sess.run(init)#训练循环loss_vec = []test_loss = []epoch = 2000batch_size = 100def oneTrainingSession(epoch,loss_vec,test_loss,batch_size) :    rand_index = np.random.choice(len(x_val_train), size = batch_size)    rand_x = x_val_train #[rand_index,:]    rand_y = y_val_train #[rand_index,:]    temp_loss,_ = sess.run([loss,train], feed_dict = {x_data: rand_x, y_target : rand_y})    loss_vec.append(np.sqrt(temp_loss))    test_temp_loss = sess.run(loss, feed_dict = {x_data : x_val_test, y_target : y_val_test})    test_loss.append(np.sqrt(test_temp_loss))    if (i+1)%500 == 0:        print('Generation: ' + str(i+1) + '.loss = ' + str(temp_loss))for i in range(epoch):    oneTrainingSession(epoch,loss_vec,test_loss,batch_size)test = x_val_test[:3,:]print "测试值是"print testprint ""pred = sess.run(final_output, feed_dict = {x_data : test})print("pred: ", pred)

输出

Generation: 500.loss = 0.12768Generation: 1000.loss = 0.0389756Generation: 1500.loss = 0.0370268Generation: 2000.loss = 0.0361797测试值是[[ 5.9000001   3.          4.19999981] [ 6.9000001   3.0999999   5.4000001 ] [ 5.0999999   3.29999995  1.70000005]]('pred: ', array([[ 1.45187187],       [ 1.92516518],       [ 0.36887735]], dtype=float32))

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注