[英]error when trying to run my tensorflow code
这是我最新帖子中的一个后续问题: 将输入放入 tensorflow 神经网络
我使用 tensorflow 和 MNIST 数据集对神经网络进行了预编码,并且在 @FinnE 的帮助下能够更改我的一些代码,下面列出了这两个文件:
主要.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)
屏幕.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)
但是运行代码时出现以下错误。
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
几乎没有问题。
您返回具有 786 个值的平面数组,但它需要 28x28 的 2D 数组 - 这会导致axis=1
在normalize
中出现问题 - 您必须使用self.array
而不是self.full
您创建数组28x28
但预测需要1x28x28
- 所以它需要[self.array]
而不是 `self.array
result = nn.new_model.predict(tf.keras.utils.normalize(np.array([Sc.array]), axis=1))
np.argmax()
来获得概率最大的数字。 因为predict()
可以获得包含许多图像的列表,所以它返回包含许多结果的列表 - 即使您检查单个图像 - 它需要[0]
来检查第一张图像的结果。digit = np.argmax(result[0])
我认为数组中的数据有问题。 您将其保留为x,y
但numpy
使用y,x
( row, column
)(数学中的矩阵也是如此)。 它需要self.array[y][x] = 1
instea self.array[x][y] = 1
您导入main
,这将运行main
中的所有代码,并在每次启动时再次训练 model 。 您不必导入main
,只需使用load_model()
。
在我的计算机上,有时mouse.get_pos()
给出值280
,这给出了array[...][28]
,这会引发错误,因为 array 只有[27]
。 它需要检查x
, y
并将280
转换为279
(或稍后将28
转换为27
)
你setArr()
是错误的。 你 append 相同的列表self.shortArr
到self.array
但是(这是 Python 中的常见问题)它没有放置数组的副本,但它引用了同一个数组 - 最后当你在行中更改一个值时它会改变它们在所有行中。
我的完整工作代码:
screen.py
编辑:我添加了鼠标右键清除单个像素
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.