ValueError: Ошибка при проверке цели: ожидаемый результат будет иметь shape (1,), но получил массив с shape (2,) - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь создать модель распознавания лиц в Google Colab TPU. По сути, это копия VGG16. Имеет такие же слои, кроме первого и последних трех. Он работает на ноутбуке Python 2 на Colab.

Я видел другие вопросы, все они получают больше, чем требуется, в массиве, и есть решения для них. Остальные без ответа.

Возникает ошибка при запуске ячейки с обучающим кодом для моей модели.

#img_data contains images converted to array and pre-processed 
img_data = np.array(img_data_list)
img_data=np.rollaxis(img_data,1,0)
img_data =img_data[0]

#outputs
(2000, 1, 224, 224, 3)
(1, 2000, 224, 224, 3)
(1, 2000, 224, 224, 3)

num_classes = 2
num_of_samples = img_data.shape[0]
labels = np.ones((num_of_samples,),dtype='int64')
labels[0:1000]=0
labels[1000:]=1
names = ['happy' , 'not happy']

Y = np_utils.to_categorical(labels, num_classes)

x,y = shuffle(img_data,Y, random_state=2)

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2)

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.BatchNormalization(input_shape=(224,224,3)))
model.add(tf.keras.layers.Conv2D(64, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.Conv2D(64, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.MaxPooling2D())

model.add(tf.keras.layers.Conv2D(128, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.Conv2D(128, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2,2)))

model.add(tf.keras.layers.Conv2D(256, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.Conv2D(256, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.Conv2D(256, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2,2)))

model.add(tf.keras.layers.Conv2D(512, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.Conv2D(512, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.Conv2D(512, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2,2)))

model.add(tf.keras.layers.Conv2D(512, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.Conv2D(512, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.Conv2D(512, (5, 5), padding='same', activation='relu'))
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2,2)))

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation='relu', name='fc1'))
model.add(tf.keras.layers.Dense(128, activation='relu', name='fc2'))
model.add(tf.keras.layers.Dense(num_classes, activation='softmax', name='output'))
model.summary()

Обучение модели

import os
tpu_model = tf.contrib.tpu.keras_to_tpu_model(
    model,
    strategy=tf.contrib.tpu.TPUDistributionStrategy(
        tf.contrib.cluster_resolver.TPUClusterResolver(tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
    )
)
tpu_model.compile(
    optimizer=tf.train.AdamOptimizer(learning_rate=1e-3, ),
    loss=tf.keras.losses.sparse_categorical_crossentropy,
    metrics=['sparse_categorical_accuracy']
)

def train_gen(batch_size):
  while True:
    offset = np.random.randint(0, x_train.shape[0] - batch_size)
    yield x_train[offset:offset+batch_size], y_train[offset:offset + batch_size]


tpu_model.fit_generator(
    train_gen(1024),
    epochs=10,
    steps_per_epoch=100,
    verbose = 1,
    validation_data=(x_test, y_test),
)

Ожидаемые результаты:

Массив с вероятностями каждого ярлыка.

Фактические результаты:

ValueErrorTraceback (most recent call last)
<ipython-input-37-bffa1e87ffe0> in <module>()
     24     steps_per_epoch=100,
     25     verbose = 1,
---> 26     validation_data=(x_test, y_test),
     27 )
ValueError: Error when checking target: expected output to have shape (1,) but got array with shape (2,)

1 Ответ

0 голосов
/ 02 января 2019

Я думаю, что использовал неправильную функцию потерь и показателиПосле установки

loss = tf.keras.losses.categorical_crossentropy, metrics=['accuracy']

я наконец-то запускаю его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...