Python 元组索引超出范围,Tensorflow

Python 元组索引超出范围,Tensorflow,python,tensorflow,machine-learning,Python,Tensorflow,Machine Learning,这就是模型。这是一个基本的tensorflow模型,它拍摄一个数字的图片,告诉你它是什么数字。 *我知道python中的索引从0开始。我遇到的问题是这行代码“model.fit(np.array(test),np.array(num))”。阅读下面的代码了解更多信息* import keras import tensorflow as tf import matplotlib.pyplot as plt import numpy as np mnist = tf.keras.datasets.

这就是模型。这是一个基本的tensorflow模型,它拍摄一个数字的图片,告诉你它是什么数字。 *我知道python中的索引从0开始。我遇到的问题是这行代码“model.fit(np.array(test),np.array(num))”。阅读下面的代码了解更多信息*

import keras
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)
for train in range(len(x_train)):
    for row in range(28):
        for x in range(28):
            if x_train[train][row][x] != 0:
                x_train[train][row][x] = 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=5)
model.save('epic_num_reader.model')
print("Model saved")
在以下代码中,“用户列车”功能给出了错误。特别是行“model.fit(np.array(test)、np.array(num))”。代码将弹出一个框,让您可以绘制一个数字,单击空格键后,模型将尝试找出您绘制的内容。我想让你画一些东西,然后用你画的东西训练模型

import sys, os, random
stdout = sys.__stdout__
stderr = sys.__stderr__
sys.stdout = open(os.devnull,'w')
sys.stderr = open(os.devnull,'w')
import pygame
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
from tkinter import *
from tkinter import messagebox
sys.stdout = stdout
sys.stderr = stderr

class pixel(object):
def __init__(self, x, y, width, height):
    self.x = x
    self.y = y
    self.width = width
    self.height = height
    self.color = (255,255,255)
    self.neighbors = []

def draw(self, surface):
    pygame.draw.rect(surface, self.color, (self.x, self.y, self.x + self.width, self.y + self.height))

def getNeighbors(self, g):
    # Get the neighbours of each pixel in the grid, this is used for drawing thicker lines
    j = self.x // 20 # the var i is responsible for denoting the current col value in the grid
    i = self.y // 20 # the var j is responsible for denoting thr current row value in the grid
    rows = 28
    cols = 28

    # Horizontal and vertical neighbors
    if i < cols - 1:  # Right
        self.neighbors.append(g.pixels[i + 1][j])
    if i > 0:  # Left
        self.neighbors.append(g.pixels[i - 1][j])
    if j < rows - 1:  # Up
        self.neighbors.append(g.pixels[i][j + 1])
    if j > 0:  # Down
        self.neighbors.append(g.pixels[i][j - 1])

    # Diagonal neighbors
    if j > 0 and i > 0:  # Top Left
        self.neighbors.append(g.pixels[i - 1][j - 1])

    if j + 1 < rows and i > -1 and i - 1 > 0:  # Bottom Left
        self.neighbors.append(g.pixels[i - 1][j + 1])

    if j - 1 < rows and i < cols - 1 and j - 1 > 0:  # Top Right
        self.neighbors.append(g.pixels[i + 1][j - 1])

    if j < rows - 1 and i < cols - 1:  # Bottom Right
        self.neighbors.append(g.pixels[i + 1][j + 1])


class grid(object):
pixels = []

def __init__(self, row, col, width, height):
    self.rows = row
    self.cols = col
    self.len = row * col
    self.width = width
    self.height = height
    self.generatePixels()
    pass

def draw(self, surface):
    for row in self.pixels:
        for col in row:
            col.draw(surface)

def generatePixels(self):
    x_gap = self.width // self.cols
    y_gap = self.height // self.rows
    self.pixels = []
    for r in range(self.rows):
        self.pixels.append([])
        for c in range(self.cols):
            self.pixels[r].append(pixel(x_gap * c, y_gap * r, x_gap, y_gap))

    for r in range(self.rows):
        for c in range(self.cols):
            self.pixels[r][c].getNeighbors(self)

def clicked(self, pos): #Return the position in the grid that user clicked on
    try:
        t = pos[0]
        w = pos[1]
        g1 = int(t) // self.pixels[0][0].width
        g1 = int(t) // self.pixels[0][0].width
        g2 = int(w) // self.pixels[0][0].height

        return self.pixels[g2][g1]
    except:
        pass

def convert_binary(self):
    li = self.pixels

    newMatrix = [[] for x in range(len(li))]

    for i in range(len(li)):
        for j in range(len(li[i])):
            if li[i][j].color == (255,255,255):
                newMatrix[i].append(0)
            else:
                newMatrix[i].append(1)

    mnist = tf.keras.datasets.mnist
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_test = tf.keras.utils.normalize(x_test, axis=1)
    for row in range(28):
        for x in range(28):
            x_test[0][row][x] = newMatrix[row][x]

    return x_test[:1]


def guess(li):
    model = tf.keras.models.load_model('epic_num_reader.model')

    predictions = model.predict(li)
    print(predictions[0])
    t = (np.argmax(predictions[0]))
    print("I predict this number is a:", t)
    window = Tk()
    window.withdraw()
    messagebox.showinfo("Prediction", "I predict this number is a: " + str(t))
    window.destroy()
    #plt.imshow(li[0], cmap=plt.cm.binary)
    #plt.show()


