Keras помещают ValueError в чрезвычайно простой тестовый код - PullRequest
0 голосов
/ 16 мая 2019

Я столкнулся с очень постоянной проблемой в более сложной программе Keras, но свел ее к следующему: ответ должен быть очень простым, но я не могу его найти.

Когда я запускаю этот код:

def __init__ (self):
    self.model = Sequential()
    self.model.add(Dense(4, input_shape=(4,), activation='linear'))
    self.model.compile(optimizer='adam', loss='mse')
def run(self):
    x = [1., 1., 1., 1.]
    print('x:', x, 'x shape:', np.shape(x))
    y = [0., 0., 0., 0.]
    print('y:', y, 'y shape:', np.shape(y))
    self.model.fit(x, y, batch_size=1, epochs=1, verbose=2)

Операторы печати показывают, что x и y имеют форму (4,), но линия соответствия создает:

ValueError: Ошибка при проверке входных данных: ожидается, что плотность записи будет иметь shape (4,), но получил массив с shape (1,)

Я пытался изменить x на (1,4), но это не помогло. Я в тупике.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Данные должны быть 2D. Сделайте ваши данные x и y как 2D на x = [[1., 1., 1., 1.]]. Это становится 1x4 данными. 1 - это число данных, а 4 - это измерение, которое вы определяете как input_shape. И, сделайте это как массив numpy x = np.array(x). fit метод Кераса требует numpy array. Я видел x: Numpy array of training data от https://keras.io/models/model/.

import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense
import numpy as np

class A:
    def __init__ (self):
        self.model = Sequential()
        self.model.add(Dense(4, input_shape=(4,), activation='linear'))
        self.model.compile(optimizer='adam', loss='mse')

    def run(self):
        x = [[1., 1., 1., 1.]]
        print('x:', x, 'x shape:', np.shape(x))
        y = [[0., 0., 0., 0.]]
        print('y:', y, 'y shape:', np.shape(y))
        x = np.array(x)
        y = np.array(y)
        self.model.fit(x, y, batch_size=1, epochs=1, verbose=2)

a = A()
a.run()
0 голосов
/ 16 мая 2019

массивы x и y, которые вы передаете, имеют неправильную форму. Если вы хотите иметь входной тензор формы (4,) для вашей модели, то вам нужно подготовить тензор с формой (n, 4), где n - это число примеров, которые вы предоставляете.

import tensorflow as tf
import numpy as np
from keras.models import Model, Sequential
from keras.layers import Input, Dense


class Mymodel(tf.keras.Model):
  def __init__ (self):
      super(Mymodel, self).__init__()
      self.model = Sequential()
      self.model.add(Dense(4, input_shape=(4,), activation='linear'))
      self.model.compile(optimizer='adam', loss='mse')

  def run(self):
      x = np.ones((1,4))
      print('x:', x, 'x shape:', np.shape(x))
      y = np.zeros((1,4))
      print('y:', y, 'y shape:', np.shape(y))
      self.model.fit(x, y, batch_size=1, epochs=1, verbose=2)


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