TensorFlow代码未给出预期结果

时间:2019-01-28 18:19:00

标签: tensorflow

以下代码具有令人讨厌的特征,即使“出”的每一行都相同。我正在尝试将Xtrain中的k时间序列分类为[1,0,0,0],[0,1,0,0],[0,0,1,0]或[0,0,0,1 ],根据生成它们的方式(通过四种随机算法之一)。有人知道为什么吗?谢谢!

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import copy

n = 100
m = 10
k = 1000
hidden_layers = 50
learning_rate = .01
training_epochs = 10000

Xtrain = []
Xtest = []
Ytrain = []
Ytest = []

# ... fill variables with data ..

x = tf.placeholder(tf.float64,shape = (k,1,n,1))
y = tf.placeholder(tf.float64,shape = (k,1,4))

conv1_weights = 0.1*tf.Variable(tf.truncated_normal([1,m,1,hidden_layers],dtype = tf.float64))
conv1_biases = tf.Variable(tf.zeros([hidden_layers],tf.float64))

conv = tf.nn.conv2d(x,conv1_weights,strides = [1,1,1,1],padding = 'VALID')
sigmoid1 = tf.nn.sigmoid(conv + conv1_biases)

s = sigmoid1.get_shape()
sigmoid1_reshape = tf.reshape(sigmoid1,(s[0],s[1]*s[2]*s[3]))

sigmoid2 = tf.nn.sigmoid(tf.layers.dense(sigmoid1_reshape,hidden_layers))
sigmoid3 = tf.nn.sigmoid(tf.layers.dense(sigmoid2,4))

penalty = tf.reduce_sum((sigmoid3 - y)**2)
train_op = tf.train.AdamOptimizer(learning_rate).minimize(penalty)

model = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(model)
    for i in range(0,training_epochs):
        sess.run(train_op,{x: Xtrain,y: Ytrain})

    out = sigmoid3.eval(feed_dict = {x: Xtest})

2 个答案:

答案 0 :(得分:0)

可能是因为损失函数是均方误差。如果您要进行分类,则应该使用交叉熵损失

答案 1 :(得分:0)

您的损失为penalty = tf.reduce_sum((sigmoid3 - y)**2),这是批量预测与一批值之间的平方差。

您的网络输出(sigmoid3)是形状为[?, 4]的张量,y(我想)也是形状为[?, 4]的张量。

平方差因此具有[?, 4]的形状。

这意味着tf.reduce_sum的计算顺序如下:

  1. 平方差的第二维上的总和,产生形状为[?]的张量
  2. 第一维上的总和(批次大小,此处用?表示)产生的标量值(形状())就是损失值。

可能您不希望这种行为(批次尺寸上的总和),并且正在寻找批次上的均方误差:

penalty = tf.reduce_mean(tf.squared_difference(sigmoid3, y))