首页 > 解决方案 > 在 Tensorflow 中执行 model.fit 时出现类型错误

问题描述

我研究 tensorflow 并发生以下错误。

keras 版本是 2.2.4-tf,Python 是 3.7.4

操作系统是窗口 10。

我制作了 tensorflow 模型,模型学习时出现错误。

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.Flatten()(net)
net = layers.Dense(512)(net)
net = layers.Activation('relu')(net)
net = layers.Dropout(0.5)(net)
net = layers.Dense(10)(net)  # num_classes
net = layers.Activation('softmax')(net)

model = tf.keras.Model(inputs=inputs, outputs=net, name='Basic_CNN')


model.compile(optimizer=tf.keras.optimizers.Adam(), 
              loss='sparse_categorical_crossentropy', 
              metrics=[tf.keras.metrics.Accuracy()])

train_x = train_x[..., tf.newaxis]
test_x = test_x[..., tf.newaxis]

num_epochs = 1
batch_size = 32

model.fit(train_x, train_y, 
          batch_size=batch_size, 
          shuffle=True, 
          epochs=num_epochs) 

下面是运行 model.fit 时的错误。

看来学习不能完全完成。

上面的代码有什么问题?

Train on 60000 samples
   32/60000 [..............................] - ETA: 11s
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-fea17f92bc8b> in <module>
      2           batch_size=batch_size,
      3           shuffle=True,
----> 4           epochs=1) 

C:\ProgramData\Anaconda3\lib\site-packages\tensorflow_core\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_freq, 
max_queue_size, workers, use_multiprocessing, **kwargs)
    817         max_queue_size=max_queue_size,
    818         workers=workers,
--> 819         use_multiprocessing=use_multiprocessing)
    820 
    821   def evaluate(self,

C:\ProgramData\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py in 
fit(self, model, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, 
shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, 
validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    340                 mode=ModeKeys.TRAIN,
    341                 training_context=training_context,
--> 342                 total_epochs=epochs)
    343             cbks.make_logs(model, epoch_logs, training_result, ModeKeys.TRAIN)
    344


TypeError: 'NoneType' object is not callable

标签: pythontensorflowkerasdeep-learning

解决方案


我相信你搞砸了重塑你的输入示例点。

尝试在下面的代码中执行类似的操作:

您的型号:

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.Flatten()(net)
net = layers.Dense(512)(net)
net = layers.Activation('relu')(net)
net = layers.Dropout(0.5)(net)
net = layers.Dense(10)(net)  # num_classes
net = layers.Activation('softmax')(net)

model = tf.keras.Model(inputs=inputs, outputs=net, name='Basic_CNN')


model.compile(optimizer=tf.keras.optimizers.Adam(), 
              loss='sparse_categorical_crossentropy', 
              metrics=[tf.keras.metrics.Accuracy()])

重塑您的输入:

X = train_x.reshape([-1,28,28,1])#reshaping as per your model input dimensions

还有一种热编码输出(如果没有完成):

Y= tf.keras.utils.to_categorical(train_y, 10)

训练你的模型:

num_epochs = 1
batch_size = 32

model.fit(X, Y, 
          batch_size=batch_size, 
          shuffle=True, 
          epochs=num_epochs) 

我相信这会奏效。


推荐阅读