Я новичок в тензорном потоке и нейронных сетях.
В приведенном ниже коде все работает нормально. Однако как только я реализую функцию tf.sigmoid, раскомментировав # X21 = tf.sigmoid (X21); Я получаю странные результаты, где все мои прогнозы равны 1. Есть ли причина, по которой это может происходить?
Обратите внимание, что я прогнозирую цены на жилье в тысячах.
# Set model weights
b1_1 = tf.cast(tf.Variable(np.random.randn(), name = "bias"),tf.float64)
b1_2 = tf.cast(tf.Variable(np.random.randn(), name = "bias"),tf.float64)
b2_1 = tf.cast(tf.Variable(np.random.randn(), name = "bias"),tf.float64)
W1_1 = tf.cast(tf.Variable(np.random.randn(train_X.shape[1], 1), name = "bias"),tf.float64)
W1_2 = tf.cast(tf.Variable(np.random.randn(train_X.shape[1], 1), name = "bias"),tf.float64)
W2_1 = tf.cast(tf.Variable(np.random.randn(2, 1), name = "bias"),tf.float64)
X11 = tf.add(tf.matmul(train_X,W1_1),b1_1)
X12 = tf.add(tf.matmul(train_X,W1_2),b1_2)
X21 = tf.add(tf.matmul(tf.squeeze(tf.transpose(tf.stack((X11,X12)))),W2_1),b2_1)
#X21 = tf.sigmoid(X21)
# placeholders for a tensor that will be always fed.
Y = tf.placeholder('float64', shape = [47, 1])
cost = (tf.reduce_sum(tf.pow(X21-Y, 2))/(2*n_samples))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()
# Start training
with tf.Session() as sess:
# Run the initializer
sess.run(init)
# Fit all training data
for epoch in range(training_epochs):
#for (x, y) in zip(train_X, train_Y):
sess.run(optimizer, feed_dict = {Y: train_Y})
# Display logs per epoch step
if (epoch+1) % display_step == 0:
c = sess.run(cost, feed_dict = {Y: train_Y})
print("Epoch:", '%04d' % (epoch+1), "cost = ", "{:.9f}".format(c))
print("Optimization Finished!")
training_cost = sess.run(cost, feed_dict = {Y: train_Y})
print("Training cost = ", training_cost)
line = sess.run(X21,feed_dict = {Y: train_Y})
Машинное обучение требует больших математических затрат, а алгоритмы очень чувствительны к данным. Если вы хотите создать быстрое решение для машинного обучения, я предлагаю вам использовать какой-либо API более высокого уровня (в последних версиях Tensorflow есть несколько довольно хороших API высокого уровня). Но если вы хотите реализовать свои собственные алгоритмы машинного обучения, вам следует уделять больше внимания лежащей в основе математике и убедиться, что вы понимаете, почему каждый ваш шаг необходим.
Мой плохой, tanh производит значения из (-1, 1), сигмоид производит (0, 1)
О, да! Извини, у меня тоже плохо. Итак, мне нужно спрогнозировать цены на жилье, исходя из размера комнаты и площади. Как вы думаете, я могу улучшить прогнозы? В каких областях приведенного выше кода я могу поиграть, чтобы улучшить его?
Ваш выходной слой не нуждается в функции активации (особенно, если вы собираетесь прогнозировать фактические цены). Но ваши скрытые слои могут выиграть. Попробуйте добавить сигмоид к X11 и X12 и оставить X21 как есть. Попробуйте переключиться с простого оптимизатора SGD на Adam или RPSProp. Другая идея - разделить цены, которые вы хотите спрогнозировать, на несколько ценовых категорий или классов и вместо того, чтобы пытаться предсказать точные цены, попытайтесь предсказать категорию.
Большое спасибо за предложение. AdamOptimizer действительно работал. Раньше я постоянно недооценивал некоторые аспекты, но использование AdamOptimizer действительно решило проблему.
Я пытаюсь понять, в чем разница между этими оптимизаторами и какой из них лучше всего использовать в той или иной ситуации. Я изучаю веб-сайт TF, но если вы знаете, где это объясняется лучше и понятнее, дайте мне знать. Кроме того, я попытался изменить скрытый слой с помощью сигмоида, но это дало все прогнозы как 1,422. Есть идеи, почему это может происходить?
Сигмоидальная функция по своему определению производит значения от -1 до 1. И предназначена для использования с данными, нормализованными до значения от -1 до 1, потому что вне этого диапазона она асимптотически приближается либо к минимуму, либо к максимуму. Таким образом, если вы введете в него большие положительные значения, вы получите все единицы (или, скорее, почти единицы).