ValueError: Невозможно изменить тензор с 150528 элементами для придания ему формы [224,150528] - PullRequest
0 голосов
/ 16 января 2019

Я новичок в 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;
...