[英]error when trying to run my tensorflow code
This is a follow up question from my latest post: Put input in a tensorflow neural network这是我最新帖子中的一个后续问题: 将输入放入 tensorflow 神经网络
I precoded a neural network using tensorflow with the MNIST dataset, and with the help of @FinnE was able to change a bit of my code, the two files are listed below:我使用 tensorflow 和 MNIST 数据集对神经网络进行了预编码,并且在 @FinnE 的帮助下能够更改我的一些代码,下面列出了这两个文件:
main.py:主要.py:
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
mnist=tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train=tf.keras.utils.normalize(x_train, axis=1)
x_test=tf.keras.utils.normalize(x_test, axis=1)
model=tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3)
val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss, val_acc)
model.save("num_reader.model")
new_model=tf.keras.models.load_model('num_reader.model')
predictions=new_model.predict([x_test])
print(predictions)
screen.py:屏幕.py:
import tensorflow as tf
import pygame
import sys
import numpy as np
from main import *
import main as nn
class Screen:
def __init__(self):
pygame.init()
#self.screen=pygame.display.set_mode((28,28),pygame.FULLSCREEN)
self.screen=pygame.display.set_mode((280,280))
self.array=[]
self.setArr()
self.bg_color=(250, 250,250)
self.ok=False
self.full=[]
self.done=False
print(new_model)
self.result=0
def runGame(self):
self.screen.fill(self.bg_color)
while True:
pygame.display.flip()
self._check_events()
self.draw()
if self.full != []:
break
def _check_events(self):
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_ESCAPE:
sys.exit()
if event.key==pygame.K_d:
self.done=True
self.decode()
print(len(self.full))
if event.key==pygame.K_c:
self.done=False
self.setArr()
self.screen.fill(self.bg_color)
if event.type==pygame.MOUSEBUTTONDOWN:
#print("mouseDown")
self.ok=True
elif event.type==pygame.MOUSEBUTTONUP:
self.ok=False
def setArr(self):
self.shortArr=[]
for y in range(28):
self.shortArr.append(0)
for x in range(28):
self.array.append(self.shortArr)
def draw(self):
if self.ok==True:
x,y=pygame.mouse.get_pos()
x=round(x/10)*10
y=round(y/10)*10
#print(x,y)
#print(self.array[int(x)//10][int(y)//10])
self.array[int(x)//10][int(y)//10]=1
pygame.draw.rect(self.screen, (0,0,0), pygame.Rect(x, y, 10, 10))
#print("draw")
def decode(self):
self.full=[]
for x in range(28):
for y in range(28):
self.full.append(self.array[x][y])
if __name__ == '__main__':
Sc=Screen()
Sc.runGame()
result = nn.new_model.predict(tf.keras.utils.normalize(np.array(Sc.full), axis=1))
print(result)
however I get the following error when the code is run.但是运行代码时出现以下错误。
Traceback (most recent call last):
File "C:\Users\user\Documents\Jake\machine learning\MNIST dataset SOLVED\screen.py", line 81, in <module>
result = nn.new_model.predict(tf.keras.utils.normalize(np.array(Sc.full), axis=1))
File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\keras\utils\np_utils.py", line 89, in normalize
l2 = np.atleast_1d(np.linalg.norm(x, order, axis))
File "<__array_function__ internals>", line 180, in norm
File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\linalg\linalg.py", line 2547, in norm
return sqrt(add.reduce(s, axis=axis, keepdims=keepdims))
numpy.AxisError: axis 1 is out of bounds for array of dimension 1
There is few problems.几乎没有问题。
you return flat array with 786 values but it needs 2D array 28x28 - and this makes problem with axis=1
in normalize
- you have to use self.array
instead of self.full
您返回具有 786 个值的平面数组,但它需要 28x28 的 2D 数组 - 这会导致axis=1
在normalize
中出现问题 - 您必须使用self.array
而不是self.full
you create array 28x28
but predict needs 1x28x28
- so it needs [self.array]
instead of `self.array您创建数组28x28
但预测需要1x28x28
- 所以它需要[self.array]
而不是 `self.array
result = nn.new_model.predict(tf.keras.utils.normalize(np.array([Sc.array]), axis=1))
np.argmax()
to get digit with the biggest probability.它返回所有数字的概率,您必须使用np.argmax()
来获得概率最大的数字。 Because predict()
can get list with many images so it returns list with many results - even if you check single image - and it needs [0]
to check result for first image.因为predict()
可以获得包含许多图像的列表,所以它返回包含许多结果的列表 - 即使您检查单个图像 - 它需要[0]
来检查第一张图像的结果。digit = np.argmax(result[0])
I think there is problem with data in array.我认为数组中的数据有问题。 You keep it as x,y
but numpy
uses y,x
( row, column
) (and the same is with matrix in math).您将其保留为x,y
但numpy
使用y,x
( row, column
)(数学中的矩阵也是如此)。 It needs self.array[y][x] = 1
instea self.array[x][y] = 1
它需要self.array[y][x] = 1
instea self.array[x][y] = 1
you import main
and this runs all code in main
and it trains model again at every start.您导入main
,这将运行main
中的所有代码,并在每次启动时再次训练 model 。 You don't have to import main
but only use load_model()
.您不必导入main
,只需使用load_model()
。
on my computer sometimes mouse.get_pos()
gives value 280
and this gives array[...][28]
, and this raises error because array has only [27]
.在我的计算机上,有时mouse.get_pos()
给出值280
,这给出了array[...][28]
,这会引发错误,因为 array 只有[27]
。 It needs to check x
, y
and convert 280
to 279
(or later convert 28
to 27
)它需要检查x
, y
并将280
转换为279
(或稍后将28
转换为27
)
you setArr()
is wrong.你setArr()
是错误的。 You append the same list self.shortArr
to self.array
but (this is popular problem in Python) it doesn't put copy of array but it puts reference to the same array - and finally when you change one value in row then it change them in all rows.你 append 相同的列表self.shortArr
到self.array
但是(这是 Python 中的常见问题)它没有放置数组的副本,但它引用了同一个数组 - 最后当你在行中更改一个值时它会改变它们在所有行中。
My full working code:我的完整工作代码:
screen.py
EDIT: I added right mouse to clear single pixel(s)编辑:我添加了鼠标右键清除单个像素
import pygame
import tensorflow as tf
import numpy as np
class Screen:
def __init__(self):
pygame.init()
#self.screen = pygame.display.set_mode((28,28),pygame.FULLSCREEN)
self.screen = pygame.display.set_mode((280,280))
self.bg_color = (250, 250,250)
self.array = []
self.set_arr()
self.ok = False # exit with prediction
self.done = False
#self.button = False
def run(self):
self.screen.fill(self.bg_color)
while not self.done:
pygame.display.flip()
self._check_events()
self.draw()
pygame.quit() # some systems need it to close window
return self.ok
def _check_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
# end program without OK
self.done = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
# end program without OK
self.done = True
if event.key == pygame.K_d:
# end program with OK
self.ok = True
self.done = True
if event.key == pygame.K_c:
# clear array and screen
self.set_arr()
self.screen.fill(self.bg_color)
#if event.type == pygame.MOUSEBUTTONDOWN:
# #print("mouseDown")
# self.button = True
#elif event.type == pygame.MOUSEBUTTONUP:
# self.button = False
def set_arr(self):
"""Create empty array 2D for image."""
self.array = [[0 for x in range(28)] for y in range(28)]
def draw(self):
buttons = pygame.mouse.get_pressed()
if buttons[0] or buttons[2]: # left or right button
#if self.button:
x0, y0 = pygame.mouse.get_pos()
if x0 >= 280:
x0 = 279
if y0 >= 280:
y0 = 279
x = int(round(x0/10)*10)
y = int(round(y0/10)*10)
try:
#self.array[int(x)//10][int(y)//10] = 1
if buttons[0]: # left draw
self.array[int(y)//10][int(x)//10] = 1
pygame.draw.rect(self.screen, (0,0,0), pygame.Rect(x, y, 10, 10))
if buttons[2]: # right clear
self.array[int(y)//10][int(x)//10] = 0
pygame.draw.rect(self.screen, (255,255,255), pygame.Rect(x, y, 10, 10))
except Exception as ex:
print('Exception:', ex)
print('Debug:', x0, y0, x, y, int(x)//10, int(y)//10)
#print("draw")
if __name__ == '__main__':
print('loading model ...')
model = tf.keras.models.load_model('num_reader.model')
print('starting screen')
screen = Screen()
ok = screen.run()
if not ok:
print('finish without prediction')
else:
print('--- predict as is ---')
arr = np.array([screen.array])
#print(arr.shape)
#print(arr[:,:2])
results = model.predict(arr)
print('results:', results)
digit = np.argmax(results[0])
print('digit:', digit)
print('--- predict normalized ---')
arr = tf.keras.utils.normalize(np.array([screen.array]), axis=1)
#print(arr.shape)
#print(arr[:,:2])
results = model.predict(arr)
print('results:', results)
digit = np.argmax(results[0])
print('digit:', digit)
train_model.py
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3)
val_loss, val_acc = model.evaluate(x_test, y_test)
print('val_loss:', val_loss)
print('val_acc :', val_acc)
#predictions = model.predict([x_test])
#print(predictions)
model.save("num_reader.model")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.