我试图在tensorflow中构建神经网络以更好地学习该库,而我的损失值没有改变。这是我的代码:
import tensorflow as tf
import numpy as np
import pandas as pd
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
all_data = pd.read_csv('/projects/data/testfile.csv')
all_data = all_data.values
size_layer1 = 1
size_layer2 = 10
size_layer3 = 1
labels = all_data[:, 9]; labels = tf.convert_to_tensor(labels, np.float32); labels = tf.reshape(labels, [985, 1])
data = all_data[:, 6]; data = tf.convert_to_tensor(data, np.float32)
theta1 = tf.Variable(tf.zeros([size_layer2, size_layer1])); theta1 = tf.reshape(theta1, [10, 1])
theta2 = tf.Variable(tf.zeros([size_layer3, size_layer2])); theta2 = tf.reshape(theta2, [1, 10])
a1 = data; a1 = tf.reshape(a1, [1, 985])
z2 = tf.matmul(theta1, a1)
a2 = tf.nn.relu(z2)
z3 = tf.matmul(theta2, a2)
a3 = tf.nn.sigmoid(z3)
h = tf.transpose(a3)
cost = tf.losses.mean_squared_error(labels, h)
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(10):
sess.run(train)
print(sess.run(cost))
我的整个数据集是985x12,但是大多数列都是文本,因此我将两列隔离。我知道神经网络不应该像这样使用,它具有1:10:1节点系统和实数标签,但是我并不是在尝试优化网络,而只是学习语言。而且我知道我应该使用特征缩放/均值归一化,但是正如我所说,我并不是真正地在尝试优化神经网络。这是我的输出:
73948990000.0
73948990000.0
73948990000.0
73948990000.0
73948990000.0
73948990000.0
73948990000.0
73948990000.0
73948990000.0
73948990000.0
我已经尝试了很多东西。最初,我的成本函数是普通的交叉熵,但是由于我的数据是实数值,因此将其更改为均方误差。我还尝试过更改优化器,但它没有任何改变。是我没有很好地设计网络并且使用的体系结构不好的问题,还是其他问题?
最佳答案
初始权重theta1
和theta2
是零数组,不能用于训练。权重用于计算在训练过程中更新权重的增量值,这将使增量为零,因此权重不会改变。同样,如果所有权重都具有相同的值(而不是零),则它们将具有相同的增量,这也会妨碍学习。因此,初始权重必须是随机数。
尝试使用此方法初始化随机权重:
theta1 = tf.get_variable('theta1', shape=(size_layer2, size_layer1), initializer=tf.contrib.layers.xavier_initializer())
theta2 = tf.get_variable('theta2', shape=(size_layer3, size_layer2), initializer=tf.contrib.layers.xavier_initializer())