Стоимость не меняется в 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

Я пробовал много вещей. Первоначально моя функция стоимости была обычной кросс-энтропией, но, поскольку мои данные оценивались в виде вещественных чисел, я изменил ее на среднеквадратичную ошибку. Я также пытался изменить оптимизатор, и это ничего не изменило. Проблема в том, что я плохо проектирую сеть и использую неправильную архитектуру, или это что-то другое?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
59
1

Ответы 1

Начальные веса 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())

Я только что попробовал ваш код для инициализации тета, и это не имело никакого значения. Выход всегда остается одним и тем же. Нужно ли мне использовать определенную функцию стоимости или что-то в этом роде?

Ronan Venkat 27.02.2019 19:28

В этом случае это могут быть данные, но я не уверен в цели сети или данных, которые вы используете. Вы сказали, что это текст? В этом случае изучите встраивания слов. И метки не могут быть текстовыми, их нужно закодировать сразу для классификации.

A Kruger 27.02.2019 20:24

Данные представляют собой файл csv, который я преобразовал в массив numpy. В файле много текста, но я выделил числовые столбцы и преобразовал их в float32, чтобы они были обычными числами. На самом деле у меня нет цели для сети, я просто хочу выучить язык, и у меня уже был файл .csv, который я уже импортировал из github. Может ли проблема заключаться в том, что я не использую масштабирование функций? Или может быть у меня действительно плохая сетевая архитектура (1:10:1, так как у меня был только набор регрессионных данных в моей рабочей области, и я не очень хотел импортировать новый)?

Ronan Venkat 27.02.2019 20:54

Другие вопросы по теме