Python 元组索引超出范围,Tensorflow
这就是模型。这是一个基本的tensorflow模型,它拍摄一个数字的图片,告诉你它是什么数字。 *我知道python中的索引从0开始。我遇到的问题是这行代码“model.fit(np.array(test),np.array(num))”。阅读下面的代码了解更多信息*强>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.
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