首页 > 解决方案 > 模型在 Keras 中运行良好,但在 Tensorflow 中不行

问题描述

在使用 Tensorflow 时,在拟合模型后,在第一个 epoch 中显示未知(1/未知),但仅使用 keras 时它工作正常。有什么问题或者我做错了什么

张量流代码:-

import tensorFlow as tf
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)
training_set = train_datagen.flow_from_directory('dataset/train',
                                                 target_size = (150, 150),
                                                 batch_size = 10,
                                                 class_mode = 'binary')
test_datagen = ImageDataGenerator(rescale = 1./255)
test_set = test_datagen.flow_from_directory('dataset/test',
                                            target_size = (150, 150),
                                            batch_size = 10,
                                            class_mode = 'binary')
cnn=tf.keras.models.Sequential()
cnn.add(tf.keras.layers.Conv2D(filters=100,kernel_size=3,activation='relu',input_shape=(150,150,3)))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2))
cnn.add(tf.keras.layers.Conv2D(filters=100,kernel_size=3,activation='relu',))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2))
cnn.add(tf.keras.layers.Flatten())

cnn.add(tf.keras.layers.Dense(units=50, activation='relu'))
cnn.add(tf.keras.layers.Dense(units=2, activation='softmax'))
cnn.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
cnn.fit(x=training_set,validation_data=test_set,epochs=10)

表明

 Epoch 1/10
    28/Unknown - 12s 416ms/step - loss: 0.9420 - accuracy: 0.4964

但是从每一行中删除 tf 后它工作正常

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


由于 you are ImageDataGenerator,参数在使用时steps_per_epoch是强制性的(不确定它是如何在 native 中实现的)cnn.fittf.keraskeras

Tensorflow 文档Arguments部分中指出:model.fit

steps_per_epoch:整数或无。在宣布一个时期完成并开始下一个时期之前的步骤总数(样本批次)。当使用输入张量(例如 TensorFlow 数据张量)进行训练时,默认的 None 等于数据集中的样本数除以批量大小,如果无法确定,则为 1。如果 x 是 tf.data 数据集,并且 'steps_per_epoch' 为 None,则 epoch 将运行直到输入数据集耗尽。传递无限重复数据集时,您必须指定 steps_per_epoch 参数。数组输入不支持此参数。

所以,如果你更换

cnn.fit(x=training_set,validation_data=test_set,epochs=10)

batch_size = 20
No_Of_Training_Images = Train_Generator.classes.shape[0]
steps_per_epoch = No_Of_Training_Images/batch_size
cnn.fit(x=training_set,validation_data=test_set,epochs=10, 
steps_per_epoch = steps_per_epoch)

输出将如下所示:

Epoch 1/10
    28/100 - 12s 416ms/step - loss: 0.9420 - accuracy: 0.4964

推荐阅读