python - ValueError:logits 和标签必须具有相同的形状 ((32, 1) vs (32, 2))
问题描述
我已经更改了从此处获取的代码,用于具有 1 个输出神经元的二进制分类
import os
from keras.models import Sequential
from sklearn.model_selection import train_test_split
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import optimizers
from skimage import io
from skimage.transform import resize
from keras.utils import to_categorical
import numpy as np
import tensorflow as tf
import random
import glob
n_category_samples = 4000
batch_size = 32
num_classes = 2
epochs = 10
n_image_rows = 106
n_image_cols = 106
n_channels = 3
def train_selfie_model():
random_seed = 1
tf.random.set_seed(random_seed)
np.random.seed(random_seed)
x_train, y_train = prepare_train_set()
x_train, x_test, y_train, y_test = train_test_split(x_train, y_train, test_size=0.30, random_state=42)
mean = np.array([0.5, 0.5, 0.5])
std = np.array([1, 1, 1])
x_train = x_train.astype('float')
x_test = x_test.astype('float')
for i in range(3):
x_train[:, :, :, i] = (x_train[:, :, :, i] - mean[i]) / std[i]
x_test[:, :, :, i] = (x_test[:, :, :, i] - mean[i]) / std[i]
y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)
model = compile_model()
print(model.summary())
print(y)
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss: ', score[0])
print('Test accuracy: ', score[1])
model_path = os.getcwd() + "/models/saved/selfie-model/"
model.save(model_path)
def prepare_train_set():
positive_samples = glob.glob('datasets/drunk_resize_frontal_faces/pos/*')[0:n_category_samples]
negative_samples = glob.glob('datasets/drunk_resize_frontal_faces/neg/*')[0:n_category_samples]
negative_samples = random.sample(negative_samples, len(positive_samples))
x_train = []
y_train = []
for i in range(len(positive_samples)):
x_train.append(resize(io.imread(positive_samples[i]), (n_image_rows, n_image_cols)))
y_train.append(1)
if i % 1000 == 0:
print('Reading positive image number ', i)
for i in range(len(negative_samples)):
x_train.append(resize(io.imread(negative_samples[i]), (n_image_rows, n_image_cols)))
y_train.append(0)
if i % 1000 == 0:
print('Reading negative image number ', i)
x_train = np.array(x_train)
y_train = np.array(y_train)
return x_train, y_train
def compile_model():
model_input_shape = (n_image_rows, n_image_cols, n_channels)
model = Sequential()
model.add(
Conv2D(8, kernel_size=(3, 3), activation='relu', strides=(1, 1), padding='same', input_shape=model_input_shape))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(Dropout(0.25))
model.add(Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(Dropout(0.25))
model.add(Conv2D(16, kernel_size=(3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(Conv2D(8, kernel_size=(3, 3), padding='same', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'))
model.add(Flatten())
model.add(Dense(10, activation='relu'))
# single output neuron
model.add(Dense(1, activation='sigmoid'))
sgd = optimizers.SGD(lr=.001, momentum=0.9, decay=0.000005, nesterov=False)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
return model
但是我在运行时遇到以下错误 train_selfie_model()
ValueError: logits and labels must have the same shape ((32, 1) vs (32, 2))
在
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test))
我是 TF 和 Keras 的新手。似乎这是一个数组维度不匹配。但我怎么能解决这个问题?
解决方案
问题是
在
def train_selfie_model():
...
y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)
...
您将y_train
和设置y_test
为单热编码(形状为 (2,) 的向量。但在
def compile_model():
...
model.add(Dense(1, activation='sigmoid'))
...
你只有一个输出神经元(形状为 (1,) 的输出)。
因此,注释掉/删除以下行将解决您的问题。
y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)
推荐阅读
- mysql - 为具有多个连接的查询编写计数查询
- python - 上传此图片时出现此错误“无法识别媒体类型”?
- powershell - PowerShell Get-Help 无法识别参数注释
- powershell - 从其他 PS 命令向 PS 对象添加值
- oracle - 如何在多租户架构中更改(迁移)根容器数据库的字符集?
- javascript - AngularJS UI-Select 标记不适用于 Google Chrome 中的新标记
- javascript - selectInput 值未在可反应的 Shiny 中更新(Trouble binding-unbiding)
- git - 如何在不复制子包代码的情况下将主版本升级到 v2 并默认获取最新版本?
- sql - Haskell + Squeal 中的 SQL 数组聚合
- xslt-3.0 - 关于 xsl:template 返回 xsl:map 的问题