Тензор потока: ошибка значения, невозможно передать значение (64,) в (?, 27) - PullRequest
0 голосов
/ 07 июня 2018

Я новый питон, и сейчас у меня есть эта проблема.Я пытаюсь сделать модель CNN для 27 классификаций.Но я получаю эту ошибку ValueError: Невозможно передать значение shape (64,) для Tensor 'target / Y: 0', имеющего форму '(?, 27)' [вот изображение моей ошибки 1

вот мой код, я буду очень признателен за любые предложения и комментарии PS Я новичок в этом, поэтому заранее извиняюсь за ошибку noob

import numpy as np, cv2, os
import tflearn
import parser
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.estimator import regression

img_size = 50

LR = 1e-3
MODEL_N = 'wood-{}-{}.model'.format(LR, '2conv-basic')


folders = ['alan batu', 'alan bunga', 'bindang', 'bintangor',
'dark red meranti',
'durian','geronggang','jelutong','jongkong','kapur','keruing',
'light red meranti',
'menggris','merbau','mersawa','nyatoh','perupok','pulai','ramin',
'rengas','resak','selangan batu','sepetir','terentang',
'white meranti','yellow meranti']
 labels = []
 images = []
for folder in folders:
for path in os.listdir('C:/Users/mwasi/Desktop/AI/pictures/sorted/'+folder):
    img = 
  cv2.imread('C:/Users/mwasi/Desktop/AI/pictures/sorted/'+folder+'/'+path,0)

    images.append(cv2.resize(img, (img_size, img_size)))
    labels.append(folders.index(folder))


  to_train= 0
   training_data =[]
 testing_data =[]

 train_images, test_images, train_labels, test_labels = [],[],[],[]
for image, label in zip(images, labels):
   if to_train<5:
    train_images.append(image)
    train_labels.append(label)
    to_train+=1
    training_data.append ([np.array(image), np.array(label)])
else:
    test_images.append(image)
    test_labels.append(label)
    to_train = 0
    testing_data.append ([np.array(image), np.array(label)])

 print('# of training images: ', len(train_images))
 print('# of testimg images: ', len(test_images))
np.save('train_data.npy',training_data)
np.save('testing_data.npy',testing_data)


convnet = input_data(shape=[None, img_size,img_size, 1], name='input')

convnet = conv_2d(convnet, 32, 5,padding='valid', activation='relu')
convnet = max_pool_2d(convnet, 5)

convnet = conv_2d(convnet, 64, 5, activation='relu')
convnet = max_pool_2d(convnet, 5)

convnet = fully_connected(convnet, 1024, activation='relu')
convnet = dropout(convnet, 0.4)

convnet = fully_connected(convnet,27, activation='softmax')
convnet = regression(convnet, optimizer='adam', learning_rate=LR, 
loss='categorical_crossentropy', name='targets')

model = tflearn.DNN(convnet, tensorboard_dir='log')

train_data = np.load('train_data.npy')
test_data=np.load('train_data.npy')

if os.path.exists('{}.meta'.format(MODEL_N)):
  model.load(MODEL_NAME)
  print('model loaded')

train = train_data[:-50]
test = train_data[-50:]

X = np.array([i[0] for i in train]).reshape(-1,img_size,img_size,1)
Y = [i[1] for i in train]

test_x = np.array([i[0] for i in test]).reshape(-1, img_size, img_size, 1)
test_y = [i[1] for i in test]

model.fit({'input': X}, {'targets': Y}, n_epoch=3, validation_set=({'input': 
test_x}, {'targets': test_y}), 
snapshot_step=10, show_metric=True, run_id=MODEL_N)

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Сколько строк у Y: 64?У должно быть 27 столбцов!Какова форма train_data и как она структурирована?Примечание. Мне бы хотелось оставить комментарий, но я могу ответить только на этот пост.

0 голосов
/ 08 июня 2018

Введенный вами для метки y ввод: target , который будет использоваться для вычисления ошибки, поэтому это должен быть 27-мерный массив, аналогичный выводу для convnetвывод, но так как вход определяется как:

convnet = input_data(shape=[None, img_size,img_size, 1], name='input')

означает, что тензор ввода может иметь произвольный размер пакета (т. е. количество изображений, передаваемых модели, будет определено во время выполнения.) и каждое изображениев пакете будет иметь размер img_size x img_size x 1 .Следовательно, метки также будут иметь форму (batch_size, 27)

Теперь модель создана, и во время выполнения вы кормите модель, используя:

X = np.array([i[0] for i in train]).reshape(-1,img_size,img_size,1)
Y = [i[1] for i in train]

Где X имеет форму [len (train), img_size, img_size, 1] , но y имеет форму (len (train) * len (i [1]),) .но это должно быть (len (train), 27)

, так что вы хотите сделать это

Y = [[i[1]] for i in train]  # Y shape will be now (len(train), shape(i[1]))

, где i [1] должен быть27-мерный массив.

Помните, что ваша ошибка означает несоответствие заполнителя и размера ввода.Вы должны учитывать размер партии

0 голосов
/ 07 июня 2018

Это означает, что формы вашего тензора не соответствуют желаемым.В вашем случае вы пытались задать форму от 64 до 27. Я думаю, что эта строка кода convnet = fully_connected(convnet,27, activation='softmax'), которая сделала эту ошибку, произошла, вы должны сначала изменить форму предыдущего слоя.

...