Tensorflow 为什么我在迁移学习中会出错?

Tensorflow 为什么我在迁移学习中会出错?,tensorflow,deep-learning,cnn,transfer-learning,pre-trained-model,Tensorflow,Deep Learning,Cnn,Transfer Learning,Pre Trained Model,我正在培训古吉拉特语光学字符识别模型。输入图像是字符图像。我上了37节课。总培训图像为22200张(每班600张),测试图像为5920张(每班160张)。我的输入图像是32x32 下面是我的代码: model = tf.keras.applications.DenseNet121(include_top=False, weights='imagenet', pooling='max') base_inputs = model.layers[0].input base_outputs = mode

我正在培训古吉拉特语光学字符识别模型。输入图像是字符图像。我上了37节课。总培训图像为22200张(每班600张),测试图像为5920张(每班160张)。我的输入图像是32x32

下面是我的代码:

model = tf.keras.applications.DenseNet121(include_top=False, weights='imagenet', pooling='max')
base_inputs = model.layers[0].input
base_outputs = model.layers[-1].output # NOTICE -1 not -2
prefinal_outputs = layers.Dense(1024)(base_outputs)
final_outputs = layers.Dense(37)(prefinal_outputs)
new_model = keras.Model(inputs=base_inputs, outputs=base_outputs)
    
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    
    train_datagen = ImageDataGenerator(
                                       shear_range=0.2,
                                       zoom_range=0.2,
                                       
                                       
                                       horizontal_flip=False)
    
    test_datagen = ImageDataGenerator(horizontal_flip = False)
    
    training_set = train_datagen.flow_from_directory('C:/Users/shweta/Desktop/characters/train',
                                                     target_size = (32, 32),
                                                     batch_size = 64,
                                                     class_mode = 'categorical')
    
    test_set = test_datagen.flow_from_directory('C:/Users/shweta/Desktop/characters/test',
                                                target_size = (32, 32),
                                                batch_size = 64,
                                                class_mode = 'categorical')
    
    new_model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
    
    new_model.fit_generator(training_set,
                            
                             epochs = 25,
                             validation_data = test_set, shuffle=True)
    new_model.save('alphanumeric.mod')
我得到以下输出:

model = tf.keras.applications.DenseNet121(include_top=False, weights='imagenet', pooling='max')
base_inputs = model.layers[0].input
base_outputs = model.layers[-1].output # NOTICE -1 not -2
prefinal_outputs = layers.Dense(1024)(base_outputs)
final_outputs = layers.Dense(37)(prefinal_outputs)
new_model = keras.Model(inputs=base_inputs, outputs=base_outputs)
    
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    
    train_datagen = ImageDataGenerator(
                                       shear_range=0.2,
                                       zoom_range=0.2,
                                       
                                       
                                       horizontal_flip=False)
    
    test_datagen = ImageDataGenerator(horizontal_flip = False)
    
    training_set = train_datagen.flow_from_directory('C:/Users/shweta/Desktop/characters/train',
                                                     target_size = (32, 32),
                                                     batch_size = 64,
                                                     class_mode = 'categorical')
    
    test_set = test_datagen.flow_from_directory('C:/Users/shweta/Desktop/characters/test',
                                                target_size = (32, 32),
                                                batch_size = 64,
                                                class_mode = 'categorical')
    
    new_model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
    
    new_model.fit_generator(training_set,
                            
                             epochs = 25,
                             validation_data = test_set, shuffle=True)
    new_model.save('alphanumeric.mod')


提前感谢

首先,代码编写得非常好。 这些是我在阅读代码和tf、keras文档时注意到的一些事情

我想问你有什么样的标签,因为你知道Category_crossentropy需要一个热编码标签。(),所以,如果你的标签是整数,使用

类似问题 有人试图将其分类为2,并使用分类而不是二进制交叉熵。如果你想看的话

干杯 让我知道进展如何

PS:@gerry提出了一个非常好的观点,如果标签是一个热编码的标签,请使用categoricalcrossentropy

代码应为:

model = tf.keras.applications.DenseNet121(include_top=False, weights='imagenet, pooling='max', input_shape=(32,32,3))
base_outputs = model.layers[-1].output 
prefinal_outputs = layers.Dense(1024)(base_outputs)
final_outputs = layers.Dense(37)(prefinal_outputs)
new_model = keras.Model(inputs=model.input, outputs=final_outputs)
new_model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])  
此外,将来还应使用model.fit。Model.fit现在可以与生成器一起使用,Model.fit_生成器将在tensorflow的未来版本中贬值。我对你的数据集进行了比对,在大约10个时期内得到了准确的结果。这里有一些额外的建议。这是最好的使用和可调的学习率。keras callback ReducelRon平台使这一点变得容易。将文档设置为监视验证丢失。我的用法如下所示

lr_adjust=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss", factor=0.5, patience=1, verbose=1, mode="auto",
        min_delta=0.00001,  cooldown=0,  min_lr=0)
sav_loc=r'c:\Temp' # set this to the path where you want to save the weights
checkpoint=tf.keras.callbacks.ModelCheckpoint(filepath=save_loc, monitor='val_loss', verbose=1, save_best_only=True,
        save_weights_only=True, mode='auto', save_freq='epoch', options=None)
callbacks=[checkpoint, lr_adjust]
我还建议使用回调模型检查点。建立文档以监控验证损失,并保存达到最低验证损失的权重。我的实现如下所示

lr_adjust=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss", factor=0.5, patience=1, verbose=1, mode="auto",
        min_delta=0.00001,  cooldown=0,  min_lr=0)
sav_loc=r'c:\Temp' # set this to the path where you want to save the weights
checkpoint=tf.keras.callbacks.ModelCheckpoint(filepath=save_loc, monitor='val_loss', verbose=1, save_best_only=True,
        save_weights_only=True, mode='auto', save_freq='epoch', options=None)
callbacks=[checkpoint, lr_adjust]
在model.fit中包含回调=回调。训练完成后,您希望将这些保存的权重加载到模型中,然后保存模型。可以使用保存的模型进行预测。代码如下

model.load_weights(save_loc)  
model.save(save_loc)

嘿我运行了这段代码,得到了预期的输出。因此,列车和测试文件夹中没有差异。那么,得到上述错误的另一个原因是什么?!我运行了您编辑的代码,但出现错误。我已经编辑了我得到的问题和错误。请看一看!!!标签是类目录的名称,并且是分类的,我仍然面临这个错误!!!这个错误涉及最后一层的第二层,我猜是1024个单位!我想你只上了最后一层。看看这个链接中的图片。将输出层更改为[-1]也许还可以将densenet121的层进行环绕,以便您可以使用[-neg]索引?让我知道进展如何你说的Densenet 121环绕是什么意思?[-1]表示我正在考虑DenseNet121的最后一层。如果我没弄错的话,[-2]表示倒数第二层。没错。我刚刚看到了你的自定义前缀层。还可以试试@jerry的新代码,其中包括将索引改为-1。我认为错误在于final和prefinal。因此,我建议您使用另一种预训练模式,并尝试它。你还是自己找吧。我可以在我的电脑上尝试,但还没有得到数据集!我可以发送给你我的数据集在zip文件,如果你可以尝试的代码!见我修正后的答案。我想你选错图层了!我通过提到输入形状来尝试修改代码。但是仍然得到同样的错误!!我很困惑。确切的代码行应该是什么?!!!见修改后的答案OK!理解代码。但精度饱和在0.027。我已经在问题中添加了我的输出。看一看!