无法为 Tensor 'targets/Y:0' 提供形状 (64, 7) 的值,其形状为“(?,)”

Cannot feed value of shape (64, 7) for Tensor 'targets/Y:0', which has shape '(?,)'

我正在处理 Kaggle 的 fer2013 数据集。这是数据集的 a link

我正在使用 TFLearn 框架,我将标签(7 class 标签)转换为 hot_shot 并且一切正常,直到我 运行 它在网络中并且我得到错误:无法为 Tensor 'targets/Y:0' 提供形状 (64, 7) 的值,其形状为“(?,)”

我读过以前的类似问题,我知道我正在尝试为网络提供一个形状与预期不同的张量,我的问题是我不知道如何重塑它的预期,或者至少是它期望的形状,这样我就可以重塑我的张量。

这是我的代码。

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg


#Read csv file
data = pd.read_csv('fer2013.csv')

#Number of samples
n_samples = len(data)
n_samples_train = 28709
n_samples_test = 3589
n_samples_validation = 3589
IMG_SIZE = 48

#Pixel width and height
w = 48
h = 48

#Separating labels and features respectively
y = data['emotion']
X = np.zeros((n_samples, w, h,1))
for i in range(n_samples):
    X[i] = np.fromstring(data['pixels'][i], dtype=int, sep=' ').reshape(w, h,1)

#Training set   
X_train = X[:n_samples_train]
y_train = y[:n_samples_train]

X_val = X[n_samples_train : (n_samples_train + n_samples_test)]  
y_val = y[n_samples_train : (n_samples_train + n_samples_test)]

n_values = np.max(y_train) + 1
y_hot_shot_train = np.eye(n_values)[y_train]

n_values_val = np.max(y_val) + 1
y_hot_shot_val = np.eye(n_values_val)[y_val]

import tflearn
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
from tflearn.data_augmentation import ImageAugmentation


LR = 0.001

imgaug = ImageAugmentation()
imgaug.add_random_flip_leftright()
imgaug.add_random_rotation(max_angle=25.)

convnet = input_data(shape=[None, IMG_SIZE, IMG_SIZE, 1],data_augmentation=imgaug, name='input')

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

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

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

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

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

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

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

convnet = fully_connected(convnet, 7, activation='softmax')
convnet = regression(convnet, optimizer='adam', learning_rate=LR, loss='categorical_crossentropy', name='targets', to_one_hot = True, n_classes=7)

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

MODEL_NAME = 'SentimentAnalysis-{}-{}.model'.format(LR, '6conv-basic')

model.fit({'input': X_train}, {'targets': y_hot_shot_train}, n_epoch=6,batch_size=64, validation_set=({'input': X_val}, {'targets': y_hot_shot_val}), 
    snapshot_step=500, show_metric=True, run_id=MODEL_NAME)

当您在回归函数中将 to_one_hot 设置为 True 时,它已经将您的目标转换为 one-hot 标签。因此,它需要一个形状为 (?,) 的值,您应该只向拟合函数提供原始数据 y_trainy_val

model.fit({'input': X_train}, {'targets': y_train}, n_epoch=6, batch_size=64, 
    validation_set=({'input': X_val}, {'targets': y_val}),
    snapshot_step=500, show_metric=True, run_id=MODEL_NAME)

我只是在上面输入答案,请检查此 example。还要将您的热矩阵转换更改为:

num_classes = y_train.max()+1
y_hot_shot_train = np.zeros((n_samples_train,num_classes),dtype=int)
y_hot_shot_train[np.arange(n_samples_train), np.transpose(y_train)] = 1
y_hot_shot_val = np.zeros((n_samples_validation,num_classes),dtype=int)
y_hot_shot_val[np.arange(n_samples_validation), np.transpose(y_val)] = 1

convnet = regression(convnet, optimizer='adam', learning_rate=LR, loss='categorical_crossentropy', name='targets',)
                     #to_one_hot = True, n_classes=num_classes)

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

MODEL_NAME = 'SentimentAnalysis-{}-{}.model'.format(LR, '6conv-basic')

model.fit({'input': X_train}, {'targets': y_hot_shot_train}, n_epoch=6,batch_size=64,
          validation_set=({'input': X_val}, {'targets': y_hot_shot_val}),
    snapshot_step=500, show_metric=True, run_id=MODEL_NAME)