#python #tensorflow #keras
#python #тензорный поток #keras
Вопрос:
Привет, я пытался запустить подгонку модели на основе следующих кодов, но почему-то он продолжает говорить
Ошибка типа: объект ‘NoneType’ нельзя вызвать. Не уверен, какую часть я сделал неправильно. Это
часть моего процесса обучения оптимизации. Я здесь потерялся… Существует ли минимальное требование для запуска такой model.fit?
Пожалуйста, помогите мне с этим!
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import datasets
(train_x, train_y), (test_x, test_y) = datasets.mnist.load_data()
inputs = layers.Input((28, 28, 1))
net = layers.Conv2D(32, (3, 3), padding ='SAME')(inputs)
net = layers.Activation('relu')(net)
net = layers.Conv2D(32, (3, 3), padding ='SAME')(net)
net = layers.Activation('relu')(net)
net = layers.MaxPooling2D(pool_size=(2, 2))(net)
net = layers.Dropout(0.25)(net)
net = layers.Conv2D(64, (3, 3), padding ='SAME')(net)
net = layers.Activation('relu')(net)
net = layers.Conv2D(64, (3, 3), padding ='SAME')(net)
net = layers.Activation('relu')(net)
net = layers.MaxPooling2D(pool_size=(2, 2))(net)
net = layers.Dropout(0.25)(net)
net = layers.Flatten()(net)
net = layers.Dense(512)(net)
net = layers.Activation('relu')(net)
net = layers.Dropout(0.5)(net)
net = layers.Dense(10)(net)
net = layers.Activation('softmax')(net)
model = tf.keras.Model(inputs=inputs, outputs=net, name='Basic_CNN')
loss_fun = tf.keras.losses.sparse_categorical_crossentropy
metrics = tf.keras.metrics.Accuracy()
optm = tf.keras.optimizers.Adam()
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss='sparse_categorical_crossentropy',
metrics=[tf.keras.metrics.Accuracy()])
train_x.shape, train_y.shape
test_x.shape, test_y.shape
import numpy as np
np.expand_dims(train_x, -1).shape
tf.expand_dims(train_x, -1).shape
train_x = train_x[..., tf.newaxis]
test_x = test_x[..., tf.newaxis]
train_x.shape
np.min(train_x), np.max(train_x)
train_x = train_x / 255.
test_x = test_x / 255.
np.min(train_x), np.max(train_x)
num_epochs = 1
batch_size = 32
model.fit(train_x, train_y,
batch_size=batch_size,
shuffle=True,
epochs=num_epochs)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-20-870033ef5c40> in <module>
2 batch_size=batch_size,
3 shuffle=True,
----> 4 epochs=num_epochs)
~/opt/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py in _method_wrapper(self, *args, **kwargs)
106 def _method_wrapper(self, *args, **kwargs):
107 if not self._in_multi_worker_mode(): # pylint: disable=protected-access
--> 108 return method(self, *args, **kwargs)
109
110 # Running inside `run_distribute_coordinator` already.
~/opt/anaconda3/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
1096 batch_size=batch_size):
1097 callbacks.on_train_batch_begin(step)
-> 1098 tmp_logs = train_function(iterator)
1099 if data_handler.should_sync:
1100 context.async_wait()
~/opt/anaconda3/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds)
778 else:
779 compiler = "nonXla"
--> 780 result = self._call(*args, **kwds)
781
782 new_tracing_count = self._get_tracing_count()
~/opt/anaconda3/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds)
805 # In this case we have created variables on the first call, so we run the
806 # defunned version which is guaranteed to never create variables.
--> 807 return self._stateless_fn(*args, **kwds) # pylint: disable=not-callable
808 elif self._stateful_fn is not None:
809 # Release the lock early so that multiple threads can perform the call
TypeError: 'NoneType' object is not callable
Комментарии:
1. Я не смог воспроизвести вашу ошибку на своем компьютере. Я могу начать обучение модели с вашим кодом. Вы пытались отладить и посмотреть, что такое модель на самом деле, прежде чем вызывать эту ошибку.
2. Можете ли вы сказать мне, какой тензорный поток вы используете??
3. Как вы выполняете отладку?
Ответ №1:
Вы должны сделать две вещи.
Сначала вы должны изменить loss на: categorical_crossentropy
.
Во-вторых, вам нужны ваши train_y
и test_y
должны быть с одним горячим кодом. Это означает, что они должны иметь размерность, (number_of_samples, 10)
где 10
обозначает количество классов. Добавьте это после model.compile():
num_classes = 10 #number of classes, here is 10 (0,1,...,9)
train_y = keras.utils.to_categorical(train_y, num_classes)
test_y = keras.utils.to_categorical(test_y, num_classes)
Наконец, позвольте мне сказать, что вам следует изменить количество эпох и размер пакета, чтобы получить лучший результат. Например epochs count = 12
и batch size = 128
Комментарии:
1. Спасибо @Meysam. Тогда мне было интересно, как я могу использовать sparse_categorical_crossentropy?
2. чтобы использовать разреженную категориальную перекрестную энтропию, скомпилируйте свою модель, используя loss с from_logits = True таким образом
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
, тогда вам не нужно будет использовать классы горячего кодирования.
Ответ №2:
Я получал эту ошибку, когда ссылался на потери и метрические функции по именам. Ошибка исчезла после того, как я заменил имена объектами. В вашем случае я бы рекомендовал добавить операторы импорта и изменить параметры компиляции модели, т. Е.:
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.losses import SparseCategoricalCrossentropy
from tensorflow.keras.metrics import Accuracy
...
model.compile(optimizer=Adam(),
loss=SparseCategoricalCrossentropy(from_logits=True),
metrics=[Accuracy()])