############################

### Function with error ####
def user_train(test, num):
    model = tf.keras.models.load_model('epic_num_reader.model')
    test = np.array(test)
    test = np.reshape(test, (28,28))
    model.fit(np.array(test), np.array(num))
    model.save('epic_num_reader.model')
############################

############################


def main():
    run = True
    while run:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    li = g.convert_binary()
                    guess(li)
                    g.generatePixels()
                elif event.key == pygame.K_0:
                    test = g.convert_binary()
                    user_train(test, 0)
                    g.generatePixels()

            if pygame.mouse.get_pressed()[0]:

                pos = pygame.mouse.get_pos()
                clicked = g.clicked(pos)
                clicked.color = (0,0,0)
                for n in clicked.neighbors:
                    n.color = (0,0,0)

            if pygame.mouse.get_pressed()[2]:
                try:
                    pos = pygame.mouse.get_pos()
                    clicked = g.clicked(pos)
                    clicked.color = (255,255,255)
                except:
                    pass

        g.draw(win)
        pygame.display.update()

pygame.init()
width = height = 560
win = pygame.display.set_mode((width, height))
pygame.display.set_caption("Number Guesser")
g = grid(28, 28, width, height)
main()

pygame.quit()
quit()
导入系统、操作系统、随机
标准输出=系统__
stderr=sys.\u stderr__
sys.stdout=open(os.devnull,'w')
sys.stderr=open(os.devnull,'w')
导入pygame
导入tensorflow作为tf
将matplotlib.pyplot作为plt导入
将numpy作为np导入
从tkinter进口*
从tkinter导入消息框
sys.stdout=stdout
sys.stderr=stderr
类像素(对象):
定义初始值(自、x、y、宽度、高度):
self.x=x
self.y=y
self.width=宽度
自我高度=高度
self.color=(255255)
self.neights=[]
def绘图(自、表面):
pygame.draw.rect(曲面,self.color,(self.x,self.y,self.x+self.width,self.y+self.height))
def getneights(self,g):
#获取网格中每个像素的邻域,这用于绘制较粗的线
j=self.x//20#var i负责表示网格中的当前col值
i=self.y//20#var j负责表示网格中的当前行值
行=28
cols=28
#水平和垂直邻域
如果我0:#左
self.neights.append(g.pixels[i-1][j])
如果j0:#向下
self.neights.append(g.pixels[i][j-1])
#对角邻域
如果j>0且i>0:#左上角
self.neights.append(g.pixels[i-1][j-1])
如果j+1<行和i>-1和i-1>0:#左下角
self.neights.append(g.pixels[i-1][j+1])
如果j-10:#右上角
self.neights.append(g.pixels[i+1][j-1])
如果jTraceback (most recent call last):
File "D:/Users/user/AppData/Local/Programs/Pycharm/numbersML/drawNumber.py", line 184, in <module>
main()
File "D:/Users/user/AppData/Local/Programs/Pycharm/numbersML/drawNumber.py", line 157, in main
user_train(test, 0)
File "D:/Users/user/AppData/Local/Programs/Pycharm/numbersML/drawNumber.py", line 140, in user_train
model.fit(np.array(test), np.array(num))
File "D:\Users\user\AppData\Local\Programs\Pycharm\numbersML\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 718, in fit
use_multiprocessing=use_multiprocessing)
File "D:\Users\user\AppData\Local\Programs\Pycharm\numbersML\venv\lib\site-packages\tensorflow\python\keras\engine\training_v2.py", line 235, in fit
use_multiprocessing=use_multiprocessing)
File "D:\Users\user\AppData\Local\Programs\Pycharm\numbersML\venv\lib\site-packages\tensorflow\python\keras\engine\training_v2.py", line 582, in _process_training_inputs
use_multiprocessing=use_multiprocessing)
File "D:\Users\user\AppData\Local\Programs\Pycharm\numbersML\venv\lib\site-packages\tensorflow\python\keras\engine\training_v2.py", line 635, in _process_inputs
x, y, sample_weight=sample_weights)
File "D:\Users\user\AppData\Local\Programs\Pycharm\numbersML\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 2186, in _standardize_user_data
batch_size=batch_size)
File "D:\Users\user\AppData\Local\Programs\Pycharm\numbersML\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 2281, in _standardize_tensors
training_utils.check_array_lengths(x, y, sample_weights)
File "D:\Users\user\AppData\Local\Programs\Pycharm\numbersML\venv\lib\site-packages\tensorflow\python\keras\engine\training_utils.py", line 730, in check_array_lengths
set_y = set_of_lengths(targets)
File "D:\Users\user\AppData\Local\Programs\Pycharm\numbersML\venv\lib\site-packages\tensorflow\python\keras\engine\training_utils.py", line 725, in set_of_lengths
for y in x
File "D:\Users\user\AppData\Local\Programs\Pycharm\numbersML\venv\lib\site-packages\tensorflow\python\keras\engine\training_utils.py", line 726, in <listcomp>
if y is not None and not is_tensor_or_composite_tensor(y)
IndexError: tuple index out of range