Создайте нейронную сеть в цикле For с Tensorflow - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь создать простой MLP в цикле for с Tensorflow из списка, содержащего требуемую структуру сети, например, struct = [100, 50, 20, 1].В этом списке 100 представляет размер ввода, а 1 - размер вывода.(Мне нужно это для приложения прогнозирования, но это не связано строго с моим вопросом.)

Я не видел подобного способа создания сети в Tensorflow вокруг.По причинам, которые частично меня избегают, люди, похоже, полагают, что лучше объявлять каждую переменную отдельно, например layer_1 = x1 * w1 + b1, чем layer_2 = x2 * w2 + b2.Является ли неправильным динамический способ создания сети, которую я использую в цикле for [for i in range (len (structure) -1):])?Мне кажется, что сеть работает нормально, и структура сети, показанная на тензорной доске, кажется правильной.

Как вы думаете, этот способ создания сети - это хорошо?Как вы думаете, есть ли какие-либо проблемы Tensorflow / Context Manager, в которые я попадаю, даже не подозревая об этом?

The network graph

Ссылка на график сети

import tensorflow as tf

class Model(object):

    def __init__(self, structure, lr=0.01):

        assert structure[-1] == 1

        input_size = structure[0]

        act_fun = tf.nn.tanh

        G = tf.Graph()

        with G.as_default():

            self.X = tf.placeholder(tf.float32, shape=[None, input_size])
            self.Y = tf.placeholder(tf.float32, shape=[None, 1])              

            X_out = self.X
            for i in range(len(structure)-1):
                from_, to = structure[i], structure[i+1]
                initializer = tf.variance_scaling_initializer()
                w = tf.Variable(initializer([from_, to]), dtype=tf.float32, name=f'W{i}')
                b = tf.Variable(tf.zeros(to), name=f'B{i}')

                if to != 1:
                    X_out = act_fun(tf.matmul(X_out, w) + b)
                else:
                    X_out = tf.matmul(X_out, w) + b

            self.forecast_layer = X_out
            self.loss = tf.losses.mean_squared_error(self.Y, self.forecast_layer)
            self.trainer = tf.train.GradientDescentOptimizer(lr).minimize(self.loss)
            self.init = tf.global_variables_initializer()

        self.session = tf.Session(graph=G)
        self.session.run(self.init)
        self.session.graph.finalize()



    def fit(self, X, Y):
        self.session.run(self.trainer, feed_dict={self.X:X, self.Y:Y})



    def forecast(self, X):
        return self.forecast_layer.eval(feed_dict={self.X:X}, session=self.session)



    def evaluate_loss(self, X, Y):
        return self.loss.eval(feed_dict={self.Y:Y, self.forecast_layer:self.forecast(X)}, session=self.session)


M = Model([100, 50, 20, 1], lr=0.001)

1 Ответ

0 голосов
/ 18 июня 2019

Это нормально, хотя я бы использовал tf.layers.dense:

X_out = self.X
layers = [50, 20, 1]
for layer_size in layers:
    X_out = tf.layers.dense(X_out, layer_size, activation=act_fun if x != 1 else None)

Примечание:

Предупреждение: ЭТА ФУНКЦИЯ УСТАРЕЛА.Он будет удален в следующей версии.Инструкции по обновлению: используйте вместо этого keras.layers.dense.

...