首页 > 解决方案 > Tensowflow 2.1 给出错误[Tensor 对象没有属性'is_initialized']

问题描述

我正在使用 tensorflow 2.1,我也有一些自定义函数。具有所有功能的相同模型在 tf 2.4 上运行顺利,但不知何故在 tf 2.1 上运行

模型:

def get_small_unet(n_filters = 16, bn = True, dilation_rate = 1):
'''Validation Image data generator
    Inputs: 
        n_filters - base convolution filters
        bn - flag to set batch normalization
        dilation_rate - convolution dilation rate
    Output: Unet keras Model
'''
#Define input batch shape
batch_shape=(256,256,3)
inputs = Input(batch_shape=(128, 256, 256, 3))
print(inputs)

conv1 = Conv2D(n_filters * 1, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(inputs)
if bn:
    conv1 = BatchNormalization()(conv1)
    
conv1 = Conv2D(n_filters * 1, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(conv1)
if bn:
    conv1 = BatchNormalization()(conv1)

pool1 = MaxPooling2D(pool_size=(2, 2), data_format='channels_last')(conv1)

conv2 = Conv2D(n_filters * 2, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(pool1)
if bn:
    conv2 = BatchNormalization()(conv2)
    
conv2 = Conv2D(n_filters * 2, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(conv2)
if bn:
    conv2 = BatchNormalization()(conv2)

pool2 = MaxPooling2D(pool_size=(2, 2), data_format='channels_last')(conv2)

conv3 = Conv2D(n_filters * 4, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(pool2)
if bn:
    conv3 = BatchNormalization()(conv3)
    
conv3 = Conv2D(n_filters * 4, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(conv3)
if bn:
    conv3 = BatchNormalization()(conv3)
    
pool3 = MaxPooling2D(pool_size=(2, 2), data_format='channels_last')(conv3)

conv4 = Conv2D(n_filters * 8, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(pool3)
if bn:
    conv4 = BatchNormalization()(conv4)
    
conv4 = Conv2D(n_filters * 8, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(conv4)
if bn:
    conv4 = BatchNormalization()(conv4)
    
pool4 = MaxPooling2D(pool_size=(2, 2), data_format='channels_last')(conv4)

conv5 = Conv2D(n_filters * 16, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(pool4)
if bn:
    conv5 = BatchNormalization()(conv5)

conv5 = Conv2D(n_filters * 16, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(conv5)
if bn:
    conv5 = BatchNormalization()(conv5)
    
up6 = concatenate([UpSampling2D(size=(2, 2))(conv5), conv4], axis=3)

conv6 = Conv2D(n_filters * 8, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(up6)
if bn:
    conv6 = BatchNormalization()(conv6)
    
conv6 = Conv2D(n_filters * 8, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(conv6)
if bn:
    conv6 = BatchNormalization()(conv6)
    
up7 = concatenate([UpSampling2D(size=(2, 2))(conv6), conv3], axis=3)

conv7 = Conv2D(n_filters * 4, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(up7)
if bn:
    conv7 = BatchNormalization()(conv7)
    
conv7 = Conv2D(n_filters * 4, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(conv7)
if bn:
    conv7 = BatchNormalization()(conv7)
    
up8 = concatenate([UpSampling2D(size=(2, 2))(conv7), conv2], axis=3)

conv8 = Conv2D(n_filters * 2, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(up8)
if bn:
    conv8 = BatchNormalization()(conv8)
    
conv8 = Conv2D(n_filters * 2, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(conv8)
if bn:
    conv8 = BatchNormalization()(conv8)

up9 = concatenate([UpSampling2D(size=(2, 2))(conv8), conv1], axis=3)

conv9 = Conv2D(n_filters * 1, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(up9)
if bn:
    conv9 = BatchNormalization()(conv9)
    
conv9 = Conv2D(n_filters * 1, (3, 3), activation='relu', padding = 'same', dilation_rate = dilation_rate)(conv9)
if bn:
    conv9 = BatchNormalization()(conv9)
    
conv10 = Conv2D(10, (1, 1), activation='softmax', padding = 'same', dilation_rate = dilation_rate)(conv9)

model = Model(inputs=inputs, outputs=conv10)


return model

自定义函数:

def tversky_loss(y_true, y_pred):
alpha = 0.5
beta  = 0.5

ones = K.ones(K.shape(y_true))
p0 = y_pred      # proba that voxels are class i
p1 = ones-y_pred # proba that voxels are not class i
g0 = y_true
g1 = ones-y_true

num = K.sum(p0*g0, (0,1,2,3))
den = num + alpha*K.sum(p0*g1,(0,1,2,3)) + beta*K.sum(p1*g0,(0,1,2,3))

T = K.sum(num/den) # when summing over classes, T has dynamic range [0 Ncl]

Ncl = K.cast(K.shape(y_true)[-1], 'float32')
return Ncl-T

def dice_coef(y_true, y_pred):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + smooth) / (K.sum(y_true_f*y_true_f) + K.sum(y_pred_f*y_pred_f) + smooth)


def dice_coef_loss(y_true, y_pred):
    return 1.-dice_coef(y_true, y_pred)

构建模型后,当我尝试拟合此模型时,它给了我

AttributeError:“张量”对象没有属性“is_initialized”

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


推荐阅读