繁体   English   中英

尝试运行我的 tensorflow 代码时出错

[英]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

几乎没有问题。

  1. 您返回具有 786 个值的平面数组,但它需要 28x28 的 2D 数组 - 这会导致axis=1normalize中出现问题 - 您必须使用self.array而不是self.full

  2. 您创建数组28x28但预测需要1x28x28 - 所以它需要[self.array]而不是 `self.array

result = nn.new_model.predict(tf.keras.utils.normalize(np.array([Sc.array]), axis=1))    
  1. 它返回所有数字的概率,您必须使用np.argmax()来获得概率最大的数字。 因为predict()可以获得包含许多图像的列表,所以它返回包含许多结果的列表 - 即使您检查单个图像 - 它需要[0]来检查第一张图像的结果。
digit = np.argmax(result[0])
  1. 我认为数组中的数据有问题。 您将其保留为x,ynumpy使用y,xrow, column )(数学中的矩阵也是如此)。 它需要self.array[y][x] = 1 instea self.array[x][y] = 1

  2. 您导入main ,这将运行main中的所有代码,并在每次启动时再次训练 model 。 您不必导入main ,只需使用load_model()

  3. 在我的计算机上,有时mouse.get_pos()给出值280 ,这给出了array[...][28] ,这会引发错误,因为 array 只有[27] 它需要检查xy并将280转换为279 (或稍后将28转换为27

  4. setArr()是错误的。 你 append 相同的列表self.shortArrself.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM