Перестройте Keras-модель в Tensorflow - PullRequest
0 голосов
/ 29 июня 2019

Я новичок в Tensorflow и пытаюсь перестроить простую сеть, которую я построил в Keras (бэкэнд TF), с Tensorflows Python API. Это простой аппроксиматор функции (z = sin (x + y)).

Я пробовал разные архитектуры, оптимизаторы и скорости обучения, но у меня не получается обучить новую сеть. Однако, на мой взгляд, сети кажутся идентичными. Оба получают одинаковые векторы функций и метки:

# making training data
start = 0
end = 2*np.pi
samp = 1000
num_samp = samp**2
step = end / samp

x_train  = np.arange(start, end, step)
y_train  = np.arange(start, end, step)

data = np.array(np.meshgrid(x_train,y_train)).T.reshape(-1,2)
z_label = np.sin(data[:,0] + data[:,1])

Вот модель Keras:

#start model
model = Sequential()

#stack layers
model.add(Dense(units=128, activation='sigmoid', input_dim=2, name='dense_1'))
model.add(Dense(units=64, activation='sigmoid', input_dim=128, name='dense_2'))
model.add(Dense(units=1, activation='linear', name='output'))

#compile model
model.compile(loss='mean_squared_error',
              optimizer='sgd',
              metrics=['accuracy'])

checkpointer = ModelCheckpoint(filepath='./weights/weights.h5',
                               verbose=1, save_best_only=True)

tensorboard = TensorBoard(log_dir="logs/{}".format(time()))

model.fit(data, z_label, epochs=20, batch_size=32,
          shuffle='true',validation_data=(data_val, z_label_val),
          callbacks=[checkpointer, tensorboard])

Вот новая сеть, построенная с использованием Tensorflows Python API:

# hyperparameter
n_inputs = 2
n_hidden1 = 128
n_hidden2 = 64
n_outputs = 1
learning_rate = 0.01

# construction phase
X = tf.placeholder(tf.float32, shape=(None, n_inputs), name='input')
y = tf.placeholder(tf.float32, shape=(None), name="target")

hidden1 = tf.layers.dense(X, n_hidden1, name="hidden1", activation=tf.nn.sigmoid)
hidden2 = tf.layers.dense(hidden1, n_hidden2, name="hidden2", activation=tf.nn.sigmoid)
logits = tf.layers.dense(hidden2, n_outputs, activation='linear', name='output')

loss = tf.reduce_mean(tf.square(logits - y),  name='loss')

optimizer = tf.train.GradientDescentOptimizer(learning_rate)

training_op = optimizer.minimize(loss, name='train')

init = tf.global_variables_initializer()

saver = tf.train.Saver()

# --- execution phase ---
n_epochs = 40
batch_size = 32
n_batches = int(num_samp/batch_size)

with tf.Session() as sess:

    init.run()

    for epoch in range(n_epochs):
        print("Epoch: ", epoch, " Running...")
        loss_arr = np.array([])

        for iteration in range( n_batches ):
            start = iteration * batch_size
            end = start + batch_size

            sess.run(training_op, feed_dict={X: data[start:end], y: z_label[start:end] })
            loss_arr = np.append(loss_arr, loss.eval(feed_dict={X: data[start:end, :], y: z_label[start:end]}))

        mean_loss = np.mean(loss_arr)
        print("Epoch: ", epoch, " Calculated ==> Loss: ", mean_loss)

В то время как модель Keras обучается правильно с уменьшающимися потерями и правильными результатами испытаний, новая модель сходится довольно быстро и прекращает обучение. Соответственно результаты совершенно бесполезны.

Я неправильно строю / обучаю модель или Керас делает что-то на заднем плане, о чем я не знаю?

1 Ответ

0 голосов
/ 01 июля 2019

Решил эту проблему. Проблема заключалась в форме вектора метки. Это был лежачий вектор с формой (1000000,). В то время как Keras, очевидно, способен работать с различными формами выходных и меточных векторов, Tensorflow неправильно инициализировал заполнитель и функцию потерь

loss = tf.reduce_mean(tf.square(logits - y),  name='loss')

больше не имело смысла, и поэтому тренировка не удалась. Добавление

z_label = z_label.reshape(-1,1)

изменил вектор метки до (1000000, 1) и решил его. В качестве альтернативы можно указать форму заполнителя более точно

y = tf.placeholder(tf.float32, shape=(None,1), name="target")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...