【问题标题】:Model works fine in Keras but not in Tensorflow模型在 Keras 中工作正常,但在 Tensorflow 中不行
【发布时间】:2020-11-12 20:38:53
【问题描述】:

在使用 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 后它工作正常

【问题讨论】:

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

由于您是 ImageDataGenerator ,因此在使用 tf.keras 时,cnn.fit 中的参数 steps_per_epoch 是必需的(不是确定它是如何在原生 keras 中实现的)

Tensorflow DocumentationArguments 部分中,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

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2019-11-11
    • 2013-06-29
    • 2021-06-28
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多