Модель MLP AI с Tensorflow выводит случайные вещи, требуется некоторая проверка кода - PullRequest
0 голосов
/ 17 мая 2019

Я создал модель класса MLP для изучения базы данных MNIST и функцию в классе под названием «.ask (image_file)» и протестировал ее несколько раз с одним и тем же файлом (файл изображения .png), но eval () печатал разные массивыкаждый раз в конце, а не близко равно либо.Кто-нибудь скажет мне, откуда это происходит, а также ... Мне нужен кто-то для проверки некоторого кода, когда я использую функцию ask (), я хочу убедиться, что она использует веса и смещения после обучения и нена самом деле не знаю, изменил ли тензорный поток изменения веса слоев и смещения .... Справка X)

Я попытался изменить исходный файл .png (который представляет собой просто черный фон с написанным на нем белым числом) итакже пытался дать AI больше эпох, чтобы учиться лучше?Я просто не знаю, что делать в этот момент: 'D

Вот данные, которые я использую, и сигмовидную функцию, которую я использую во всех слоях:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sigmoid=lambda x : tf.nn.sigmoid(x)

Здесьэто класс Layer:

class Layer():
    def __init__ (self,n_neurons,n_inputs,weights=None,biases=None,a_function=sigmoid):
        if weights==None:
            self.weights=tf.Variable(tf.random_normal([n_inputs, n_neurons]))
        if biases==None:
            self.biases=tf.Variable(tf.random_normal([n_neurons]))
        self.a_function=sigmoid
        self.n_neurons=n_neurons
        self.n_inputs=n_inputs
    def call(self,inputs):
        s=self.a_function(tf.add(tf.matmul(inputs,self.weights), self.biases))
        return s

Вот класс MLP:

class MLP():
    def __init__(self,layers=None):
        if layers!=None and type(layers)==list:
            self.layers=layers
            self.n_layers=len(layers)
        else:
            self.layers=[]
            self.n_layers=0

        self.weights={}
        self.weights_setup()
        self.biases={}
        self.biases_setup()

    def add_layer(self,new_layer):
        self.layers.append(new_layer)
        self.n_layers=self.n_layers+1

    def think(self,inputs):
        data=inputs
        for i in range(self.n_layers):
            data=self.layers[i].call(data)
        return data

    def weights_setup(self):
        self.weights={}
        if self.n_layers==0:
            return
        for i in range(self.n_layers):
            if i==self.n_layers-1:
                self.weights['out']=self.layers[i].weights
            else:
                self.weights['h'+str(i+1)]=self.layers[i].weights
    def biases_setup(self):
        self.biases={}
        if self.n_layers==0:
            return
        for i in range(self.n_layers):
            if i==self.n_layers-1:
                self.biases['out']=self.layers[i].biases
            else:
                self.biases['h'+str(i+1)]=self.layers[i].biases
    def ask(self,fichier,plot=False):
        image=image_translator(fichier)
        print(image)
        image=[image]
        request=tf.convert_to_tensor(image)
        result=self.think(request)
        initask = tf.initialize_all_variables()
        print(type(result))
        print(result)
        with tf.Session() as sessask:
            sessask.run(initask)
            print (result.eval())
        if plot==True:
            plt.figure()
            image=import_image(fichier)
            plt.imshow(image)
            plt.colorbar()
            plt.grid(False)
            plt.show()





    def train(self,mnist, n_epochs,learning_rate):
        X = tf.placeholder("float", [None, self.layers[0].n_inputs])
        Y = tf.placeholder("float", [None, self.layers[-1].n_neurons])
        learning_rate = learning_rate
        training_epochs = n_epochs
        batch_size = 100
        display_step = 1
        self.weights_setup()
        weights=self.weights
        self.biases_setup()
        biases=self.biases
        logits = self.think(X)
        loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y))
        optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
        train_op = optimizer.minimize(loss_op)
        init = tf.global_variables_initializer()
        with tf.Session() as sess:
            sess.run(init)

            # Training cycle
            for epoch in range(training_epochs):
                avg_cost = 0.
                total_batch = int(mnist.train.num_examples/batch_size)
                # Loop over all batches
                for i in range(total_batch):
                    batch_x, batch_y = mnist.train.next_batch(batch_size)
                    # Run optimization op (backprop) and cost op (to get loss value)
                    _, c = sess.run([train_op, loss_op], feed_dict={X: batch_x,
                                                            Y: batch_y})
                    # Compute average loss
                    avg_cost += c / total_batch
                # Display logs per epoch step
                if epoch % display_step == 0:
                    print("Epoch:", '%04d' % (epoch+1), "cost={:.9f}".format(avg_cost))
            print("Optimization Finished!")

            # Test model
            pred = tf.nn.softmax(logits)  # Apply softmax to logits
            correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(Y, 1))
            # Calculate accuracy
            accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
            print("Accuracy:", accuracy.eval({X: mnist.test.images, Y: mnist.test.labels}))

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

def import_image(fichier):
    img = Image.open(fichier).convert('L')
    WIDTH, HEIGHT = img.size
    data = list(img.getdata())
    data = [data[offset:offset+WIDTH] for offset in range(0, WIDTH*HEIGHT, WIDTH)]
    return data


def image_translator(nom):
    data=import_image(nom)
    image=[]
    for i in range(28):
        for j in range(28):
            pixel=int(data[i][j])/255
            image.append(pixel)
    return image

А вот модельный скрипт, который я использую:

Model=MLP()
layer1=Layer(256,784)
layer2=Layer(256,256)
layer3=Layer(10,256)
Model.add_layer(layer1)
Model.add_layer(layer2)
Model.add_layer(layer3)
Model.train(mnist,15,0.001)
Model.ask('Sans titre.jpg')

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

Model.ask('Sans titre.jpg')

Что является причиной случайной части в результатах, а также правильны ли классы выше (имеется в виду веса, используемые в.думаете () те, которые были изменены в результате обучения?)

...