我刚开始学习机器学习。我正在研究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))