Как исправить: ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_130_input будет иметь форму (1, 512, 512), но получил массив с формой (79, 512, 512) - PullRequest
1 голос
/ 09 февраля 2020

Я новичок в работе с CNN.

Итак, я строю двумерную сверточную нейронную сеть, которая предсказывает тип опухоли головного мозга и задает вопрос о NumPy массивах. Форма ввода моей модели (1, 512, 512) как (каналы, img_height, img_width). 4-е измерение - это num_images, которое, похоже, автоматически определяется TensorFlow. Это просто быстрый фон. У меня есть 3064 ".mat" файла расширений с МРТ сканированием опухолей головного мозга. Все настроено. Я преобразовал файлы ".mat" в numpy матрицы и добавил весь список матриц в один массив numpy для передачи в качестве входных данных для CNN. У меня также есть соответствующие метки (привязанные к изображениям при передаче входных данных в модель) в виде массива numpy. Все числа имеют тип с плавающей запятой как на изображениях, так и на этикетках.

Опять же, моя форма ввода (1, 512, 512). Однако при подгонке моей модели я получаю следующую ошибку:

ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_130_input будет иметь форму (1, 512, 512), но получил массив с формой (79, 512, 512)

Итак, я нарезаю свои NumPy массивы для создания train_images, train_labels, test_images, test_labels. Я проверил длину каждого набора поездов и тестов с совпадением меток. Это тоже массивы, я проверял несколько раз. И это ошибка значения. Итак, как мне это исправить?

Я даже не знаю, где стала входная форма (79,512,512). У меня есть al oop для преобразования f "{n} .mat" изображений в матрицу. Я использую 100 изображений для тестирования, и у меня 80 поездов и 20 тестов. Я думаю, что здесь ошибка, форма ввода (каналы, img-hght, img-wdth), но вместо этого количество оставленных для изображения изображений помещается в значение канала. Таким образом, ввод размещается как (num_images, img-hght, img-wdth). Это неправильно и должно быть изменено, но я не знаю, как это сделать. Или я могу ошибаться, и то, что я сказал, может не иметь смысла. Я предоставляю весь код, запускаю его на Colab. Обязательно измените пути к изображениям, если вы загружаете код и хотите запустить его, чтобы выручить меня. Большое спасибо!

Набор данных: https://figshare.com/articles/brain_tumor_dataset/1512427/5

#Importing the necessary libraries through PIP to the Virtual Environment
try:
  !python -m pip install --upgrade pip #Quickly update PIP to latest version
  !python -m pip install pymatreader
  !python -m pip install pyswarm #An interesting library for testing purposes
  print("""
The following libraries are available and have been successfully fetched:
  >>> PyMatReader
  >>> Particle Swarm""")
except Exception:
  print("""
The following libraries have unavailable and have not been fetched:
  >>> PyMatReader
  >>> Particle Swarm""")
  pass
#Importing the necessary libraries to the Virtual Environment
from __future__ import absolute_import, division, print_function, unicode_literals
import random as rnd
from random import shuffle
import numpy as np
import sys
import scipy as sp
from scipy.ndimage import gaussian_filter
import pymatreader as pym
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import matplotlib.image as mplimg
import matplotlib.pyplot as plt
import PIL
from PIL import Image
import imageio
import sklearn as sk
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import image
import sklearn.metrics as skm

print("""
The following libraries have been successfully imported:
  >>> Future
  >>> Random (with shuffle)
  >>> NumPy
  >>> System
  >>> SciPy (with gaussian filter)
  >>> PyMatReader
  >>> Pandas
  >>> Seaborn
  >>> Matplotlib (with PyPlot & Image)
  >>> PIL (with Image)
  >>> Imageio
  >>> Sci-Kit Learn (with metrics & train_test_split)
  >>> Sci-kit Learn Feature Extraction (with Image)
""")

try:
  %tensorflow_version 2.x
  import keras
  import tensorflow as tf
  print("TensorFlow version 2.x is available and has been successfully imported.")
except Exception:
  %tensorflow_version 1.x
  import keras
  import tensorflow as tf
  print("TensorFlow version 2.x is unavailable. TensorFlow version 1.x has been imported instead.")
  pass

from tensorflow.keras import datasets, layers, models
import keras.preprocessing
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from keras.optimizers import Adam
import pyswarm
from pyswarm import pso

autoTune = tf.data.experimental.AUTOTUNE

print("""
The following deep learning optimizers have been successfully imported:
  >>> Adam
  >>> Particle Swarm (with pso)
""")

print("All libraries have been successfully imported.")
#Understanding the Image Data using Seaborn and Matplotlib
classNames = {1 : "Meningioma", 2 : "Glioma", 3 : "Pituitary Tumor", 4 : "Unkown", 5 : "Unkown"}
outputSize = len(classNames)

