Ошибка Tensorflow: Попытка использовать неинициализированное значение beta1_power_18 - PullRequest
0 голосов
/ 25 апреля 2018

Это мой код в тензорном потоке для простой нейронной сети:

import tensorflow as tf
import numpy as np

class Model:
    def __init__(self,input_neuron=2,hidden_neuron=10,output_neuron=2):
        self.input_neuron = input_neuron
        self.hidden_neuron = hidden_neuron
        self.output_neuron = output_neuron
        self.x = tf.placeholder(tf.float32,[None,self.input_neuron])
        self.y = tf.placeholder(tf.float32,[None,self.output_neuron])
        self.model = self.graph()
        self.sess = tf.InteractiveSession()
        self.sess.run(tf.global_variables_initializer())



    @staticmethod
    def one_hot_encode(y):
        y_ = np.zeros((len(y),2))
        for i in range(len(y)):
            y_[i,y[i][0]]=1

        return y_

    def graph(self):
        w1=tf.Variable(tf.random_normal([self.input_neuron,self.hidden_neuron]))
        l1=tf.nn.relu(tf.matmul(self.x,w1))
        w2=tf.Variable(tf.random_normal([self.hidden_neuron,self.output_neuron]))
        l2=tf.matmul(l1,w2)

        return l2

    def train(self,xTrain,yTrain):
        yTrain = self.one_hot_encode(yTrain)
        loss = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits_v2(
                             logits=self.model,labels=self.y))
        train = tf.train.AdamOptimizer(0.1).minimize(loss)
        for epoch in range(100):
            self.sess.run(train,feed_dict={self.x:xTrain,self.y:yTrain})

    def predict(self,xTest):
        prediction = tf.argmax(self.model)
        return self.sess.run(prediction,feed_dict={x:xTest}) 

Когда я запускаю это с помощью:

model = Model()
xTrain = np.array([[0,0],[0,1],[1,0],[1,1]])
yTrain = np.array([[0],[1],[1],[0]])
model.train(xTrain,yTrain)

Я получаю эту ошибку:

FailedPreconditionError (см. Выше для отслеживания): попытка использовать неинициализированное значение beta1_power_18

Что я делаю не так?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы делаете self.sess.run(tf.global_variables_initializer()) в __init__ вашего Model класса, но только в методе train() вы устанавливаете tf.train.AdamOptimizer().Последний также создает некоторые переменные, которые должны быть инициализированы.Переместите строку

self.sess.run(tf.global_variables_initializer())

сразу после

train = tf.train.AdamOptimizer(0.1).minimize(loss)

, и она будет работать.

Полный код (проверено):

import tensorflow as tf
import numpy as np

class Model:
    def __init__(self,input_neuron=2,hidden_neuron=10,output_neuron=2):
        self.input_neuron = input_neuron
        self.hidden_neuron = hidden_neuron
        self.output_neuron = output_neuron
        self.x = tf.placeholder(tf.float32,[None,self.input_neuron])
        self.y = tf.placeholder(tf.float32,[None,self.output_neuron])
        self.model = self.graph()
        self.sess = tf.InteractiveSession()

    @staticmethod
    def one_hot_encode(y):
        y_ = np.zeros((len(y),2))
        for i in range(len(y)):
            y_[i,y[i][0]]=1

        return y_

    def graph(self):
        w1=tf.Variable(tf.random_normal([self.input_neuron,self.hidden_neuron]))
        l1=tf.nn.relu(tf.matmul(self.x,w1))
        w2=tf.Variable(tf.random_normal([self.hidden_neuron,self.output_neuron]))
        l2=tf.matmul(l1,w2)

        return l2

    def train(self,xTrain,yTrain):
        yTrain = self.one_hot_encode(yTrain)
        loss = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits_v2(
                             logits=self.model,labels=self.y))
        train = tf.train.AdamOptimizer(0.1).minimize(loss)
        self.sess.run(tf.global_variables_initializer())

        for epoch in range(100):
            self.sess.run(train,feed_dict={self.x:xTrain,self.y:yTrain})
        print("Training done!")

    def predict(self,xTest):
        prediction = tf.argmax(self.model)
        return self.sess.run(prediction,feed_dict={x:xTest})

model = Model()
xTrain = np.array([[0,0],[0,1],[1,0],[1,1]])
yTrain = np.array([[0],[1],[1],[0]])
model.train(xTrain,yTrain)

Исходя из вашего комментария, если вы не хотите повторно инициализировать всю сеть при каждом вызове метода train(), то вам нужно инициализировать сеть по __init__() метод и используйте tf.report_uninitialized_variables(), чтобы получить все неинициализированные инициализированные только те, что в train().Для этого я написал метод initialize_uninitialized(), основанный на этом ответе на вопрос Сальвадора Дали .

Полный код (проверено):

import tensorflow as tf
import numpy as np

class Model:
    def __init__(self,input_neuron=2,hidden_neuron=10,output_neuron=2):
        self.input_neuron = input_neuron
        self.hidden_neuron = hidden_neuron
        self.output_neuron = output_neuron
        self.x = tf.placeholder(tf.float32,[None,self.input_neuron])
        self.y = tf.placeholder(tf.float32,[None,self.output_neuron])
        self.model = self.graph()
        self.sess = tf.InteractiveSession()
        self.sess.run(tf.global_variables_initializer())

    @staticmethod
    def one_hot_encode(y):
        y_ = np.zeros((len(y),2))
        for i in range(len(y)):
            y_[i,y[i][0]]=1

        return y_

    def graph(self):
        w1=tf.Variable(tf.random_normal([self.input_neuron,self.hidden_neuron]))
        l1=tf.nn.relu(tf.matmul(self.x,w1))
        w2=tf.Variable(tf.random_normal([self.hidden_neuron,self.output_neuron]))
        l2=tf.matmul(l1,w2)

        return l2

    def initialize_uninitialized( self ):
        uninitialized_variables = [v for v in tf.global_variables()
            if v.name.split(':')[0] in set(self.sess.run(tf.report_uninitialized_variables())) ]
        self.sess.run( tf.variables_initializer( uninitialized_variables ) )

    def train(self,xTrain,yTrain):
        yTrain = self.one_hot_encode(yTrain)
        loss = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits_v2(
                             logits=self.model,labels=self.y))
        train = tf.train.AdamOptimizer(0.1).minimize(loss)
        self.initialize_uninitialized()

        for epoch in range(100):
            self.sess.run(train,feed_dict={self.x:xTrain,self.y:yTrain})
        print("Training done!")

    def predict(self,xTest):
        prediction = tf.argmax(self.model)
        return self.sess.run(prediction,feed_dict={x:xTest}) 

model = Model()
xTrain = np.array([[0,0],[0,1],[1,0],[1,1]])
yTrain = np.array([[0],[1],[1],[0]])
model.train(xTrain,yTrain)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...