#python-3.x #performance #tensorflow #keras #model-fitting
Вопрос:
Я работаю над проблемой рукописных цифр. Надеюсь, мой код достаточно понятен для самого себя.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.utils import to_categorical
import matplotlib.pyplot as plt
import csv
import numpy as np
with open('train.csv') as f:
reader = csv.reader(f)
contents = list(reader)
labels = np.array(contents[0][1:])
labels = np.reshape(labels, (28,28,1))
numbers = []
shape = np.shape(contents)
num_inputs = shape[1]
num_samples = shape[0]
for i in np.arange(1,num_samples):
pixels = contents[i][1:]
pixels = np.array(pixels, dtype = int)
pixels = np.reshape(pixels, (28,28,1))
#pixels = to_categorical(pixels)
pixels = pixels / 255
numbers.append(pixels)
num_hidden_layer = round(2/3 * num_inputs 10)
model = tf.keras.models.Sequential([
tf.keras.layers.MaxPooling2D(pool_size=(4,4), input_shape=(28,28,1)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(num_hidden_layer, activation = 'relu'),
tf.keras.layers.Dense(10, activation = 'softmax')
])
model.summary()
model.compile(optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(numbers, labels, epochs=3, verbose = 1)
Форма numbers
есть (42000, 28, 28, 1)
, и форма labels
есть (42000, 28, 28, 1)
. Сглаженные входные размеры от my model.summary
составляют всего 49, с общим количеством 31 990 и обучаемыми параметрами. Несмотря на это, мой model.fit()
просто бежит вечно, не показывая абсолютно ничего. Я даже попробовал использовать maxpool дальше, и ничего. Почему он ничего не делает? У меня есть verbose = 1
, и мне еще предстоит увидеть индикатор прогресса. Как я могу запустить это?
Обновить:
Я просто позволил этому течь, и в конце концов это прекратилось с: ValueError: Layer sequential_1 expects 1 input(s), but it received 42000 input tensors.
Ответ №1:
Я почти уверен, что это не работает, потому что ваши значения меток несовместимы с определением вашей модели. Что у тебя на этикетках? 28×28 для меток модели кажется неправильным. Вы используете sparse_categorical_crossentropy, который ожидает одно целое число для одного примера. Это единственное целое число будет указывать на правильную метку в вашем выводе softmax.
Комментарии:
1. Мои ярлыки-это просто строки. До того, как я сделал их 28×28 (по-видимому,глупо), они были просто списком, таким как [pixel1, pixel2, pixel3,…]
2. @genjong Я думаю, что у вас должна быть одна метка на изображение, как у Шейна Уокера, а не одна метка на пиксель.
Ответ №2:
Метки должны иметь только одно измерение, верно? Должен быть массив целых чисел.