chooseImgNum = 2978
example = pym.read_mat(f'/content/gdrive/My Drive/My Files/Neuroimaging/Neuroimaging Datasets/MATLAB Files/{chooseImgNum}.mat')
cjdata = example['cjdata']
pid = cjdata['PID']
img = cjdata['image']
label = cjdata['label']

tumorBorder = cjdata['tumorBorder']
tumorMask = cjdata['tumorMask']
print("Tumor Border is: \n", tumorBorder, "\n")
print("Tumor Mask is: \n", tumorMask, "\n")

def printImage():
  plt.figure(figsize=(5, 5))
  plt.imshow(img, cmap=None)

def matrixConv(): #Data Visualization only
  matrix = np.asmatrix(tumorBorder)
  plt.figure(figsize=(5, 5))
  return matrix

def applyGrayscale():
  plt.figure(figsize=(5, 5))
  plt.imshow(img, cmap='gray')

print("""
      Below is the original image followed by a grayscale application:
____________________________________________________________________________
""")

printImage()
applyGrayscale()
#Preprocessing Brain Images from Dataset
range1 = np.arange(0, 100)
imgMatrices = []
imgNum = 1
i = 1

while imgNum in range1:
  imgNum = pym.read_mat(f'/content/gdrive/My Drive/My Files/Neuroimaging/Neuroimaging Datasets/MATLAB Files/{imgNum}.mat')
  cjdata = imgNum['cjdata']
  imgMatrix = cjdata['image']
  # plt.figure(figsize=(5, 5))
  # plt.imshow(image_matrix, cmap='gray')
  imgMatrixNP = np.asmatrix(imgMatrix)
  imgArrayNP = np.asarray(imgMatrixNP)
  imgMatrices.append(imgArrayNP)
  imgNum = i
  i = i + 1

print("The length of the image input list is:", len(imgMatrices))

imgMatricesNP = np.asarray(imgMatrices)
print("The length of the converted image input array is:", len(imgMatricesNP), "\n")

print("The image input array:")
imgMatricesNP #Prints the raw array
#Supervised Learning: Understanding Cancer Type labels
np.set_printoptions(threshold=3)
#np.set_printoptions(threshold=sys.maxsize) #To check the content of the entire array

rawMatData = pym.read_mat('/content/gdrive/My Drive/My Files/Neuroimaging/Neuroimaging Datasets/cvind.mat')
print("Labels file in \".mat\" format converted to dictionary format:", rawMatData)

matDataList = list(rawMatData.values())
print("Labels converted to list format:", matDataList)

matDataArray = np.asarray(matDataList)
print("Labels converted to array format:", matDataArray, "\n")
shapedMatDataArray = matDataArray.reshape(-1, 3064, 1)
print("Reshaped labels in array format:\n", shapedMatDataArray, "\n")

matData = pd.DataFrame(matDataArray)
print("Labels converted to a Pandas DataFrame:")
matData #Prints out the DataFrame
#Viewing labels based on image number
def imgLabelCheck(n):
  callback = matData.at[0, n-1]
  print(f"Image Number {n} has the following Cancer Type: {classNames[callback]}.")
  return

pickImg = 1 #Choose an image number to look for its Cancer Type
imgLabelCheck(pickImg)
#Preparing the Datasets: Looping Train Set & Test Set
print("___________________________________________________________________________________\n")

train_images = np.array([imgMatricesNP[0:79]])
print("Training images range is:\n", train_images, "\n")

uppTrBn = len(train_images)
loqTrRng = 0
uppTrRng = 79
train_labels = np.asarray(matData.loc[:, loqTrRng:uppTrRng], dtype=float, order='A')
print("Training labels range is:", train_labels)

print("___________________________________________________________________________________\n")

test_images = np.array([imgMatricesNP[80:100]])
print("Testing images range is: \n", test_images, "\n")

uppTsBn = len(test_images)
loqTsRng = 80
uppTsRng = 100
test_labels = np.asarray(matData.loc[:, loqTsRng:uppTsRng], dtype=float, order='A')
print("Testing labels range is:", test_labels)

print("___________________________________________________________________________________")
#train_labels #Verify if the ranges are in fact NumPy arrays
#test_labels
#Defining the Convolutional Neural Network
model = models.Sequential()

model.add(layers.Conv2D(512, (3, 3), activation='relu', data_format="channels_first", input_shape=(1, 512, 512))) #The Input Layer
#model.add(layers.Dropout(0.5, noise_shape=None, seed=None)) #Optional Dropout Layer

