我想在弹出最后一层然后添加 2 FC(密集)层后使用预训练的 vgg-19。我想为这些 FC 层之一提供一个二进制变量(男性或女性)的输入。我怎样才能实现它。
我收到错误:ValueError: Input 0 is incompatible with layer lstm_1: expected ndim=3, found ndim=2使用以下代码:
def make_model():
model = Sequential()
model.add(Conv2D(20,(5,5), input_shape = (24,48,30), activation = "relu", strides = 1, padding = "valid"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(50, (5,5), use_bias = 50))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(20, activation = "relu"))
model.add(LSTM(50, activation="relu", return_sequences=True))
return model
Run Code Online (Sandbox Code Playgroud)
我的输入是 30 个大小为 24*48 的矩阵。
我正在 Keras 中实现这里描述的 LSTM 架构。我想我真的很接近,尽管我仍然对共享层和特定于语言的层的组合有疑问。这是公式(大约):y = g * y^s + (1 - g) * y^u
这是我试过的代码:
### Linear Layers ###
univ_linear = Dense(50, activation=None, name='univ_linear')
univ_linear_en = univ_linear(en_encoded)
univ_linear_es = univ_linear(es_encoded)
print(univ_linear_en)
# Gate >> g
gate_en = Dense(50, activation='sigmoid', name='gate_en')(en_encoded)
gate_es = Dense(50, activation='sigmoid', name='gate_es')(es_encoded)
print(gate_en)
print(gate_es)
# EN >> y^s
spec_linear_en = Dense(50, activation=None, name='spec_linear_en') (en_encoded)
print(spec_linear_en)
# g * y^s
gated_spec_linear_en = Multiply()([gate_en, spec_linear_en])
print(gated_spec_linear_en)
# ES >> y^s
spec_linear_es = Dense(50, activation=None, name='spec_linear_es')(es_encoded) …Run Code Online (Sandbox Code Playgroud) 刚刚通过以下方式安装了 tensorflow-gpu:
conda install --yes tensorflow-gpu==1.12.0
现在,当我遇到from tensorflow.keras import layers错误时:
导入错误:无法导入名称“激活”
我尝试删除 tf 和 keras 然后重新安装 tf,但没有帮助。
我有一个由一些密集层组成的 Keras Sequential 模型。我将整个模型的可训练属性设置为 False。但是我看到各个层的可训练属性仍然设置为 True。我是否需要单独将图层的可训练属性也设置为 False?那么在整个模型上将trainable property设置为False是什么意思呢?
我在这个简单的层中出现以下错误:
class MyLayer(Layer):
def __init__(self):
super(MyLayer, self).__init__()
def build(self):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(1)
trainable=True)
super(MyLayer, self).build()
def call(self, x):
return x/self.kernel
Run Code Online (Sandbox Code Playgroud)
当我将它用作:
m = MyLayer()
t = m (input)
Run Code Online (Sandbox Code Playgroud)
错误:build() 采用一个位置参数,但给出了两个。
我需要向现有模型添加图层。但是,我需要在“主模型级别”添加层,即我不能使用经典的函数方法。例如,如果我使用类似的东西:
from keras.layers import Dense,Reshape, Input
inp = Input(shape=(15,))
d1 = Dense(224*224*3, activation='linear')(inp)
r1 = Reshape(input_shape)
from keras import Model
model_mod = r1(d1)
model_mod = mobilenet(model_mod)
model_mod = Model(inp, model_mod)
Run Code Online (Sandbox Code Playgroud)
我获得:
Layer (type) Output Shape Param #
=================================================================
input_5 (InputLayer) (None, 15) 0
_________________________________________________________________
dense_4 (Dense) (None, 150528) 2408448
_________________________________________________________________
reshape_4 (Reshape) (None, 224, 224, 3) 0
_________________________________________________________________
mobilenet_1.00_224 (Model) (None, 1000) 4253864
Run Code Online (Sandbox Code Playgroud)
所以,我获得了一个带有嵌套子模型的模型。相反,我会将嵌套子模型的层(mobilenet)“添加”到新的顶层(即在 reshape_4 之后)。我试过:
modelB_input = modelB.input
for layer in modelB.layers:
if layer == modelB_input:
continue
modelA.add(layer)
Run Code Online (Sandbox Code Playgroud)
它适用于简单的顺序模型(例如,vgg、mobilenet),但对于连接不是严格顺序的更复杂的模型(例如,inception、resnet),此代码并不好。有任何想法吗?
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from wordcloud import WordCloud
from bs4 import BeautifulSoup
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
from nltk.stem import SnowballStemmer, WordNetLemmatizer
from nltk import sent_tokenize, word_tokenize, pos_tag
from keras.preprocessing import sequence
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Lambda
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM, SimpleRNN, GRU
from keras.preprocessing.text …Run Code Online (Sandbox Code Playgroud) python sentiment-analysis keras jupyter-notebook keras-layer
我正在使用keras和tensorflow 1.4。
我想明确指定两层之间连接的神经元。因此,每当第一层中的神经元i与第二层中的神经元j连接且在其他位置为零时,我就有一个矩阵A。
我的第一个尝试是创建一个带有内核的自定义层,该内核的大小与A相同,其中包含不可训练的零,其中A包含零,可训练的权重,其中A包含一个零。这样,所需的输出将是一个简单的点积。不幸的是,我没有设法弄清楚如何实现部分可训练和部分不可训练的内核。
有什么建议么?
(用很多神经元通过手工连接建立功能模型可能是一种解决方法,但是某种程度上是“丑陋”的解决方案)
我不明白这段代码中发生了什么:
def construct_model(use_imagenet=True):
# line 1: how do we keep all layers of this model ?
model = keras.applications.InceptionV3(include_top=False, input_shape=(IMG_SIZE, IMG_SIZE, 3),
weights='imagenet' if use_imagenet else None) # line 1: how do we keep all layers of this model ?
new_output = keras.layers.GlobalAveragePooling2D()(model.output)
new_output = keras.layers.Dense(N_CLASSES, activation='softmax')(new_output)
model = keras.engine.training.Model(model.inputs, new_output)
return model
Run Code Online (Sandbox Code Playgroud)
具体来说,当我们调用最后一个构造函数时,我的困惑是
model = keras.engine.training.Model(model.inputs, new_output)
Run Code Online (Sandbox Code Playgroud)
我们指定输入层和输出层,但它如何知道我们希望所有其他层保留?
换句话说,我们将new_output层附加到我们在第1行加载的预训练模型,即new_output层,然后在最终构造函数(最后一行)中,我们只创建并返回具有指定输入的模型,输出图层,但它如何知道我们想要的其他图层?
问题1):keras.engine.training.Model和keras.models.Model有什么区别?
问题2):当我们做new_layer = keras.layers.Dense(...)(prev_layer)时到底发生了什么?()操作是否返回新图层,它究竟做了什么?