以下代码具有令人讨厌的特征,即使“出”的每一行都相同。我正在尝试将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})
答案 0 :(得分:0)
可能是因为损失函数是均方误差。如果您要进行分类,则应该使用交叉熵损失
答案 1 :(得分:0)
您的损失为penalty = tf.reduce_sum((sigmoid3 - y)**2)
,这是批量预测与一批值之间的平方差。
您的网络输出(sigmoid3
)是形状为[?, 4]
的张量,y
(我想)也是形状为[?, 4]
的张量。
平方差因此具有[?, 4]
的形状。
这意味着tf.reduce_sum
的计算顺序如下:
[?]
的张量?
表示)产生的标量值(形状()
)就是损失值。可能您不希望这种行为(批次尺寸上的总和),并且正在寻找批次上的均方误差:
penalty = tf.reduce_mean(tf.squared_difference(sigmoid3, y))