Keras сообщает TypeError: неподдерживаемые типы операндов для +: 'NoneType' и 'int' - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок в Керасе и просто пишу игрушечный пример.Это сообщает TypeError.Код и ошибка следующие:

Код:

inputs = keras.Input(shape=(3, ))

cell = keras.layers.SimpleRNNCell(units=5, activation='softmax')
label = keras.layers.RNN(cell)(inputs)

model = keras.models.Model(inputs=inputs, outputs=label)
model.compile(optimizer='rmsprop',
              loss='mae',
              metrics=['acc'])

data = np.array([[1, 2, 3], [3, 4, 5]])
labels = np.array([1, 2])
model.fit(x=data, y=labels)

Ошибка:

Traceback (most recent call last):
    File "/Users/david/Documents/code/python/Tensorflow/test.py", line 27, in <module>
        run()
    File "/Users/david/Documents/code/python/Tensorflow/test.py", line 21, in run
        label = keras.layers.RNN(cell)(inputs)
    File "/Users/david/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/layers/recurrent.py", line 619, in __call__
...
    File "/Users/david/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/init_ops.py", line 473, in __call__
        scale /= max(1., (fan_in + fan_out) / 2.)
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Так какможно с этим справиться?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Я думаю, что сегодняшний ответ очень ясен.Однако не завершено.Ключевым моментом здесь является то, что если ваш вход не содержит num_features, вы должны сделать слой Embedding рядом со входом.

Так что если вы используете:

inputs = keras.Input(shape=(3,))
embedding = Embedding(voc_size, embed_dim, ..)
X = embedding(inputs)

это тоже работает.

0 голосов
/ 27 ноября 2018

Вход в слой RNN будет иметь форму (num_timesteps, num_features), то есть каждая выборка состоит из num_timesteps временных шагов, где каждый временной шаг является вектором длины num_features.Кроме того, количество временных шагов (т. Е. num_timesteps) может быть переменным или неизвестным (т. Е. None), но количество признаков (т. Е. num_features) должно быть фиксированным и указываться с самого начала.Следовательно, вам нужно изменить форму входного слоя, чтобы она соответствовала уровню RNN.Например:

inputs = keras.Input(shape=(None, 3))  # variable number of timesteps each with length 3
inputs = keras.Input(shape=(4, 3))     # 4 timesteps each with length 3
inputs = keras.Input(shape=(4, None))  # this is WRONG! you can't do this. Number of features must be fixed

Затем вам также необходимо изменить форму входных данных (например, data), чтобы они соответствовали заданной вами форме ввода (т. Е. Она должна иметь форму(num_samples, num_timesteps, num_features)).

В качестве примечания можно определить слой RNN более просто, используя непосредственно слой SimpleRNN:

label = keras.layers.SimpleRNN(units=5, activation='softmax')(inputs)
...