model.add(layers.MaxPooling2D((2, 2), padding='same')) #MaxPooling Layer 1
model.add(layers.Conv2D(1024, (3, 3), activation='relu', padding='same')) #Hidden Convolutional Layer 1
model.add(layers.Dropout(0.5, noise_shape=None, seed=None)) #Optional Dropout Layer

model.add(layers.MaxPooling2D((2, 2), padding='same')) #MaxPooling Layer 2
model.add(layers.Conv2D(1024, (3, 3), activation='relu', padding='same')) #Hidden Convolutional Layer 2
#model.add(layers.Dropout(0.5, noise_shape=None, seed=None)) #Optional Dropout Layer

model.add(layers.MaxPooling2D((2, 2), padding='same')) #MaxPooling Layer 3
model.add(layers.Conv2D(1024, (3, 3), activation='relu', padding='same')) #Hidden Convolutional Layer 3
model.add(layers.Dropout(0.5, noise_shape=None, seed=None)) #Optional Dropout Layer

model.add(layers.MaxPooling2D((2, 2), padding='same')) #MaxPooling Layer 4
model.add(layers.Conv2D(1024, (3, 3), activation='relu', padding='same')) #Hidden Convolutional layer 4
#model.add(layers.Dropout(0.5, noise_shape=None, seed=None)) #Optional Dropout Layer

model.add(layers.MaxPooling2D((2, 2), padding='same')) #MaxPooling Layer 5
model.add(layers.Conv2D(1024, (3, 3), activation='relu', padding='same')) #Hidden Convolutional Layer 5
model.add(layers.Dropout(0.5, noise_shape=None, seed=None)) #Optional Dropout Layer

model.add(layers.MaxPooling2D((2, 2), padding='same')) #MaxPooling Layer 6
model.add(layers.Conv2D(1024, (3, 3), activation='relu', padding='same')) #Hidden Convolutional Layer 6
#model.add(layers.Dropout(0.5, noise_shape=None, seed=None)) #Optional Dropout Layer

model.add(layers.Flatten()) #The Flattening Layer

model.add(layers.Dense(512, activation='relu')) #Dense Layer 1
model.add(layers.Dense(256, activation='relu')) #Dense Layer 2
model.add(layers.Dense(128, activation='relu')) #Dense Layer 3
model.add(layers.Dense(64, activation='relu')) #Dense Layer 4
model.add(layers.Dense(32, activation='relu')) #Dense Layer 5
model.add(layers.Dense(16, activation='relu')) #Dense Layer 6

model.add(layers.Dense(outputSize, activation='softmax')) #The Output Layer

model.summary()
#Compiling the Convolutional Neural Network with an Optimizer
#The Adam Optimizer is ideal for biological image classification.
#The Optimizer automatically performs forward and backward propagation.

model.compile(
    optimizer='Adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy'],
    loss_weights=None,
    sample_weight_mode=None,
    weighted_metrics=None,
    target_tensors=None
  )

print("The Neuroimaging Model has been successfully compiled.")
#Training the Convolutional Neural Network
history = model.fit(train_images, train_labels, epochs=10, batch_size=1, verbose=1,
                    validation_data=(test_images, test_labels))

print("\nThe Neuroimaging Model has been successfully trained.")

Каждое поле кода на этой странице представляет отдельную ячейку кода для записной книжки Colab или Jupyter. Еще раз, вся помощь приветствуется и ценится! (Модель построена не полностью, но слои добавлены только для экспериментов.

1 Ответ

0 голосов
/ 09 февраля 2020

Добавьте строку:

train_images = np.reshape(train_images, (-1,1,512,512))

после строки ниже в вашем коде

train_images = np.array([imgMatricesNP[0:79]])

, чтобы получить отдельные изображения input_shape=(1, 512, 512) вместо (79, 512, 512), потому что модель ожидая форму ввода (1, 1, 512, 512) (в соответствии с размерами (batch_size, channel, height, width) ), в то время как ваш текущий код обеспечивает форму ввода (1, 79, 512, 512). Если у вас достаточно вычислительных ресурсов, увеличьте размер batch_size до 8 (скажем), чтобы общая форма ввода была (8, 1, 512, 512).

. Также выполните аналогичную операцию для test_images:

test_images = np.reshape(test_images, (-1,1,512,512))

после строки:

test_images = np.array([imgMatricesNP[80:100]])

PS: Похоже, что вы намереваетесь вырезать первые 80 изображений из входных данных imgMatricesNP. Однако при imgMatricesNP[0:79] вы получите только первые 79 изображений (так как последний индекс фрагмента исключен в Python). Таким образом, исправление будет:

train_images = np.array([imgMatricesNP[0:80]])

и назначить uppTrRng=80.

Надеюсь, это поможет! :)

...