【问题标题】:Getting ValueError and TypeError while training model using resnet50使用 resnet50 训练模型时获取 ValueError 和 TypeError
【发布时间】:2021-07-01 18:41:30
【问题描述】:

我正在使用 Resnet50 模型进行医学图像分类。每当我尝试展平图层时,我都会收到此错误。

ValueError: Attempt to convert a value (None) with an unsupported type (<class 'NoneType'>) to a Tensor.

我的代码如下

from PIL import Image
import numpy as np
import tensorflow
from tensorflow.keras import layers
from tensorflow.keras.callbacks import Callback, ModelCheckpoint, ReduceLROnPlateau, TensorBoard, EarlyStopping
from tensorflow.keras.models import Model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from keras.utils.np_utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import cohen_kappa_score, accuracy_score
import scipy
from tensorflow.keras import backend as K
import gc
from functools import partial
from tqdm import tqdm
from sklearn import metrics
from collections import Counter
import json
import itertools
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D,GlobalAveragePooling2D 
from keras.layers import Input, Lambda, Dense, Flatten
from keras.preprocessing import image
from glob import glob

pre_trained_model = tensorflow.keras.applications.ResNet50(input_shape=(224,224,3), include_top=False, weights="imagenet")

from keras.applications.resnet50 import ResNet50
from keras.models import Model
import keras
restnet = ResNet50(include_top=False, weights='imagenet', input_shape=(224,224,3))
output = restnet.layers[-1].output
output = keras.layers.Flatten()(output)
restnet = Model(restnet.input, output=output)
for layer in restnet.layers:
    layer.trainable = False
restnet.summary()

我也试过这样添加输出层:

last_layer = pre_trained_model.get_layer('conv5_block3_out')
print('last layer output shape:', last_layer.output_shape)
last_output = last_layer.output
x = GlobalAveragePooling2D()(last_output)
x = layers.Dropout(0.5)(x)
x = layers.Dense(3, activation='softmax')(x)

但是得到了这个错误:

TypeError: Cannot convert a symbolic Keras input/output to a numpy array. This error may indicate that you're trying to pass a symbolic value to a NumPy call, which is not supported. Or, you may be trying to pass Keras symbolic inputs/outputs to a TF API that does not register dispatching, preventing Keras from automatically converting the API call to a lambda layer in the Functional Model.

我无法理解这两个错误,检查了here 给出的解决方案,但这并没有解决我的问题。

【问题讨论】:

    标签: tensorflow keras deep-learning resnet image-classification


    【解决方案1】:

    您正在混合使用 tensorflow 和 keras 库。建议仅使用tensorflow.keras.* 而不是keras.*

    这里是修改后的代码:

    from PIL import Image
    import numpy as np
    import tensorflow
    from tensorflow.keras import layers
    from tensorflow.keras.callbacks import Callback, ModelCheckpoint, ReduceLROnPlateau, TensorBoard, EarlyStopping
    from tensorflow.keras.models import Model
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from keras.utils.np_utils import to_categorical
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.optimizers import Adam
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import cohen_kappa_score, accuracy_score
    import scipy
    from tensorflow.keras import backend as K
    import gc
    from functools import partial
    from tqdm import tqdm
    from sklearn import metrics
    from collections import Counter
    import json
    import itertools
    from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D,GlobalAveragePooling2D 
    from tensorflow.keras.layers import Input, Lambda, Dense, Flatten
    from tensorflow.keras.preprocessing import image
    from glob import glob
    
    pre_trained_model = tensorflow.keras.applications.ResNet50(input_shape=(224,224,3), include_top=False, weights="imagenet")
    
    from keras.applications.resnet50 import ResNet50
    from keras.models import Model
    import keras
    restnet = ResNet50(include_top=False, weights='imagenet', input_shape=(224,224,3))
    output = restnet.layers[-1].output
    output = tensorflow.keras.layers.Flatten()(output)
    restnet = tensorflow.keras.models.Model(restnet.input, outputs=output)
    for layer in restnet.layers:
        layer.trainable = False
    restnet.summary()
    

    【讨论】:

      猜你喜欢
      • 2019-08-02
      • 2022-01-12
      • 2017-08-19
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      相关资源
      最近更新 更多