Не могу сжать дим [1], ожидаемый размер 1, получил 2 - PullRequest
2 голосов
/ 11 апреля 2019

У меня очень простой ввод: точки, и я пытаюсь определить, находятся они в каком-то регионе или нет.Таким образом, мои тренировочные данные имеют форму (1000000, 2), которая является массивом формы:[ [x1,y1], [x2,y2],... ]Мои ярлыки имеют похожую форму (Shaped (10000, 2)):[ [1,0], [0,1], [0,1],... ]([0,1] означает, что точка находится в области, [1,0] означает, что это не так)

Моя модель настроена следующим образом:

import tensorflow as tf
from tensorflow import keras
import numpy as np

# Reads the points and labels from .csv format files
train_data = np.genfromtxt('data/train_data.csv', delimiter=',')
train_labels = np.genfromtxt('data/train_labels.csv', delimiter=',')

model = keras.models.Sequential()
model.add(keras.layers.Dense(128, activation='relu', input_shape=(2,)))
model.add(keras.layers.Dense(128, activation='relu'))
model.add(keras.layers.Dense(2, activation='softmax'))

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_data, train_labels, epochs=1, batch_size=100, verbose=1) # ERROR

Обратите внимание, что форма ввода(2,), что означает (согласно ссылка ), что модель будет ожидать массивы вида (*, 2).

Я получаю ошибку:tensorflow.python.framework.errors_impl.InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 2

и я понятия не имею, почему.Есть предложения?

Stacktrace:

Traceback (most recent call last):
  File "C:/Users/omer/Desktop/Dots/train.py", line 25, in <module>
    model.fit(train_data, train_labels, epochs=1, batch_size=100, verbose=1)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", line 880, in fit
    validation_steps=validation_steps)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 329, in model_iteration
    batch_outs = f(ins_batch)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\backend.py", line 3076, in __call__
    run_metadata=self.run_metadata)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\client\session.py", line 1439, in __call__
    run_metadata_ptr)
  File "C:\Users\omer\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 528, in __exit__
    c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Can not squeeze dim[1], expected a dimension of 1, got 2
     [[{{node metrics/acc/Squeeze}}]]

Ответы [ 2 ]

3 голосов
/ 11 апреля 2019

Ваши ярлыки имеют неправильную форму. См. документацию :

При использовании потери sparse_categorical_crossentropy ваши цели должны быть integer цели. Если у вас есть категориальные цели, вы должны использовать categorical_crossentropy

Так что вам нужно конвертировать ваши метки в целые числа:

train_labels = np.argmax(train_labels, axis=1)
0 голосов
/ 11 апреля 2019

Согласно вашему описанию проблемы, это, кажется, задача двоичной классификации (то есть внутри региона или вне региона).Поэтому вы можете сделать следующее:

  1. Использовать 'sigmoid' в качестве функции активации последнего слоя.
  2. Использовать одну единицу (вместо 2) в последнем слое.
  3. Используйте 'binary_crossentropy' в качестве функции потерь.

Вам также необходимо сопоставить текущие метки, т. Е. [1,0] и [0,1], с 0 и 1.

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