Я новичок в tenorflow, и я все еще учусь, поэтому я прошу прощения, если я упустил что-то очевидное. Итак, в основном моя проблема заключается в том, что я пытаюсь настроить простой классификатор изображений с тензорным потоком в Python, я выяснил, как создавать свои наборы данных и тому подобное, но сейчас я просто пытаюсь запустить процесс обучения, но проблема в том, что всякий раз, когда я попробуй я получу эту ошибку
ValueError: Невозможно изменить тензор с 150528 элементами для формирования [224,150528] (33718272 элементов) для 'dnn / input_from_feature_columns / input_layer / Image / Reshape' (op: 'Reshape') с входными формами: [224,224,3 ], [2] и с входными тензорами, вычисленными как частичные формы: input [1] = [224,150528].
Я посмотрел на некоторые другие сообщения, которые я нашел здесь о переполнении стека по этой проблеме, и они сказали, что он неправильно изменял свои данные и из того, что я прочитал из моей ошибки, у меня та же проблема, дело в том, что я использую готовые Оценщик и я сам не вызываю какие-либо изменяющие функции в моем коде, оценщик делает это для меня, я полагаю, так как я могу решить эту ошибку? Спасибо за любую помощь, вот мой код
Код обучения:
import tensorflow as tf
import cv2
import numpy as np
from DatasetCreator import DatasetCreator
trainingImagesPath = "TrainingImages"
#Loads the image data
def load_image(addr):
imageDimensions = (224, 224)
image = cv2.imread(addr)
#Resize the image to the size we need
image = cv2.resize(image, imageDimensions, interpolation=cv2.INTER_CUBIC)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)#Convert to RGB color space
image = image.astype(np.float32)
print(image.shape)
return image
#Load in the datasets
with tf.Graph().as_default() as graph:
dataCreator = DatasetCreator()
trainingDataset = dataCreator.generateDataset(trainingImagesPath)
#Create a training iterator for getting info from dataset
trainingIterator = trainingDataset.make_one_shot_iterator()
next_element = trainingIterator.get_next()
def train_input_fn():
with tf.Session(graph = graph) as sess:
features = sess.run(next_element)
#Get the image path
imagePath = str(features["ImagePath"])
imagePath = imagePath[2:len(imagePath)-1]
#Get the label
label = features["ImageLabel"]
image = load_image(imagePath)#Get image data
return {"Image": image, "Label": label}
featureColumns = [tf.feature_column.numeric_column("Image", [224, 224, 3]),
tf.feature_column.numeric_column("Label")]
estimator = tf.estimator.DNNClassifier(
model_dir = "Model",
feature_columns = featureColumns,
hidden_units = [1024, 512, 256],
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
)
print("Began training")
estimator.train(input_fn = train_input_fn, steps=1000)
Вот мой код, который создает мой обучающий набор данных:
import tensorflow as tf
import cv2
from random import shuffle
import glob
import numpy as np
class DatasetCreator:
def __init__(self):
pass;
def generateDataset(self, trainingImagesPath):
addrs = glob.glob(trainingImagesPath + "/*.jpg")#Get list of paths of all the images in folder
#Label each address
labels = [0 if "car" in image else 1 for image in addrs]#Compile list of labels
# Divide the hata into 60% train, 20% validation, and 20% test
train_addrs = addrs[0:int(0.6*len(addrs))]
train_labels = labels[0:int(0.6*len(labels))]
val_addrs = addrs[int(0.6*len(addrs)):int(0.8*len(addrs))]
val_labels = labels[int(0.6*len(addrs)):int(0.8*len(addrs))]
test_addrs = addrs[int(0.8*len(addrs)):]
test_labels = labels[int(0.8*len(labels)):]
#Create dataset
dataset = tf.data.Dataset.from_tensor_slices(
{"ImagePath": train_addrs,
"ImageLabel": train_labels})
return dataset;