Я создал модель класса 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')
Что является причиной случайной части в результатах, а также правильны ли классы выше (имеется в виду веса, используемые в.думаете () те, которые были изменены в результате обучения?)