我的任务是根据缺陷对种子进行分类。我有 7 个类的大约 14k 图像(它们的大小不相等,有些类有更多照片,有些类有更少)。我尝试从头开始训练 Inception V3,准确率约为 90%。然后我尝试使用带有 ImageNet 权重的预训练模型进行迁移学习。我inception_v3从applications没有顶级 fc 层的情况下导入,然后在文档中添加了我自己的层。我以以下代码结束:
# Setting dimensions
img_width = 454
img_height = 227
###########################
# PART 1 - Creating Model #
###########################
# Creating InceptionV3 model without Fully-Connected layers
base_model = InceptionV3(weights='imagenet', include_top=False, input_shape = (img_height, img_width, 3))
# Adding layers which will be fine-tunned
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(7, activation='softmax')(x)
# Creating final model
model = Model(inputs=base_model.input, outputs=predictions)
# …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Keras 中实现一个自定义层,我需要将浮点数张量转换[a, 1+a)为二进制张量以进行屏蔽。我可以看到 Tensorflow 有一个floor函数可以做到这一点,但 Keras 似乎没有在keras.backend. 知道我该怎么做吗?
我试图通过调用predict_proba()Keras 模型来生成班级分数,但似乎这个函数不存在!它是否已被弃用,因为我在 Google 中看到了一些示例?我正在使用 Keras 2.2.2。
我有一个带有多个输入的预训练模型,这些输入具有不同的形状。所以我可以在具有匹配形状的新输入上调用模型,如下所示:
new_output = model([input_1, input2])
Run Code Online (Sandbox Code Playgroud)
和
input_1.shape = (400, 200)
input_2.shape = (400, 200, 10)
Run Code Online (Sandbox Code Playgroud)
我想重用该模型以在数据系列上对其进行训练,因此我的新输入将具有以下形状:
input_1.shape = (100, 400, 200)
input_2.shape = (100, 400, 200, 10)
Run Code Online (Sandbox Code Playgroud)
为了重用模型,我想像这样使用TimeDistributedKeras 中的层:
output = TimeDistributed(model)([input_1, input_2])
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为TimeDistributed不接受列表作为输入。到目前为止,我发现的所有解决方法都是使用合并输入来解决这个问题,但这个解决方案在我的情况下不起作用,因为输入形状不同。
我也尝试使用这样的一些Lambda层:
lambda_0 = Lambda(lambda x: x)
lambda_1 = Lambda(lambda x: [TimeDistributed(lambda_0)(x[0]), TimeDistributed(lambda_0)(x[1])])([input_1, input_2])
output = model(lambda_1)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它只在模型TimeDistributed上使用lambda_0而不是在模型上使用。也许有一个带有Lambda包装器的解决方案可以解决这个问题,或者我必须定义一个自定义的 Keras 层,但目前我遇到了这个问题,所以我很感激任何帮助。
我的模型是一个简单的完全连接的网络,如下所示:
inp=Input(shape=(10,))
d=Dense(64, activation='relu')(inp)
d=Dense(128,activation='relu')(d)
d=Dense(256,activation='relu')(d) #want to give input here, layer3
d=Dense(512,activation='relu')(d)
d=Dense(1024,activation='relu')(d)
d=Dense(128,activation='linear')(d)
Run Code Online (Sandbox Code Playgroud)
因此,保存模型后,我想将输入提供给第3层。我现在正在做的是:
model=load_model('blah.h5') #above described network
print(temp_input.shape) #(16,256), which is equal to what I want to give
index=3
intermediate_layer_model = Model(inputs=temp_input,
outputs=model.output)
End_output = intermediate_layer_model.predict(temp_input)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,即我收到诸如不兼容输入之类的错误,输入应为元组等。错误消息为:
raise TypeError('`inputs` should be a list or tuple.')
TypeError: `inputs` should be a list or tuple.
Run Code Online (Sandbox Code Playgroud)
有什么办法可以让我在网络中间传递自己的输入并获取输出,而不是在开始时输入并从末尾获取输出?任何帮助将不胜感激。
为了对图像进行分类,我们使用具有几个卷积层和几个全连接层的神经网络。
元数据包含一些有助于对图像进行分类的数字信息。有没有一种简单的方法可以将数字元数据与卷积的输出一起输入到第一个全连接层?是否可以使用 TensorFlow 或更好的 Keras 来实现这一点?
我知道,从理论上讲,一批网络的损失只是所有单个损失的总和。这反映在用于计算总损耗的Keras代码中。相关的:
for i in range(len(self.outputs)):
if i in skip_target_indices:
continue
y_true = self.targets[i]
y_pred = self.outputs[i]
weighted_loss = weighted_losses[i]
sample_weight = sample_weights[i]
mask = masks[i]
loss_weight = loss_weights_list[i]
with K.name_scope(self.output_names[i] + '_loss'):
output_loss = weighted_loss(y_true, y_pred,
sample_weight, mask)
if len(self.outputs) > 1:
self.metrics_tensors.append(output_loss)
self.metrics_names.append(self.output_names[i] + '_loss')
if total_loss is None:
total_loss = loss_weight * output_loss
else:
total_loss += loss_weight * output_loss
Run Code Online (Sandbox Code Playgroud)
但是,我注意到,当我使用a batch_size=32和a 训练网络时batch_size=64,每个时期的损失值仍然或多或少地相同,只有a~0.05%有所不同。但是,两个网络的准确性都完全相同。因此,从本质上讲,批量大小对网络没有太大影响。
我的问题是,如果我将批处理量加倍,并假设损失确实在被累加,那么损失实际上不应该是以前的两倍,或者至少更大吗?精度保持不变的事实否定了网络可能以更大的批量学习得更好的借口。
无论批次大小如何,损失都大致相同,这一事实使我认为这是平均水平。
我正在用Keras进行二进制分类
loss='binary_crossentropy',optimizer=tf.keras.optimizers.Adam最后一层是keras.layers.Dense(1, activation=tf.nn.sigmoid)。
据我所知,loss价值是在训练阶段用来评估模型的。但是,当我Keras对测试数据集使用模型评估时(例如m_recall.evaluate(testData,testLabel),也有一些loss值,并附带accuracy以下输出所示的值)
test size: (1889, 18525)
1889/1889 [==============================] - 1s 345us/step
m_acc: [0.5690245978371045, 0.9523557437797776]
1889/1889 [==============================] - 1s 352us/step
m_recall: [0.24519687695911097, 0.9359449444150344]
1889/1889 [==============================] - 1s 350us/step
m_f1: [0.502442331737344, 0.9216516675489677]
1889/1889 [==============================] - 1s 360us/step
metric name: ['loss', 'acc']
Run Code Online (Sandbox Code Playgroud)
loss测试期间的意义/用途是什么?为什么它是如此之高(如0.5690在m_acc)?准确度评估对我来说似乎不错(例如,0.9523在中m_acc),但我也很担心loss,这是否会使我的模型表现不佳?
PS
m_acc,m_recall等等都只是我的名字我的模型的方法(它们是由不同的指标受训GridSearchCV)
更新:
我只是意识到loss …
我正在创建自定义的激活功能,尤其是RBF激活功能:
from keras import backend as K
from keras.layers import Lambda
l2_norm = lambda a,b: K.sqrt(K.sum(K.pow((a-b),2), axis=0, keepdims=True))
def rbf2(x):
X = #here i need inputs that I receive from previous layer
Y = # here I need weights that I should apply for this layer
l2 = l2_norm(X,Y)
res = K.exp(-1 * gamma * K.pow(l2,2))
return res
Run Code Online (Sandbox Code Playgroud)
该函数rbf2接收上一层作为输入:
#some keras layers
model.add(Dense(84, activation='tanh')) #layer1
model.add(Dense(10, activation = rbf2)) #layer2
Run Code Online (Sandbox Code Playgroud)
我应该怎么做才能获得输入layer1和权重layer2以创建定制的激活功能?
我实际上想做的是为LeNet5神经网络实现输出层。LeNet-5的输出层有点特殊,而不是计算输入和权重向量的点积,每个神经元输出其输入向量与其权重向量之间的欧几里得距离的平方。
例如,layer1 …
python machine-learning conv-neural-network keras activation-function
我正在 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) keras ×10
python ×8
tensorflow ×5
keras-layer ×3
floor ×1
loss ×1
lstm ×1
probability ×1
time-series ×1