Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras迁移学习与自主学习模式_Python_Tensorflow_Keras_Transfer Learning - Fatal编程技术网

Python Keras迁移学习与自主学习模式

Python Keras迁移学习与自主学习模式,python,tensorflow,keras,transfer-learning,Python,Tensorflow,Keras,Transfer Learning,编辑: 显然是keras和tensorflow.keras的一些问题导致了我的问题。我按照以下步骤更改导入: 我试图加载一个模型,并将最后一个密集层与另一个不同输出维度的层交换。 到目前为止,我得到的是: 保存时的模型: def create_model(n_timesteps=828 , n_features=1, n_outputs=7): dtype='float32' model = Sequential([ Convolution1D(input_sh

编辑:

显然是keras和tensorflow.keras的一些问题导致了我的问题。我按照以下步骤更改导入:

我试图加载一个模型,并将最后一个密集层与另一个不同输出维度的层交换。 到目前为止,我得到的是:

保存时的模型:

def create_model(n_timesteps=828 , n_features=1, n_outputs=7):
    dtype='float32'
    model = Sequential([
        Convolution1D(input_shape=(n_timesteps, n_features), kernel_size=3, filters=128, activation='relu', kernel_regularizer='l2', dtype=dtype, name="conv1"),
        MaxPool1D(pool_size=4, strides=4), # reduce size of the input by 4
        Dropout(0.3, dtype=dtype),
        Flatten(),
        Dense(32, activation='relu',  kernel_regularizer=tf.keras.regularizers.l2(), dtype=dtype, name="dense1"),
        Dropout(0.2, dtype=dtype),
        Dense(n_outputs, activation='softmax', dtype=dtype, name="dense2")
    ])

    return model
以及尝试再培训:

def retrain(model_name="cnn_general"):
    model = tf.keras.models.load_model('saved_models\\' + model_name)                        
    model.trainable = False
    model.compile(optimizer='adam', loss='categorical_crossentropy', 
              metrics=['accuracy'])
    print(model.summary())

    output = Dense(1, activation='sigmoid')(model.layers[-1].output)

    retrained_model = Model(inputs=model.inputs, outputs=output)
    print(retrained_model.summary())
我得到了错误输出:

Traceback (most recent call last):
  File "C:/.../CNN_heatbeats.py", line 233, in <module>
    retrain((X_train, y_train, X_test,  y_test, X_val, y_val))
  File "C:/.../CNN_heatbeats.py", line 161, in retrain
    output = Dense(10, activation='sigmoid')(model.layers[-1].output)
  File "C:\Miniconda\envs\tensorflow-gpu-cuda10\lib\site-packages\keras\backend\tensorflow_backend.py", line 75, in symbolic_fn_wrapper
    return func(*args, **kwargs)
  File "C:\Miniconda\envs\tensorflow-gpu-cuda10\lib\site-packages\keras\engine\base_layer.py", line 475, in __call__
    previous_mask = _collect_previous_mask(inputs)
  File "C:\Miniconda\envs\tensorflow-gpu-cuda10\lib\site-packages\keras\engine\base_layer.py", line 1441, in _collect_previous_mask
    mask = node.output_masks[tensor_index]
AttributeError: 'Node' object has no attribute 'output_masks'
回溯(最近一次呼叫最后一次):
文件“C:/…/CNN_heatbeats.py”,第233行,中
再培训((X_列车,y_列车,X_测试,y_测试,X_val,y_val))
文件“C:/…/CNN_heatbeats.py”,第161行,在再培训中
输出=密集(10,激活='sigmoid')(model.layers[-1]。输出)
文件“C:\Miniconda\envs\tensorflow-gpu-cuda10\lib\site packages\keras\backend\tensorflow\u backend.py”,第75行,符号\u fn\u包装
返回函数(*args,**kwargs)
文件“C:\Miniconda\envs\tensorflow-gpu-cuda10\lib\site packages\keras\engine\base\u layer.py”,第475行,在\uu调用中__
上一个\u掩码=\u收集\u上一个\u掩码(输入)
文件“C:\Miniconda\envs\tensorflow-gpu-cuda10\lib\site packages\keras\engine\base\u layer.py”,第1441行,位于上一个掩码中
掩码=节点。输出掩码[张量索引]
AttributeError:“节点”对象没有“输出\u掩码”属性

我只找到了类似VGG16的模型的信息,但无法将其应用到我自己的网络中。我在retain()函数中所做的是一种合适的方法吗?我怎样才能让它工作呢?

你试过这种方法吗

def retrain(model_name="cnn_general"):
    model = tf.keras.models.load_model('saved_models\\' + model_name)                        
    model.trainable = False
    model.compile(optimizer='adam', loss='categorical_crossentropy', 
              metrics=['accuracy'])
    model.summary()

    retrained_model = Sequential()
    for layer in model.layers[:-1]:
        layer.trainable = False
        retrained_model.add(layer)
    retrained_model.add(Dense(1, activation='sigmoid'))
    retrained_model.summary()

谢谢你的回答!我以前试过,它给出了:TypeError:添加的层必须是类层的实例。发现:事实上,我刚刚在我的机器上试过你的代码,它能工作。我没有训练模型,我只是使用create_model函数,保存模型,然后使用您定义的retain_model函数。那么代码不会产生任何错误。您好,再次感谢您的努力!正如我在编辑中所说,keras与tensorflow.keras之间存在问题,因此您没有遇到任何问题也就不足为奇了!