我创建了一个张量流网络,用于从该数据集中读取数据(注意:此数据集中的信息纯粹是出于测试目的而设计的,并非真实的):
并且我正在尝试构建一个张量流网络,旨在基本上预测'Exited'中的值柱 . 我的网络构造为采用11个输入,通过relu激活通过2个隐藏层(每个6个神经元),并使用sigmoid激活函数输出单个二进制值,以产生概率分布 . 我正在使用梯度下降优化器和均方误差成本函数 . 但是,在我的训练数据训练网络并预测我的测试数据之后,我的所有预测值都大于0.5意味着可能是真的,我不确定问题是什么:
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.2, random_state=101)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.fit_transform(X_test)
training_epochs = 200
n_input = 11
n_hidden_1 = 6
n_hidden_2 = 6
n_output = 1
def neuralNetwork(x, weights):
layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])
layer_1 = tf.nn.relu(layer_1)
layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])
layer_2 = tf.nn.relu(layer_2)
output_layer = tf.add(tf.matmul(layer_2, weights['output']), biases['output'])
output_layer = tf.nn.sigmoid(output_layer)
return output_layer
weights = {
'h1': tf.Variable(tf.random_uniform([n_input, n_hidden_1])),
'h2': tf.Variable(tf.random_uniform([n_hidden_1, n_hidden_2])),
'output': tf.Variable(tf.random_uniform([n_hidden_2, n_output]))
}
biases = {
'b1': tf.Variable(tf.random_uniform([n_hidden_1])),
'b2': tf.Variable(tf.random_uniform([n_hidden_2])),
'output': tf.Variable(tf.random_uniform([n_output]))
}
x = tf.placeholder('float', [None, n_input]) # [?, 11]
y = tf.placeholder('float', [None, n_output]) # [?, 1]
output = neuralNetwork(x, weights)
cost = tf.reduce_mean(tf.square(output - y))
optimizer = tf.train.AdamOptimizer().minimize(cost)
with tf.Session() as session:
session.run(tf.global_variables_initializer())
for epoch in range(training_epochs):
session.run(optimizer, feed_dict={x:X_train, y:y_train.reshape((-1,1))})
print('Model has completed training.')
test = session.run(output, feed_dict={x:X_test})
predictions = (test>0.5).astype(int)
print(predictions)
所有帮助表示赞赏!我一直在查看与我的问题有关的问题,但没有一个建议似乎有帮助 .
1 回答
Initial assumption: 我赢得了't access data from a personal link for security reasons. It'您有责任仅基于安全/持久性工件创建可重现的代码片段 .
但是,我可以确认您的代码是针对
keras.datasets.mnist
运行时发生的,只需稍加更改:每个示例都与标签0: odd
或1: even
相关联 .Short answer: 你搞砸了初始化 . 将
tf.random_uniform
更改为tf.random_normal
并将偏差设置为确定性0
.Actual answer: 理想情况下,您希望模型随机开始预测,接近
0.5
. 这将防止S形输出的饱和,并在训练的早期阶段产生大的梯度 .sigmoid的eq . 是
s(y) = 1/(1 + e**-y)
和s(y) = 0.5 <=> y = 0
. 因此,图层的输出y = w * x + b
必须为0
.如果您使用
StandardScaler
,那么您的输入数据遵循高斯分布,均值= 0.5,std = 1.0 . 您的参数必须支持此分发!但是,您已使用tf.random_uniform
初始化偏差,它从[0, 1)
间隔统一绘制值 .通过
0
开始偏见,y
将接近0
:所以你的偏见应该是:
这足以输出小于
0.5
的数字:Further corrections:
您的
neuralNetwork
函数不带biases
参数 . 它改为使用另一个范围中定义的那个,这似乎是一个错误 .您不应该将缩放器与测试数据相匹配,因为您将丢失列车中的统计数据,因为它违反了该数据块纯粹是观察的原则 . 做这个:
通过制作一些柚木,我设法达到了这个结果: